Ich entwickle ein Monte-Carlo-Simulationssoftware-Paket, das mehrere Physik- und Simulatoren beinhaltet. Ich muss Online-Analyse durchführen, die Abhängigkeit abgeleiteter Daten von Rohdaten verfolgen und Abfragen wie "gebe mir die Wellenformen für Temperatur & gt; 400 und Position nahe (x0, y0)" durchführen. Das In-Memory-Datenmodell ist also ziemlich kompliziert.
Die Anwendung wird in Python geschrieben, wobei jedes Simulationsergebnis als Python-Objekt modelliert wird. In jeder Stunde erzeugt es ~ 100 Ergebnisse (Objekte). Die meisten Objekte haben schwere Daten (mehrere MB binäre numerische Array), sowie einige Lichtdaten (Temperatur, Position usw.). Die Gesamtdatenrate beträgt mehrere GB pro Stunde.
Ich brauche eine Lösung für die Datenpersistenz und eine einfach zu verwendende Abfrage-API. Ich habe mich bereits entschieden, die schweren Daten (numerisches Array) in HDF5-Speichern zu speichern. Ich erwäge, MongoDB für Objektpersistenz (nur Lichtdaten) und für die Indexierung der schweren Daten in HDF5 zu verwenden. Objektpersistenz mit MongoDB ist unkompliziert und die Abfrageoberfläche sieht ausreichend leistungsstark aus.
Ich kenne die Option sqlalchemy + sqlite. Das Streamen der schweren Daten zu HDF5 scheint jedoch in SqlAlchemy nicht natürlich unterstützt zu werden, und ein festes Schema ist umständlich.
Ich kenne diesen Beitrag ( Durchsuchen eines HDF5-Datensatzes ), aber die "Indextabelle" selbst benötigt einige In-Memory-Indizes für schnelle Abfrage.
Ich frage mich, ob es irgendwelche alternativen Lösungen gibt, die ich mir ansehen sollte, bevor ich hineinspringe? Oder gibt es irgendein Problem, das ich in meinem Plan übersehen habe?
TIA.
Einige Dinge, die Sie über Mongo wissen sollten, die für die von Ihnen beschriebene Situation von Bedeutung sein könnten und warum es sich gut eignet:
Ich muss Online-Analysen durchführen, die Abhängigkeit abgeleiteter Daten von Rohdaten verfolgen und Abfragen wie "Gib mir die Wellenformen für Temperatur & gt; 400 und Position nahe (x0, y0)" durchführen.
Mongo hat eine flexible Abfragesprache, die es sehr einfach macht, solche Abfragen auszuführen. Geospatial (2D) -Indizes werden ebenfalls unterstützt - und wenn Sie sehr häufig Abfragen zu Position und Temperatur durchführen müssen, können Sie einen zusammengesetzten Index für (Temperatur, Position) erstellen und so sicherstellen, dass die Abfrage immer gut abschneidet.
>Die meisten Objekte haben schwere Daten (mehrere MB eines binären numerischen Arrays) sowie einige Lichtdaten (Temperatur, Position usw.).
Jedes Dokument in MongoDB kann bis zu 16MB Daten aufnehmen, und ein binärer Feldtyp wird ebenfalls unterstützt. Daher wäre es relativ einfach, einige wenige Binärdateien in ein Feld einzubetten und durch Abfragen anderer Felder in der Datenbank abzurufen Daten. Wenn Sie mehr als 16 MB benötigen, können Sie auch die GridFS-API von mongodb verwenden, mit der Sie beliebig große Blobs von Binärdaten auf der Festplatte speichern und schnell abrufen können.
Die gesamte Datengenerierungsrate beträgt mehrere GB pro Stunde.
Für einen großen, schnell wachsenden Datensatz wie diesen können Sie ein Shard-Setup erstellen, mit dem Sie Server hinzufügen können, um die Größe anzupassen, unabhängig davon, wie groß sie ist.
Tags und Links python mongodb orm scientific-computing hdf5