2012-03-22 27 views
3

我知道,因爲映射/減少寫入集合它需要搶全局寫鎖,但如果我設置輸出內聯,這不寫入內存?它似乎仍然抓住了鎖定。這對於Mongo 2.0來說可能是正常的嗎?Mongo塊上的內聯map/reduce嗎?

回答

4

使用內聯模式時,輸出基本上作爲單個文檔返回,將您限制爲最大文檔大小,因此您可能會看到行爲或響應時間的差異,因爲您返回的結果較大?

就鎖定而言,Map/Reduce作業可以被認爲是許多較小的操作(包括寫入)。

首先,有一個JavaScript鎖,以便只有一個線程可以在一個時間點執行JS代碼,所以至少現在是單線程的。但是MR的大多數JS步驟(例如單個映射())非常短,因此鎖經常被放棄。

也有一些非JavaScript操作是MapReduce的執行是需要鎖:

  • 它從集合讀(讀鎖產生每100個文件)
  • 它插入文件到臨時集合(寫鎖定了單次寫)
  • 它創建了一個最終的集合或併入或替換現有的集合(寫鎖)

您的在線模式通過將其作爲內存映射來移除第二個,所以你不應該看到寫鎖,至少不能用於這項工作。可能鎖是因爲JS操作還是讀取而不是寫入?

+0

哦,作爲參考,大部分信息在這裏:http://www.mongodb.org/display/DOCS/How+does+concurrency+work#Howdoesconcurrencywork – 2012-03-22 16:51:50

+0

謝謝 - 我的地圖有一些字符串比較哪些是可能很慢,所以這可能會放慢速度。希望2.2會刪除那個單一的JS限制。 – 2012-03-22 19:57:04

+1

https://jira.mongodb.org/browse/SERVER-4258是你想看的一個 - 它在dev 2.1分支,但確實需要spidermonkey到v8切換工作。你可以用v8構建開發分支來試用它:http://www.mongodb.org/display/DOCS/Building+with+V8 – 2012-03-22 21:03:59