Sollte ich eine Datenbank verwenden, um große Mengen an Ergebnissen zu verarbeiten?

8

Hintergrund:

Ich führe derzeit eine große Anzahl von Parametervariationsexperimenten durch. Sie werden in Python 2.6+ mit numpy ausgeführt. Diese Experimente werden ungefähr 2 Wochen dauern.

Ich variiere ungefähr 3 Parameter (unabhängige Variablen) über einen Wertebereich. Ich behebe 6 weitere unabhängige Variablen (vorerst) Ich berichte über 4 abhängige Variablen.

Einer der Parameter, die ich verändere, ist die Verteilung auf mehrere Prozesse (und Computer). Für jeden dieser Parameter generiere ich eine separate csvDatei, wobei jede Zeile die Werte aller Variablen enthält (einschließlich unabhängig, fest und abhängig). Bei allen Variationen werden voraussichtlich etwa 80.000 Datenzeilen generiert

Die meiste Zeit betrachte ich nur den Wert einer der abhängigen Variablen, aber ich behalte die anderen bei, da sie erklären können, was passiert, wenn etwas Unerwartetes passiert.

In einer früheren Version dieses Experiments, bei der nur zwei Parameter (jeweils nur zwei Werte) berücksichtigt wurden, habe ich diese csvDatei in ein Tabellenkalkulationsprogramm kopiert und eine Reihe von Kopien eingefügt, um eine Tabelle mit nur der abhängigen Variablen zu erstellen, an der ich interessiert war Ich mache einige unangenehme Dinge in MS-Excel, damit ich nach Formeln sortieren kann. Dies war schmerzhaft genug für die 6 Versuchsergebnisse, die ich hatte. Bis dieser Lauf beendet ist, werde ich 2 Größenordnungen mehr Ergebnisse haben.

Frage:

Ich dachte, wenn ich fertig bin, könnte ich alle Ergebnisse aus den csvDateien in eine Datenbank kopieren und die Teile abfragen, die interessant sind. Nehmen Sie diese Ergebnisse und legen Sie sie zur Analyse in eine Tabelle. Erstellen von Diagrammen, Finden von Ergebnissen im Verhältnis zu den Kontrollergebnissen usw.

Denke ich in die richtige Richtung? (Tun das die Leute?)

Meine Datenbank foo ist heutzutage ziemlich verrostet, selbst wenn es gut war, habe ich MS-Access verwendet. Ich wollte auch dafür MS-Access verwenden.

Lyndon White
quelle

Antworten:

8

Ich würde vorschlagen, dass eine vollständige Datenbank für Ihre Zwecke möglicherweise übertrieben ist, obwohl dies sicherlich funktionieren würde. Selbst Zeilen sollten nicht mehr als 25 MB Daten enthalten.5105

Ich würde dringend empfehlen, die Analyse / das Plotten / usw. mit demselben Tool durchzuführen, mit dem Sie Ihre Daten abfragen. Ich habe die Erfahrung gemacht, dass es viel einfacher ist, Ihre Daten optimal zu nutzen, wenn das Ändern der zu analysierenden Daten nur eine Codezeile ändert und 2 Sekunden wartet. Das Einfügen von Kopien ist ebenfalls sehr fehleranfällig. Ich habe mehrere Menschen am Punkt der Verzweiflung gesehen, weil ihre Daten keinen Sinn ergaben, nur um festzustellen, dass sie beim Kopieren von Daten in ihr Excel-Blatt einen Fehler gemacht haben.

Wenn Sie mit Python überhaupt vertraut sind, würde ich die Verwendung von Pandas oder (wenn Sie mehr Daten haben, als Sie in den Speicher passen können) Pytables empfehlen , die Ihnen alle Vorteile einer Datenbank (einschließlich Geschwindigkeit) bieten. Pandas verfügt über viele nützliche Funktionen zum Zeichnen und Analysieren von Daten, und Sie hätten auch den vollständigen wissenschaftlichen Python-Stack. In diesem Ipython-Notizbuch finden Sie ein Beispiel für die Verwendung von Pandas.

Ich glaube, es gibt ähnliche Tools für R sowie kommerzielle Software wie Matlab oder Stata.

HDF5 ist eine gute generische Methode zum Speichern der Daten anfangs und bietet eine gute Bibliotheksunterstützung in vielen Sprachen.

LKlevin
quelle
Ich muss meine Daten separat analysieren und generieren. Die Generierung meiner Daten wird ungefähr 2 Wochen dauern. Ändert dies etwas an Ihrer Antwort?
Lyndon White
Entschuldigung, ich war unklar. Ich meine, dass das Tool, mit dem Sie Ihre Daten abfragen, dasselbe sein sollte, das Ihre Analyse und Ihre Diagramme ausführt. Es ist ein großer Vorteil, alles durch einfaches Ausführen von 1 Skript wiederholen zu können. Ich würde die Daten in hdf5 speichern, aber wenn Sie eine SQLite-Datenbank bevorzugen (wie Geoff vorgeschlagen hat), können Sie dies auch mit SQLAlchemy in Python lesen.
LKlevin
Ah richtig, das macht mehr Sinn. Und Sie befürworten auch eine programmatische und wiederholbare Analyse
Lyndon White
Ja! Beantwortung der Frage "Wie genau habe ich die Analyse für die Daten in diesem Diagramm durchgeführt?" ist viel einfacher, wenn Sie sich nur das Skript ansehen können, das die ganze Sache macht.
LKlevin
Nachdem ich mit der Analyse mit Pandas begonnen habe, kann ich diese Antwort akzeptieren.
Lyndon White
5

Ich empfehle dringend, dafür ein Tool wie Sumatra zu verwenden. Früher hatte ich einen ähnlichen "Fußgänger" -Ansatz wie Sie, um viele Simulationsläufe mit unterschiedlichen Parametern zu verfolgen, aber am Ende wird es einfach zu einem großen Durcheinander, weil es so gut wie unmöglich ist, einen solchen Ad-hoc-Ansatz im Voraus richtig zu entwerfen Erwarten Sie alle erforderlichen Anwendungsfälle und Erweiterungen (z. B. was passiert, wenn Sie einen zusätzlichen Parameter einführen müssen).

Sumatra verfolgt alle Ihre Simulationsläufe und speichert sie in einer Datenbank, die später (mithilfe der Python-API) abgefragt werden kann, um die Datensätze zu filtern und zu analysieren, an denen Sie interessiert sind. Es ist sehr flexibel und erfordert Ihnen keinen Workflow. was ich ein großes Plus finde. Außerdem verfügt es über eine Weboberfläche, mit der Sie schnell Ergebnisse durchsuchen (oder generierte Dateien überprüfen / herunterladen) können, was äußerst nützlich ist. Die Standarddatenbank verwendet SQLite und ich könnte mir vorstellen, dass es etwas langsam wird, wenn Sie damit mehr als 80.000 Simulationsergebnisse speichern. Es gibt ein PostgreSQL-Backend, aber ich habe es noch nie verwendet, kann also nicht für seine Leistung bürgen.

Ich sollte sagen, dass es sich noch in einem frühen Entwicklungsstadium befindet und ein paar Dinge fehlen, aber ich habe es im letzten Jahr für so ziemlich alle meine Simulationen verwendet und es hat meinen Tag so oft gerettet, dass ich es mir nicht vorstellen konnte was ich ohne es tun würde. Persönlich habe ich es nie für Berechnungen auf verschiedenen Computern (oder in einem Cluster) verwendet, aber ich denke, es unterstützt diese Art von Workflow. Fragen Sie auf der Mailingliste, ob Sie sich nicht sicher sind oder nicht genau das finden, was Sie brauchen. Es handelt sich um eine kleine, aber sehr freundliche und hilfreiche Community.

Rufen Sie mich an, wenn Sie daran interessiert sind, und ich teile Ihnen gerne meinen Workflow- und Boilerplate-Code mit, um Sie zum Laufen zu bringen (oder nur zur Inspiration).

Für die eigentliche Datenanalyse stimme ich LKlevin zu, dass Pandas und das IPython-Notizbuch äußerst nützliche Werkzeuge sind (Sumatra ermöglicht es Ihnen, die Datensätze in Pandas zu importieren, obwohl dies im Moment etwas ist, aber ich bin mir sicher, dass dies der Fall sein wird bald verbessert werden). Ich könnte mir auch vorstellen, dass das Speichern von Daten / Simulationsergebnissen im HDF5-Format nützlich sein könnte. In diesem Fall ist pytables ein gutes Werkzeug in der Toolbox. (Ich erinnere mich anscheinend, dass die Unterstützung für HDF5 in Sumatra geplant ist, aber ich kann die Informationen derzeit nicht finden und bin mir nicht sicher, ob dies noch implementiert ist.)

Schließlich bin ich mir sicher, dass es andere Tools gibt, die bei solchen Aufgaben helfen (siehe die "kurze Liste" auf dieser Präsentationsfolie ). Aber ich persönlich habe keines davon ausprobiert, weil ich mit der Funktionalität und Flexibilität, die Sumatra bietet, sehr zufrieden war.

cilix
quelle
1

Ja, Sie können alle Ergebnisse in einer Datenbank speichern, und einige Benutzer entscheiden sich für die Verwendung von Datenbanken. Ich musste mich noch nicht mit Situationen befassen, in denen Datenbanken verwendet wurden, aber ich habe in Workshops unterrichtet, in denen andere Ausbilder über die Verwendung von Datenbanken zum Sammeln von Daten unterrichten. Für Datenbanken, die meines Wissens nicht massiv sind, spielt die zugrunde liegende Technologie keine große Rolle. Mein Co-Instruktor hat SQLite3 verwendet. Es ist einfach unter Linux zu installieren, gehört zum Standard in OS X und ich glaube, es ist für Windows verfügbar.

Es ist möglich, über ein Terminal unter OS X und Linux auf SQLite-Datenbanken zuzugreifen. Ich bin nicht sicher, wie es unter Windows gemacht wird. Es ist auch möglich, Python-Pakete zu nutzen, um programmgesteuert aus Ihrer Datenbank zu lesen und in diese zu schreiben, beispielsweise mithilfe des sqlite3-Pakets in der Python-Standardbibliothek.

Wenn Ihre Datenmengen sehr groß werden, sind andere Datenbankimplementierungen besser, und an diesem Punkt möchten Sie wahrscheinlich einen Datenbankspezialisten konsultieren.

Geoff Oxberry
quelle
1

Wenn alle Ihre Daten bequem in den Speicher passen (z. B. unter 1 GB, sodass Sie einen Spielraum für die Analyse haben), ist eine Datenbank zu viel des Guten. Sie können einfach die gesamte Datei im Speicher lesen und die gewünschten Teile auswählen. Wenn Ihre Daten jedoch zu wachsen beginnen (oder möglicherweise zu groß werden könnten), kann Ihnen eine Datenbank schnelle und einfache Abfragen anbieten ( "Geben Sie mir alle Geschwindigkeiten an, für die die Energie genau 2 und die Temperatur größer als 27 war". ).

Ein weiteres Thema ist die Generierung von Daten. Da Ihre Daten zwei Wochen dauern, gehe ich davon aus, dass Sie sie parallel auf einem Computercluster generieren. Das Festlegen einer Datenbank für das parallele Schreiben ist komplex und kann den Prozess möglicherweise verlangsamen, da Daten übertragen werden und Sperren vorhanden sind. Da Sie nur einmal schreiben müssen, können Sie dafür sorgen, dass jeder Prozess seine eigene temporäre Textdatei generiert, die Ergebnisse dort schreibt und diese von einem zentralen Prozess lesen und in einer Master-Datenbank speichern. Im einfachsten Fall kann dieses Skript einfach sein catund das Ergebnis als einfachen Text speichern.

Nehmen wir nun an, Sie möchten eine Datenbank verwenden. Wenn Ihr Anwendungsfall etwas fortgeschrittener ist als eine Textdatei (was Sie tun würden, wenn Sie eine CSV mit Numpy geladen hätten), empfehle ich HDF5 über PyTables. Es ist schnell, einfach einzurichten, Numpy-fähig und verfügt über eine Reihe erweiterter Funktionen, wenn Sie Dinge optimieren möchten. Es unterstützt auch das Komprimieren, Abfragen und Speichern von Arrays. Es ist auch einfach unter Linux, Windows und Mac zu installieren. HDF5-Datenlayout sind nichts anderes als Tabellen wie eine Tabelle. Die resultierende .h5Datei kann aus vielen Computersprachen gelesen werden, wenn die richtige Bibliothek installiert ist.

Auf der anderen Seite haben Sie SQL. Sie haben eine in Pythons stdlib, also hätten Sie sie bereits installiert, aber sie ist nicht sehr gut für numerische Arbeiten geeignet (Sie können beispielsweise Numpy-Arrays nicht so einfach speichern und wiederherstellen). Dies ist die beste Option, wenn Sie Dritte benötigen, um eine Schnittstelle aus anderen Sprachen herzustellen, da dies sehr bekannt ist und es Wrapper für fast jede Sprache gibt, von denen viele standardmäßig verwendet werden.

Davidmh
quelle