2014-04-01 126 views
3

我正嘗試使用mongodb(Java編碼)創建大數據應用程序。我的收藏由普通文本文件組成。由於我不希望重複項和文檔的文本字段太大而無法創建唯一索引,因此我決定爲每個文檔的文本計算校驗和值(MessageDigest with MD5),將該字段保存在文檔中並在此處創建唯一索引領域。如何加快Mongodb插入?

大約在我的文檔具有類似的結構:

{ 
"_id": ObjectId('5336b4942c1a99c94275e1e6') 
"textval": "some long text" 
"checksum": "444066ed458746374238266cb9dcd20c" 
"some_other_field": "qwertyuıop" 
} 

所以,當我加入一個新的文檔到我的收藏,第一次我試圖找到如果存在通過找到的文檔與校驗值。如果存在,我更新(其他字段),否則我插入新文檔。

此策略有效!但是,在收集了一百萬份文檔後,我開始得到不可接受的插入時間。 cheksum查找和插入都放慢了。我可以在近1小時內插入約30,000個文檔!我已經閱讀過有關批量插入的內容,但如果我朝這個方向前進,則無法決定如何處理重複記錄。任何關於加速戰略的建議?

+1

你對'checksum'和'update_time'一個複合索引,並且你試圖做與更新upsert選項設置爲true? –

+0

對不起,我給的信息是錯誤的。沒有update_time查詢。只是cheksum。我糾正了這個問題。但是有關於「textval」的索引。它能成爲緩慢的原因嗎? – salihcenap

回答

1

我認爲如果您使用另一個僅包含校驗和和update_time filelds的集合,速度會更快。當您插入正常的JSON文件,那麼你應該插入這短短的JSON文件,以及:

Your normal JSON document: 
{ 
"_id": ObjectId('5336b4942c1a99c94275e1e6') 
"textval": "some long text" 
"checksum": "444066ed458746374238266cb9dcd20c" 
"update_time": new Date(1396220136948) 
"some_other_field": "qwertyuıop" 
} 

The short JSON document: 
{ 
"_id": ... 
"checksum": "444066ed458746374238266cb9dcd20c" 
"update_time": new Date(1396220136948) 
} 
+0

這是個好主意!謝謝。 – salihcenap