새로운 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();
}
});
});
});
일주일에 한 번이 업로드를 실행합니다.