2012-10-31 2 views
-1

을 줄이기 위해 매우 긴 시간을내어 줄입니다지도는 여기에 내가 뭘하는지의 26 개 기록

mongos> db.campaign_raw_data_459_imp.count() 
21800002 
mongos> db.campaign_raw_data_459_imp.find({ts:1350585328}).count() 
26 
mongos> map = function() { emit(this.cookie, 1);} 
function() { 
    emit(this.cookie, 1); 
} 
mongos> reduce = function (key, values) {return 1;} 
function (key, values) { 
    return 1; 
} 
mongos> 
mongos> db.campaign_raw_data_459_imp.mapReduce(map, reduce, {out: { replace : "garbage"}}, query={ts:1350585328}) 
//This is hanging and taking forever, over 10 minutes now 

는이 컬렉션에서 21m 문서가 있습니다. 그리고 주어진 타임 스탬프 (ts = 1350585328)에는 26 개의 레코드가 있습니다. 목표는 일치하는 레코드에있는 고유 한 쿠키의 수를 계산하는 것입니다. 그래서 모든 일치 문서 26 개를 찾아야합니다. 그런 다음 쿠키를 기반으로 버킷에 버리고 버킷을 계산합니다. 나는 그것이 쿼리를 기반으로 find를 수행 할 것으로 추정하고, 먼저 FIRST를 수행 한 다음 반환 된 값으로 map/reduce를 수행합니다. 그렇다면 컬렉션의 크기는 전혀 중요하지 않습니다. 눈 깜짝 할 사이에 두 번째 줄에 count()을 기록했습니다.

이 색인은 tscookie이며, 세 개의 복제 세트가있는 세 개의 샤드 설정이 있습니다. 내 컬렉션은 3 개의 노드로 나누어지고 각 조각은 3 명의 멤버가있는 복제 세트입니다.

왜 이렇게 오래 걸리나요? 찌르다 보면, 나는 범위를 (아마도 지난 시간, 아마) 열어서, 단지 26보다 더 많은 일치 된 문서를 가질 것이다.

+0

downvote? 제 질문에 뭐가 잘못 됐나요? – Landon

답변

1

mapReduce 호출 매개 변수는 다음과 같이 보일 것이다. 단일 개체의 모든 옵션) :

db.campaign_raw_data_459_imp.mapReduce(map, reduce, 
    {out: { replace : "garbage"}, query: {ts:1350585328}}) 
+0

설명서에 따르면 pymongo 드라이버를 사용하고 있습니다. pymongo에 대해 모두 그룹으로 묶지 마십시오. http://api.mongodb.org/python/2.0/examples/map_reduce.html#advanced-map-reduce – Landon

+0

@ Landon OK, mongo shell을 사용하는 예제 코드가 아닌가? pymongo와 모든 것이 약간 다르게 보일 것입니다. – JohnnyHK

+0

예, 나의 예제 코드는 mongo 쉘에 있습니다. 내 코드를 만든 다음 드라이버에 복사합니다. 예, 기술적으로 다른 드라이버는 다르게 수행하지만 pymongo 드라이버를 기다리는 것과 똑같은 시간이 걸립니다. – Landon