Pandas als schneller Datenspeicher für die Flask-Anwendung

8

Ich bin beeindruckt von der Geschwindigkeit der Ausführung von Transformationen, dem Laden von Daten und der Benutzerfreundlichkeit von Pandas und möchte all diese netten Eigenschaften (ua) nutzen, um einige große Datensätze (~ 100-200k Zeilen) zu modellieren , & lt; 20 Spalten). Ziel ist es, mit den Daten einiger Rechnerknoten zu arbeiten, aber auch eine Sicht auf die Datensätze in einem Browser über Flask bereitzustellen.

Ich verwende derzeit eine Postgres-Datenbank, um die Daten zu speichern, aber der Import (aus CSV-Dateien) der Daten ist langsam, langwierig und fehleranfällig und es ist nicht viel einfacher, die Daten aus der Datenbank zu holen und zu verarbeiten . 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 zu speichern (im hdf5-Format gespeichert und über Pytables geladen).

Die Frage ist:

(1) Ist das eine gute Idee und worauf sollten Sie achten? (Zum Beispiel erwarte ich keine Nebenläufigkeitsprobleme, da DataFrame s (sollte?) Staatenlos und unveränderlich sein sollten (von der Anwenderseite aus erledigt)). Was muss noch beachtet werden?

(2) Wie würde ich die Daten nach dem Laden aus der hdf5-Datei in ein DataFrame zwischenspeichern, damit sie nicht für jede Client-Anfrage geladen werden muss (mindestens die neuesten / häufigsten Datenfelder)? . 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?).

Mir ist klar, dass dies viele Fragen sind, aber bevor ich mehr Zeit investiere und einen Machbarkeitsnachweis erstellen würde, dachte ich, ich bekomme hier ein Feedback. Alle Gedanken sind willkommen.

    
orange 09.07.2014, 02:59
quelle

1 Antwort

3

Antworten auf einige Aspekte dessen, was du verlangst:

Es ist nicht ganz klar aus Ihrer Beschreibung, ob Sie nur die Tabellen in Ihrer SQL-Datenbank haben, die als HDF5-Dateien oder beides gespeichert sind. 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, indem Sie read_sql zum Beispiel.

Wenn Sie keine relationalen Operationen benötigen, würde ich sagen, dass Sie den Postgre-Server, wenn er bereits eingerichtet ist und Sie in Zukunft den SQL-Server verwenden müssen, abziehen müssen. 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 mehrere Dateien zu verwalten.

Ganz gleich, wie du gehst, Flask-Cache ist dein Freund, 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. Wichtig ist, dass Sie auch Vorlagen zwischenspeichern können, die bei der Anzeige großer Tabellen eine Rolle spielen können.

Sie könnten natürlich auch eine globale Variable generieren, zum Beispiel wenn 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.

    
Midnighter 10.07.2014 13:13
quelle