2011-08-27 83 views
2

我在mongo集合中有數以萬計的行,並且需要更新所有這些行。 我寫了一個蒙戈外殼(JS)這樣的腳本:更新大量數據的最快方法

db.Test.find().forEach(function(row) { 
    // change data and db.Test.save() 
}); 

其中(我猜)應該會更快然後例如通過任何語言驅動程序更新由於蒙戈Web服務器和蒙戈服務器本身,只是因爲這樣的事實,即駕駛者之間可能存在的延遲「東西在上面」,並且是「東西在地下室」。

即使它可以更新大約2 100 rec./sec四核2.27GHz處理器與4GB RAM。

據我所知mongoimport可以處理周圍40K rec./sec(在同一臺機器上),我不認爲提到的速度是什麼,「快」。

有沒有更快的方法?

回答

3

這裏有兩個可能的限制因素:

  1. 單寫鎖: MongoDB中只有一個寫鎖,這可能是決定性的因素。
  2. 磁盤訪問:如果正在更新的數據是不積極在內存中,將需要從磁盤,這將導致緩慢向下加載。

有沒有更快的方法?

的此答案取決於瓶頸。嘗試運行iostatmongostat以查看瓶頸位置。如果iostat顯示高磁盤IO,那麼您將被磁盤阻止。如果mongostat顯示較高的「鎖定百分比」,那麼您最大限度地訪問全局寫入鎖定。

如果你已經超出了IO,沒有簡單的代碼修復。如果你已經寫出了寫鎖,那麼就沒有簡單的代碼修復。如果這兩個都不是問題,那麼可能值得嘗試另一個驅動程序。

據我所知mongoimport可以處理40K左右rec./sec(在同一臺機器上)

這可能不是一個公平的比較,很多人一個新的數據庫上運行mongoimport和數據一般只是加載到RAM中。

我會通過檢查iostat/mongostat開始。

+0

這裏是mongostat:http://pastebin.com/raw.php?i=Z92Abh2L這裏是iostat:已http://pastebin.com/chaJF3L3什麼是真正的 「高鎖%」? –

+1

在'mongostat'上,你鎖定的%'很低,只有大約17%。所以這不是數據庫寫入鎖定。通常我運行'iostat -xkd 1'來獲得IO使用的1秒間隔(用法顯示爲kB/s)。一個好的服務器驅動器應該是> 50 MB/s,所以看看是否阻止。這一步是'頂部'。如果你不是最大化IO並且你沒有最大化Mongo的寫入鎖定,那麼檢查CPU。 (只有其他瓶頸我可以看到)唯一的其他選擇是將更新命令寫爲「多」更新,但這並非總是可行。 –

相關問題