2012-07-31 72 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