2016-06-24 7 views
0

Teil eines Projekts, an dem ich beteiligt bin, besteht in der Entwicklung einer wissenschaftlichen Anwendung für den internen Gebrauch, die mit einer großen Sammlung von Dateien (ca. 20000) arbeitet 100 MB groß. Dateien werden mit Metainformationen begleitet, die zur Auswahl von Teilmengen des gesamten Satzes verwendet werden.Speichern von 100 MB-Dateien und effizienter Cross-Join-Operation in MongoDB oder anderen DB

aktualisierennachLesenAntwort Ja, Verarbeitung im einzelnen Serverraum befindet.

Die Anwendung wählt zwei Teilmengen dieser Dateien aus. Auf der ersten Stufe verarbeitet es jede Datei einzeln und unabhängig und ergibt bis zu 30 Elemente aus einer Datei für die zweite Stufe. Jeder resultierende Artikel wird ebenfalls in einer Datei gespeichert und die Dateigröße variiert zwischen 5 und 60 KB.

Auf der zweiten Stufe verarbeitet die App alle möglichen Ergebnispaare, die auf der ersten Stufe erzeugt wurden, wobei das erste Element eines Paares aus der ersten Teilmenge und das zweite - aus der zweiten - Kreuzverbindung oder Kartesisch stammt Produkt von zwei Sätzen.

Typische Anzahl der Elemente in der ersten Teilmenge ist Tausende, und in der zweiten - Zehntausende. Daher ist die Menge aller möglichen Paare in der zweiten Stufe Hunderte von Millionen.

Die typische Zeit für die Verarbeitung einer 100Mb-Datei mit einer einzigen Quelle beträgt etwa 1 Sekunde eines einzelnen Paars der Ergebnisse der ersten Stufe - Mikrosekunden. Die Anwendung ist nicht für die Echtzeitverarbeitung gedacht, ihr allgemeiner Anwendungsfall würde darin bestehen, einen Job zur Berechnung über Nacht einzureichen und Ergebnisse am Morgen zu erhalten.

Wir haben bereits eine Version einer Anwendung, die früher entwickelt wurde, als wir viel weniger Daten hatten. Es wird in Python entwickelt und verwendet Dateisystem- und Datenstrukturen aus der Python-Bibliothek. Die Berechnungen werden an 10 PCs durchgeführt, die mit einer selbst entwickelten Software verbunden sind, die mit Twisted geschrieben wurde. Dateien werden auf NAS und auf lokalen Laufwerken von PCs gespeichert. Jetzt funktioniert die App sehr schlecht, besonders auf der zweiten Stufe und danach, während der Aggregation der Ergebnisse.

Derzeit schaue ich MongoDB, um diese Aufgabe zu erfüllen. Allerdings habe ich nicht viel Erfahrung mit solchen Tools und offen für Vorschläge.

Ich habe einige Experimente mit MongoDB und PyMongo durchgeführt und festgestellt, dass das Laden der gesamten Datei aus der Datenbank ungefähr 10 Sekunden über das Gigabit-Ethernet dauert. Die minimale Chunk-Größe für die Verarbeitung beträgt ~ 3 MB und wird für 320 ms abgerufen. Das Laden von Dateien von einem lokalen Laufwerk ist schneller.

Die MongoDB-Konfiguration enthielt eine einzelne Zeile mit einem Pfad.

Sehr ansprechende Eigenschaft der Datenbank ist jedoch ihre Fähigkeit, Metainformationen zu speichern und die Suche danach zu unterstützen, sowie die automatische Replikation. Dies ist auch ein persistenter Datenspeicher, daher können die Berechnungen nach einem versehentlichen Stopp fortgesetzt werden (momentan müssen wir von vorne beginnen).

Also, meine Fragen sind.

Ist MongoDB die richtige Wahl? Wenn ja, was sind die Richtlinien für ein Datenmodell?

Kann die Abrufzeit für Dateien verbessert werden?

Oder ist es sinnvoll, Dateien in einem Dateisystem wie zuvor zu speichern und Pfade zu ihnen in der Datenbank zu speichern?

Die Erstellung einer Liste aller möglichen Paare für die 2. Stufe wurde im Client-Python-Code durchgeführt und dauerte auch ziemlich lange (ich habe es nicht gemessen).

Wird MongoDB Server besser?

Antwort

1

In diesem Fall Sie more here

für sharded gridfs als Teil von Mongo gehen könnten, die für schnelleren Dateiabrufprozess ermöglichen und noch Metadaten-Datei aufnehmen müssen zusammen.

andere Möglichkeit, zu beschleunigen, wenn nur Replikat-Set verwenden, ist eine Art Logic Balancer und erhalten Dateien einmal Master anderen Zeitform Slave (oder andere Slave in einem König von roundRobin Weg).

Speichern von Dateien im Dateisystem wird immer ein bisschen schneller und solange es um einen Serverraum geht (-> lokal verarbeitet) - Ich werde wahrscheinlich dabei bleiben, aber mit großer Sorge um die Sicherung.

+0

Vielen Dank für Ihre Antwort. Ich habe Details zum Cross-Join hinzugefügt. Könnten Sie sie bitte auch kommentieren? – wl2776

Verwandte Themen