Wie können Binärdaten in Mongodb effizient gespeichert und aktualisiert werden?

9

Ich speichere ein großes binäres Array in einem Dokument. Ich möchte diesem Array fortlaufend Bytes hinzufügen und manchmal den Wert bestehender Bytes ändern.

Ich habe nach einigen $ append_bytes und $ replace_bytes Typen von Modifikatoren gesucht, aber es scheint, dass das Beste, was ich tun kann, $ push for arrays ist. Es scheint so, als wäre dies machbar, indem man Operationen vom Typ "Suchen-Schreiben" ausführt, wenn ich irgendwie Zugriff auf das zugrundeliegende bson auf der Platte hatte, aber es scheint mir nicht, dass es das in mongodb (und wahrscheinlich aus gutem Grund) gibt.

Wenn ich stattdessen dieses binäre Array nur abfragen, bearbeiten oder hinzufügen und das Dokument dann durch Neuschreiben des gesamten Feldes aktualisieren würde, wie teuer wäre das? Jedes Binärarray wird in der Größenordnung von 1-2 MB liegen, und Aktualisierungen erfolgen einmal alle 5 Minuten und über Tausende von Dokumenten. Schlimmer noch, aber es gibt keinen einfachen Weg, diese (in der Zeit) zu verbreiten, und sie werden normalerweise in Abständen von 5 Minuten nahe beieinander auftreten. Hat jemand ein gutes Gefühl dafür, wie katastrophal das sein wird? Scheint so, als wäre es problematisch.

Eine Alternative wäre, diese Binärdaten als separate Dateien auf der Festplatte zu speichern, einen Thread-Pool zu implementieren, um die Dateien auf der Festplatte effizient zu bearbeiten, und den Dateinamen aus meinem mongodb-Dokument zu referenzieren. (Ich benutze Python und Pymongo, also habe ich Pytables betrachtet). Ich würde das jedoch möglichst vermeiden.

Gibt es eine andere Alternative, die ich hier übersehen habe?

Danke in der Beratung.

BEARBEITEN

Nachdem ich einige Tests für meine Anwendungsfälle geschrieben habe, habe ich mich entschieden, ein separates Dateisystem für die binären Datenobjekte zu verwenden (speziell hdf5 mit pytables oder h5py). Ich werde immer noch Mongo für alles außer der Persistenz dieser binären Datenobjekte verwenden. Auf diese Weise kann ich die Performance, die mit Append- und Update-Typ-Operationen verbunden ist, von meiner Basis-Mongo-Leistung entkoppeln.

Einer der Mongo-Entwickler hat darauf hingewiesen, dass ich interne Array-Elemente mit Punktnotation und $ set setzen kann (siehe ref im Kommentar unten), aber es gibt derzeit keine Möglichkeit, eine Reihe von Mengen in einem Array atomar zu machen .

Außerdem - wenn ich 1.000 von 2MB binären Datenfeldern in meinen Mongo-Dokumenten habe und ich sie ständig aktualisiere und anwachsen lasse (wie in mindestens alle 5 Minuten) - sagt mir mein Bauchgefühl, dass Mongo es schaffen wird Es gibt eine Menge Probleme bei der Zuordnung / Vergrößerung innerhalb der Datei (en) auf der Festplatte - und das führt letztendlich zu Leistungsproblemen. Ich würde das lieber auf ein anderes Dateisystem auf Betriebssystemebene laden.

Schließlich - ich manipuliere und führe die Berechnung meiner Daten mit numpy durch - sowohl die pytables als auch die h5py-Module erlauben eine gute Integration zwischen numpy behaviour und dem Store.

    
Rocketman 17.06.2012, 08:19
quelle

1 Antwort

4

Wie Sie erwähnt haben, bearbeiten Sie häufig Ihre Binärdaten, und zwar sehr häufig. GridFS ist eine andere Option, die ich vorschlagen würde.

Wann Sie GridFS verwenden sollten könnte Ihnen nützlich sein

>     
Ravi Khakhkhar 17.06.2012 09:12
quelle

Tags und Links