2012-06-17 8 views
9

Ich speichere ein großes binäres Array in einem Dokument. Ich möchte fortlaufend Bytes zu diesem Array hinzufügen und manchmal den Wert von vorhandenen Bytes ändern.Wie effizient Binärdaten in Mongodb zu speichern und zu aktualisieren?

Ich war auf der Suche nach einigen $ append_bytes und $ replace_bytes Art von Modifikatoren, aber es scheint, dass das Beste, was ich tun kann, $ push für 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 nur dieses binäre Array abfragen, bearbeiten oder hinzufügen und das Dokument dann aktualisieren würde, indem ich das gesamte Feld umschreibe, wie teuer wird das sein? 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? Es scheint, als wäre es problematisch.

Eine Alternative wäre, diese Binärdaten als separate Dateien auf der Festplatte zu speichern, einen Threadpool 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 es jedoch lieber vermeiden, wenn möglich.

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

Danke in advnace.

EDIT

Nach einiger Arbeit einige Tests für meine Anwendungsfälle zu schreiben habe ich beschlossen, ein separates Dateisystem für die binären Datenobjekte zu verwenden (insbesondere hdf5 entweder pytables oder h5py verwenden). Ich werde immer noch Mongo für alles außer der Persistenz dieser binären Datenobjekte verwenden. Auf diese Weise kann ich die Leistung, die mit Operationen vom Typ "Anfügen" und "Aktualisieren" 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 in Kommentar unten), aber es gibt derzeit keine Möglichkeit, eine Reihe von Mengen in einem Array zu tun atomar.

Darüber hinaus - wenn ich 1.000s 2MB binäre Datenfelder in meinen Mongo-Dokumenten habe und ich sie ständig aktualisiere und anwachsen lasse (wie in mindestens alle 5 Minuten) - sagt mir mein Bauch, dass Mongo muss Verwalten Sie eine Menge von Zuordnungs-/Wachstumsproblemen innerhalb ihrer Datei (en) auf der Festplatte - und dies führt letztendlich zu Leistungsproblemen. Ich würde es lieber auf ein anderes Dateisystem auf OS-Ebene laden, um damit umzugehen.

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 Verhalten und dem Speicher.

+0

Es wurde nur von einem der mongodb Entwickler darauf aufmerksam gemacht, dass Sie $ gesetzt mit Punktnotation einzelnen Array-Elemente zugreifen können. Ich habe das übersehen. Der Verweis ist unter: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman

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.

When to use GridFS könnte nützlich sein, um Sie

+1

Ich schaute in GridFS ...Dateien werden in die Sammlung put() gestellt und es wird automatisch in Chunks verteilt. Es schien auch, dass, wenn ich etwas ändern muss - ich dann wieder() setzen muss - was wiederum eine ganze Menge von Stücken speichert. Es scheint für Versionierung Dateien erstellt werden, die nicht so häufig ändern. In meinem Fall hätte ich also eine riesige Anzahl von Kopien der Datei. Es sei denn, es speichert irgendwie Änderungen durch diff irgendwie - aber nichts von der Dokumentation, die ich sah, schlug so vor ... – Rocketman

+0

Yeah, das Aktualisieren existierender Chucks wäre ein unerträglicher Kopfschmerz. Stattdessen möchten Sie im Allgemeinen dieses Muster folgen: 1.) finden Sie alte, behalten Sie die _id 2.) neue hinzufügen 3.) entfernen alte durch _id –

+0

http://stackoverflow.com/questions/6280186/append-data-to-existing-gridfs-Datei, siehe hierzu –

Verwandte Themen