2014-06-06 2 views
0

새로운 mongo bulk apis를 사용하여 사용자 지정 대량 업로드 스크립트를 작성하려고합니다. 나는 처음에는 정말 빠르게 작동하는 UnorderedBulkOp을 사용하고 있지만 여러 번 호출 된 후에는 멈추기 시작합니다. 로그 라인을 사용해 보았는데 10 번째 호출이 실제로 터지기 시작한 것 같습니다. 업로드를 중단하고 다시 시작하면 (코드가 중복을 확인하는 코드가 있음) execute에 대한 첫 번째 호출이 다시 실행되므로 내 컬렉션의 데이터 양에 의존하지 않는 것처럼 보입니다. 무슨 일 이니? 모든 작업을 대량 작업으로 푸시하고 호출을 한 번만 실행하는 방법을 생각했지만 다른 답변에서는 여기를 클릭하여 점진적으로 대량 작업에 execute을 호출합니다. '실행'증분 UnorderedBulkOp 호출이 기하 급수적으로 느림

조금 아래로 벗겨진

그것은이 일을한다 : 나는 collection.save 개별 호출을 사용하여이 일을했지만 내 데이터 세트는 2 개 백만 데이터 포인트의 순서에 현재와 나는 같은 최적화하기 위해 찾고

원래
this.db.collection(collection_name, function(err, collection){ 
    var bulk = collection.initializeUnorderedBulkOp(); 
    var operations = 0; 
    var dataread = fs.createReadStream(filepath, {encoding: 'utf8'}); 
    var current = ''; 

    // load and split data from CSV  
    dataread.on('data', function(data){ 
    dataread.pause(); 
    chunk = current + data; 
    var split = chunk.split('\n'); 
    current = split.pop(); 
    var ids = []; 

    for(i=0, len = split.length; i< len; i++){ 
     lineData = split[i].split(','); 
     customid = parseInt(lineData[0]); 
     ids.push(customid); 
    } 

    // find which docs already exist and need to be updated  
    collection.find({customid: {$in: ids}}).toArray(function(err, docs){ 
     var docmap = {}; 
     for(i=0, len=docs.length; i<len; i++){ 
     docmap[docs[i].customid] = docs[i]; 
     } 

     for(isplit=0; isplit<split.length; isplit++){ 
     lineData = split[isplit].split(','); 
     customid = parseInt(lineData[0]); 

     // check for insert or update 
     if(docmap[customid]){ 
      doc = docmap[customid]; 
      //update doc 
      bulk.find({_id: doc._id}).update({$push: {history: 1}});  
     else{ 
      doc = formatData(lineData); 
      bulk.insert(doc); 
     } 
     operations++;   
     } 

     if(operations > 10000){ 
     bulk.execute({w: 1}, function(err, result){ 
      operations = 0; 
      dataread.resume(); 
     }); 
     }else{ 
     dataread.resume(); 
     }  
    }); 
    }); 
}); 

일주일에 한 번이 업로드를 실행합니다.

답변

0

따라서 이것이 대량 작업의 단점 인 것 같습니다. 순차 벌크 연산을 처리하지만 단일 BulkOp 객체는 단일 일괄 처리 만 처리하는 데 가장 적합합니다. 성공적인 execute 호출의 콜백에서 bulk을 다시 초기화하여이 문제를 해결할 수있었습니다.

bulk.execute({w: 1}, function(err, result){ 
    operations = 0; 
    bulk = collection.initializeUnorderedBulkOp(); 
    dataread.resume(); 
}); 
관련 문제