2012-07-31 48 views
4

我有一個擁有數千條記錄的mongodb,它擁有很長的向量。 我正在尋找輸入矢量與使用特定算法的MDB數據集之間的相關性。在多核服務器上減少mongodb映射

psudo代碼:

function find_best_correlation(input_vector) 
    max_correlation = 0 
    return_vector = [] 
    foreach reference_vector in dataset: 
     if calculateCorrelation(input_vector,reference_vector) > max_correlation then: 
      return_vector = reference_vector 
    return return_vector 

這是一個很好的候選人的map-reduce圖案,我不關心的計算是在運行順序

的問題是,我的數據庫在一個節點上。 我想同時運行多個映射(我有一個8核心機器)

從我所瞭解的情況來看,MongoDb每個節點只使用一個執行線程 - 實際上我正在串行運行我的數據集。 這是正確的嗎?

如果是的話,我可以配置每個map-reduce run的進程/線程數量嗎? 如果我管理多個並行運行map-reduce的線程,然後彙總結果,我會大幅提高性能(是否有人試過)? 如果不是 - 我可以在同一個節點上有多個我的數據庫的複製,並且「欺騙」mongoDb可以在兩個複製上運行?

謝謝!

回答

7

MongoDB中的映射減少使用Spidermonkey,一個單線程的JavaScript引擎,所以不可能配置多個進程(並且沒有「技巧」)。有一個JIRA票可以使用多線程JS引擎,你可以在這裏看到: https://jira.mongodb.org/browse/SERVER-2407

如果可能的話,我會考慮研究一下新的聚合框架(在MongoDB 2.2版中提供) C++而不是Javascript,並可能會提供性能改進: http://docs.mongodb.org/manual/applications/aggregation/

+0

謝謝,但仍不清楚,如果我可以在同一臺機器上多次複製工作再次。 – 2012-08-01 10:00:18

+1

不建議在單個節點上運行多個MongoD實例。這些進程可以爭奪像RAM這樣的資源,這應該避免。避免單線程MR的另一種可能的解決方案可能是MongoDB Hadoop連接器,它將數據存儲與處理分開:http://www.mongodb.org/display/DOCS/Hadoop – Jenna 2012-08-01 17:12:01

+0

但是爲了提供更完整的答案,有一個單個JS引擎每個進程,所以理論上(儘管不推薦),如果有多個MongoD,應該可以在單個節點上運行多個MR作業。更好的解決方案是在不同的分片上並行運行MR作業。 – Jenna 2012-08-01 17:20:20