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 

이 내가 계산에서 실행되는 순서에 대해 걱정하지 않는 패턴을지도-감소를위한 아주 좋은 후보입니다

문제는 내 데이터베이스이다 하나의 노드에 있습니다. 많은 매핑을 동시에 실행하고 싶습니다. (8 코어 머신이 있습니다)

MongoDb는 노드 당 하나의 실행 스레드 만 사용합니다. 실제로는 데이터 세트를 순차적으로 실행하고 있습니다. 이것이 맞습니까?

map-reduce 실행 당 프로세스/스레드 수를 구성 할 수 있습니까? map-reduce를 병렬로 실행하는 여러 스레드를 관리 한 다음 결과를 집계하면 상당한 성능 향상이 나타납니다 (아무도 시도한 적이 있습니까?). 그렇지 않은 경우 - 동일한 노드에 내 DB를 여러 번 복제 할 수 있으며 mongoDb를 2 복제로 실행하도록 "트릭"할 수 있습니까?

감사합니다.

답변

7

MongoDB의 map reduce는 단일 스레드 Javascript 엔진 인 Spidermonkey를 사용하므로 여러 프로세스를 구성 할 수 없으며 "트릭"도 없습니다. 여기에 계속할 수있는 멀티 쓰레드 JS 엔진을 사용하는 JIRA 티켓이 있습니다 : https://jira.mongodb.org/browse/SERVER-2407

가능한 경우, 나는 새로운 집계 프레임 워크 (MongoDB 버전 2.2에서 사용 가능)를 살펴볼 것입니다. Javascript 대신 C++을 사용하면 성능이 향상 될 수 있습니다. http://docs.mongodb.org/manual/applications/aggregation/

+0

동일한 컴퓨터에서 여러 번 반복하여 작업 할 수 있는지 여부는 아직 알려지지 않았습니다. –

+1

단일 노드에서 여러 MongoD 인스턴스를 실행하는 것은 좋지 않습니다. 프로세스는 피해야하는 RAM과 같은 리소스를 놓고 경쟁 할 수 있습니다. 단일 스레드 MR을 피할 수있는 또 다른 가능한 솔루션은 데이터 저장소를 처리에서 분리하는 MongoDB Hadoop 커넥터 일 수 있습니다. http://www.mongodb.org/display/DOCS/Hadoop – Jenna

+0

그러나보다 완전한 대답을 제공하기 위해 프로세스 당 하나의 JS 엔진이 있으므로 이론에서는 (권장하지는 않지만) 여러 개의 MongoD가있는 경우 단일 노드에서 여러 MR 작업을 실행할 수 있어야합니다. 더 나은 해결책은 다른 샤드에서 MR 작업을 병렬로 실행하는 것입니다. – Jenna