Wie speichere und aktualisiere ich Binärdaten in Mongodb effizient?

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

Ich habe nach Modifikatoren vom Typ $ append_bytes und $ replace_bytes gesucht, aber anscheinend ist $ push für Arrays das Beste, was ich tun kann. Es scheint so, als ob dies durch Ausführen von Schreibsuchoperationen machbar wäre, wenn ich irgendwie Zugriff auf das zugrunde liegende Bson auf der Festplatte hätte, aber es scheint mir nicht, dass es sowieso gibt, dies in Mongodb zu tun (und wahrscheinlich aus gutem Grund).

Wenn ich stattdessen nur dieses binäre Array abfragen, bearbeiten oder hinzufügen und dann das Dokument aktualisieren würde, indem ich das gesamte Feld neu schreibe, wie teuer wäre das? Jedes binäre Array hat eine Größe von 1 bis 2 MB, und Aktualisierungen erfolgen alle 5 Minuten und über 1000 Dokumente hinweg. Schlimmer noch, es gibt keine einfache Möglichkeit, diese (rechtzeitig) zu verbreiten, und sie werden normalerweise in Abständen von 5 Minuten nahe beieinander stattfinden. Hat jemand ein gutes Gefühl dafür, wie katastrophal dies sein wird? Scheint problematisch zu sein.

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 auf den Dateinamen aus meinem Mongodb-Dokument zu verweisen. (Ich benutze Python und Pymongo, also habe ich mir Pytables angesehen). Ich würde es jedoch vorziehen, dies zu vermeiden, wenn dies möglich ist.

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

Vielen Dank im Voraus.

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 entweder pytables oder h5py). Ich werde Mongo weiterhin für alles verwenden, außer für die Persistenz dieser binären Datenobjekte. Auf diese Weise kann ich die Leistung in Bezug auf Operationen zum Anhängen und Aktualisieren von der Leistung meines Basismongos entkoppeln.

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

Wenn ich in meinen Mongo-Dokumenten 1.000 binäre 2-MB-Datenfelder habe und diese regelmäßig aktualisiere und vergrößere (mindestens alle 5 Minuten), dann sagt mir mein Darm, dass Mongo eine Menge verwalten muss Zuordnungs- / Wachstumsprobleme in den Dateien auf der Festplatte - und das führt letztendlich zu Leistungsproblemen. Ich würde das lieber auf ein separates Dateisystem auf Betriebssystemebene auslagern, um damit umzugehen.

Schließlich - Ich bearbeite und berechne meine Daten mit numpy - ermöglichen sowohl die pytables- als auch die h5py-Module eine gute Integration zwischen numpy-Verhalten und dem Geschäft.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage