2014-01-15 175 views
0

我現在正在使用Mongodb作爲緩存。該應用程序將在晚上提供3個CSV,並且CSV會變得更大,因爲新產品將一直添加。現在,我達到了500萬條記錄,處理所有事情花了大約2個小時。由於緩存每天都會刷新,刷新數據將變得不切實際。隨着時間的推移,Mongodb性能會顯着下降。

例如

CSV 1 
ID, NAME 
1, NAME! 

CSV 2 
ID, DESCRIPTION 
1, DESC 

CSV 3 
ID, SOMETHING_ELSE 
1, SOMETHING_ELSE 

的應用程序將讀取CSV 1,並把它在數據庫中。然後,CSV 2將被讀取,如果有新的信息將被添加到相同的文檔或創建一個新的記錄。同樣的邏輯適用於CSV 3.因此,一個文檔將從不同的CSV獲得不同的屬性,因此upsert。一切完成後,所有的文件將是索引。

現在第一百萬份文件相對較快,但我可以看到隨着時間的推移,性能會大大降低。我猜這是因爲Mongodb必須找到文檔並更新屬性,否則就創建它。我正在使用Java驅動程序和MongoDB 2.4。無論如何,我可以改進,甚至在mongodb java驅動程序中進行批量upsert?

回答

1

你說的「一切之後完成,那麼所有的文件將被索引」是什麼意思? 如果是因爲你想添加額外的索引,最後這樣做是值得商榷的,但是沒關係。 如果你完全沒有索引,那麼這可能是你的問題。

你要確保所有的插入/ upserts你正在使用的是指數做。您可以運行一個命令並使用.explain()來查看是否正確使用索引。 您需要一個索引,否則您將爲每個插入/更新掃描一百萬個文檔。

而且,你能也給你的應用程序更多的細節?

  1. 你打算在3個階段只進行一次導入,還是你會頻繁更新?
  2. CSV2和CSV3是否修改大部分文檔?
  3. 做的CSV2和CSV3添加或替換文件的修改?
  4. 文檔的平均大小是多少?

讓我們假設你在相同的文檔上進行了很多次更新。例如,CSV2和CSV3在相同的文檔上有更新。除了導入CSV1之外,您還可以爲CSV2進行更新,然後再進行CSV3更新,您可能只需將文檔保存在應用程序的內存中,將所有更新應用到內存中,然後將文檔推送到數據庫中。這假定你有足夠的內存來完成操作,否則你將再次使用磁盤。

相關問題