2012-06-17 47 views
9

我正在一個文檔中存儲一個大的二進制數組。我希望不斷地向這個數組添加字節,有時會改變現有字節的值。如何在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行爲和商店之間的良好集成。

+0

它是由,你可以訪問使用$用點符號設置單獨的數組元素MongoDB的開發者之一隻是提醒我注意

When to use GridFS可能是有用的。我忽略了這一點。該裁判是在:http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman

回答

4

正如你所提到的,你經常編輯你的二進制數據,事實上很頻繁。 GridFS是我會建議的另一個選項。你

+1

我看着GridFS ...文件被放入()到集合中,並且它負責自動分塊。它也似乎是,如果我需要改變一些東西 - 然後我需要再次放(),這節省了另一整組塊。它似乎是爲不經常更改的版本控制文件而構建的。所以在我的情況下,我會有大量的文件副本。除非它通過某種方式以某種方式存儲更改 - 但我看到的文檔都沒有提示如此... – Rocketman

+0

是的,實際上更新現有的卡盤將是難以忍受的頭痛。相反,一般你想要遵循這種模式: 1.)找到舊的,保留_id 2.)添加新的 3.)刪除舊的_id –

+0

http://stackoverflow.com/questions/6280186/append-data-to-existing-gridfs-file,看看這個 –

相關問題