2014-10-17 88 views
0

可能嗎?如果是的話那麼如何?在MongoDB中批量插入GridFS

目前,我將字符串> 16MB逐個插入到GridFS中,但是在處理不與1個字符串但與數千個字符時處理非常緩慢。我試圖檢查文檔,但沒有找到關於批量插入到GridFS存儲的一行,而不僅僅是簡單的集合。

我使用PyMongo與MongoDB進行通信。

+0

我會建議不要使用gridfs存儲,但你有什麼嘗試?爲什麼網格是一個需求? – 2014-10-17 16:07:20

+0

限制每個文檔16MB不允許使用基本集合。分裂文件是更復雜的事情,因爲我希望它能夠快速工作,而不需要額外的連接工作(基本上mongodb應該被用來擺脫這個任務+速度)。 – dimon222 2014-10-17 16:16:53

+0

我看不出爲什麼不把文件放在靜態存儲器中。這些字符串的內容是什麼?爲什麼他們需要在數據庫中而不是在靜態存儲中? – 2014-10-17 16:24:10

回答

0

我閱讀並研究了所有的答案,但不幸的是他們沒有達到我的要求。我需要用來在GridFS中指定jsons的_id的數據實際上存儲在JSON本身內部。這聽起來像是最糟糕的想法,包括冗餘等,但不幸的是它的要求。 我所做的是我寫插入線程爲多處理插入到GridFS和插入所有數據與多個線程(2 GridFS線程足以獲得適當的性能)。

0

16MB文檔大小限制也是對數據庫批量插入的限制(請參閱驅動程序規範中的request size limits)。批量插入文檔的方法通常只是把東西分成塊(基本上是巨大的文檔數組)並將它們發送到數據庫。你可以通過在shell中自己創建大量文檔和doing an insert來手動嘗試,但上限仍然在那裏。

當使用GridFS時,用於分割存儲文件的塊大小爲255/256k(因爲this 2.4.10 change和關聯的驅動程序更改,因此默認爲255k),因此您理論上可以在單個消息中適合大約64個塊到服務器,但確定如何從故障中恢復可能會很棘手。您也可以配置該塊大小,這可能是一個更好的選擇,請參閱chunkSize上的pymongo reference,但您需要再次保持在16MB的限制以下。

+0

謝謝,我不知道大容量插入的限制,但是,如果有一個過程,的問題是在批量插入或1000個單行插入時需要1000次插入,我可以批量插入到集合中,但是爲什麼我不能批量插入到GridFS中,即使它會在塊之前/之後塊化過程中,我仍然希望使用批量插入(多插入)的速度優勢來發送瘋狂的單張插入。默認情況下它就是這樣 - 集合包含4個屬性,其中一個是json文件,它可以輕鬆超過16MB。因此,將json存儲在gridFS中,然後將其密鑰插入到集合中。 – dimon222 2014-10-17 18:03:40

+0

所以如果我想插入1000行,我必須做1000個json插入到gridFS中,然後在集合中插入1000行。當行數增長到10000行甚至100000行時,單行插入很慢,因此插入一個批量查詢將是最好的選擇,但對於gridFS,我根本沒有看到這樣的選項,但它以某種方式呈現集合,甚至沒有談論組塊。問題是如何做「多重插入」以避免浪費資源和時間。順便說一句,你的驅動程序規範鏈接不工作(私人回購?)。 – dimon222 2014-10-17 18:07:07

1

如果你有他們的文件,某事像

for $LETTER in {a..z} 
do 
    (find /path/to/basedir -iname "$LETTER*" -exec mongofiles -d yourGrid '{}' \; &) 
done 

應該給你26個線程推數據到MonoDB。

完成後,根據需要重命名yourGrid.fs集合。

爲了確保沒有任何東西被破壞,您應該在屏幕實用程序中運行此命令或將其從終端中分離。

+0

不幸的是,我把它們放在一個文件中。每行都是單個JSON。 – dimon222 2014-10-20 13:27:13

+0

簡單任務:'LINES = \'wc -l yourbig.json \'split -l $(($ LINES/26))yourbig.json'並更改原始腳本:'-iname「x $ LETTER *」' – 2014-10-20 14:10:43

+0

看起來像這樣,我將無法爲GridFS文件指定我自己的_id。但是,猜測,多處理是唯一的方法。我希望有一種方法可以在集合中插入> 16MB json,並且後端可以自行完成所有功能,併爲完整的json選擇提供api。 – dimon222 2014-10-20 14:41:02