2014-07-09 9 views
8

Ich bin beeindruckt von der Geschwindigkeit der laufenden Transformationen, Ladedaten und Benutzerfreundlichkeit von Pandas und möchte all diese netten Eigenschaften (unter anderem) nutzen, um einige große Datensätze zu modellieren (~ 100-200k Zeilen, < 20 Spalten). Ziel ist es, mit den Daten einiger Rechnerknoten zu arbeiten, aber auch über Flask einen Blick auf die Datensätze in einem Browser zu ermöglichen.Pandas als schnelle Datenspeicher für Flask-Anwendung

Ich benutze derzeit eine Postgres-Datenbank, um die Daten zu speichern, aber der Import (aus csv-Dateien) der Daten ist langsam, mühsam und fehleranfällig und die Daten aus der Datenbank und die Verarbeitung ist nicht viel einfacher. Die Daten werden niemals nach dem Import geändert (keine CRUD-Operationen), daher dachte ich, dass es ideal ist, um es als mehrere Pandas DataFrame (im Format hdf5 gespeichert und über Pytables geladen) zu speichern.

Die Frage ist:

(1) Ist das eine gute Idee, und was sind die Dinge zu achten? (Ich erwarte zum Beispiel keine Nebenläufigkeitsprobleme, da DataFrame s (sollte?) Staatenlos und unveränderlich sein sollten (von der Anwendungsseite aus erledigt)). Worauf muss noch geachtet werden?

(2) Wie gehe ich vor, um die Daten nach dem Laden aus der hdf5-Datei in eine DataFrame zwischenzuspeichern, sodass sie nicht für jede Clientanforderung geladen werden muss (mindestens die neuesten/häufigsten Datenframes). Flask (oder werkzeug) hat eine SimpleCaching Klasse, aber intern werden die Daten gepickt und die zwischengespeicherten Daten beim Zugriff entfernt. Ich frage mich, ob dies in meinem speziellen Fall notwendig ist (vorausgesetzt, das zwischengespeicherte Objekt ist unveränderlich). Ist eine solche einfache Caching-Methode auch anwendbar, wenn das System mit Gunicorn bereitgestellt wird (ist es möglich, statische Daten (den Cache) zu haben und können gleichzeitige (unterschiedliche Prozesse?) Anfragen auf den gleichen Cache zugreifen?).

Ich weiß, das sind viele Fragen, aber bevor ich mehr Zeit investieren und einen Proof-of-Concept erstellen, dachte ich, ich bekomme hier ein Feedback. Irgendwelche Gedanken sind willkommen.

+0

Interessante Frage. Ich beschäftige mich auch mit großen Mengen schreibgeschützter Daten und frage mich oft nach einem schlanken und pragmatischen Ansatz. Kann ich dich fragen, mit wie vielen Aufzeichnungen du es zu tun hast? (Ich habe etwa 300 Millionen = ca. 4 GB Daten) – Hexatonic

+0

Es liegt im Bereich von Zehntausenden (vielleicht niedrigen 100.000 bei max). Ich habe mich mit hdf5 begnügt und bin sehr glücklich mit dieser Entscheidung und der Verwendung von Pandas (seit fast 2 Jahren). Das Gute an hdf5 und pytables ist, dass Sie Abfragen auf der Festplatte ausführen können, ohne die gesamte Datei zu laden. Mit meinem kleinen Datensatz hatte ich jedoch nie die Notwendigkeit, dies zu tun (in Ihrem Fall kann das anders sein). Ich war besonders beeindruckt von der E/A-Geschwindigkeit beim Lesen einer hdf5-Datei im Vergleich zu einer SQL-Abfrage. – orange

Antwort

3

Antworten auf einige Aspekte, was Sie fragen: nur

Es ist nicht ganz von Ihrer Beschreibung klar, ob die Tabellen in der SQL-Datenbank haben, als HDF5 Dateien oder beides gespeichert. Wenn Sie Python 2.x verwenden und die Dateien über die HDFStore-Klasse von Pandas erstellen, werden alle Zeichenfolgen ausgewählt, was zu ziemlich großen Dateien führt. Sie können Pandas DataFrames auch direkt aus SQL-Abfragen generieren, z. B. mit read_sql.

Wenn Sie keine relationalen Operationen benötigen, würde ich sagen, Graben Sie den Postgre-Server, wenn es bereits eingerichtet ist und Sie benötigen, dass in Zukunft weiterhin den SQL-Server verwenden. Das Schöne am Server ist, dass selbst wenn Sie keine Nebenläufigkeitsprobleme erwarten, diese automatisch mit (Flask-) SQLAlchemy behandelt werden, was Ihnen weniger Kopfschmerzen bereitet. Wenn Sie jemals mehr Tabellen (Dateien) hinzufügen möchten, ist es im Allgemeinen weniger problematisch, einen zentralen Datenbankserver zu haben, als wenn mehrere Dateien herumliegen.

Egal, wie Sie gehen, Flask-Cache wird Ihr Freund sein, entweder mit einem memcached oder einem redis Backend. Sie können dann die Funktion, die einen vorbereiteten DataFrame aus einer SQL- oder HDF5-Datei zurückgibt, zwischenspeichern/memoisieren. Darüber hinaus können Sie auch Vorlagen zwischenspeichern, die möglicherweise bei der Anzeige großer Tabellen eine Rolle spielen.

Sie könnten natürlich auch eine globale Variable generieren, zum Beispiel wo Sie die Flask App erstellen und diese einfach dort importieren, wo sie benötigt wird. Ich habe das nicht ausprobiert und würde es daher nicht empfehlen. Es kann alle Arten von Nebenläufigkeitsproblemen verursachen.

+0

Danke Midnighter. Das sind großartige Kommentare. Ich habe die Bulk-Daten in einer SQL-Datenbank, aber ich versuche, es herauszuziehen, da es zu viele Kopfschmerzen verursacht. Einige der anderen Daten können gleichzeitig geändert werden. Daher verwende ich weiterhin Postgres. Globale Variablen funktionierten nicht, als ich Gunicorn ausprobierte. Es scheint, dass jeder (asynchrone) Gunicorn-Arbeiter seinen eigenen Adressraum hat, also würde er auch seinen eigenen Cache verwalten (was nicht wirklich nützlich ist). – orange

+0

@orange Bis jetzt habe ich nur Apache für die Implementierung verwendet und dort musste ich zu einem Modell wechseln, wo ich nur einen Prozess verwende, aber viele Threads, da sonst Anfragen von demselben Benutzer von verschiedenen Prozessen behandelt wurden, die Probleme mit der Sitzung verursachten. Dem muss ich allerdings noch auf den Grund gehen. In diesem Fall sollte ein globales System funktionieren. Ich frage mich jedoch, was Sie Probleme bei der Arbeit mit SQL verursacht? Mit 'read_sql' können Sie sogar komplette Abfragen schreiben und diese einfach übergeben. – Midnighter

+1

Ich habe einige vorläufige Tests durchgeführt und festgestellt, dass 'read_sql' langsamer ist als das Laden der' HDF5' Datei von der Festplatte. Aber das größere Problem ist, dass ich (csv -> sql-Tabellen) die Massendaten importieren muss, was viel Zeit in Anspruch nimmt und auch ziemlich unpraktisch ist (ich muss entscheiden, welche Spalten zum Importzeitpunkt verwendet/importiert werden) im Quellformat (oder Konvertierung in 'HDF5') erlaubt mir, später Spalten zu betrachten). – orange

Verwandte Themen