我正在一個文檔中存儲一個大的二進制數組。我希望不斷地向這個數組添加字節,有時會改變現有字節的值。如何在Mongodb中有效地存儲和更新二進制數據?
我正在尋找一些$ append_bytes和$ replace_bytes類型的修飾符,但它似乎是我能做的最好的$推數組。如果我以某種方式訪問磁盤上的底層bson,似乎可以通過執行seek-write類型的操作來實現,但是在我看來,在mongodb中並沒有這樣做(也許是出於很好的理由)。
如果我只是查詢這個二進制數組,編輯或添加到它,然後通過重寫整個字段來更新文檔,這將是多麼昂貴?每個二進制數組的大小約爲1-2MB,並且更新每5分鐘發生一次,並跨越1000個文檔。更糟糕的是,還沒有簡單的方法將它們分散出去(時間上),它們通常會以5分鐘的時間間隔接近彼此。有沒有人有這樣的災難會有一個良好的感覺?似乎它會有問題。
另一種方法是將這個二進制數據作爲單獨的文件存儲在磁盤上,實現一個線程池來高效地處理磁盤上的文件,並引用我的mongodb文檔中的文件名。 (我使用python和pymongo,所以我在看pytables)。如果可能,我寧願避免這種情況。
我在這裏忽略了其他的選擇嗎?
感謝advnace。
編輯
一些工作,寫我的使用情況下,一些測試中,我已經決定使用一個單獨的文件系統的二進制數據對象(特別是HDF5使用或者pytables或h5py)之後。除了這些二進制數據對象的持久性,我仍然會使用mongo。以這種方式,我可以將與追加和更新類型操作相關的性能從我的基本mongo性能中分離出來。
其中一位mongo開發人員指出,我可以使用點符號和$ set設置內部數組元素(請參見下面的註釋中的ref),但目前沒有辦法在數組中執行一系列的設置原子。另外 - 如果我的mongo文檔中有1,000個2MB的二進制數據字段,並且我經常更新和增長它們(至少每5分鐘一次) - 我的直覺告訴我mongo將不得不以在磁盤上管理其文件中的大量分配/增長問題 - 並最終導致性能問題。我寧願將它加載到操作系統級別的單獨文件系統來處理。
最後 - 我將操縱和使用numpy對我的數據執行計算 - pytables和h5py模塊都允許numpy行爲和商店之間的良好集成。
它是由,你可以訪問使用$用點符號設置單獨的數組元素MongoDB的開發者之一隻是提醒我注意
When to use GridFS可能是有用的。我忽略了這一點。該裁判是在:http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman