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.
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