MongoDb Node.js -大规模更新导致内存问题



我正试图通过使用Node本机Mongodb模块的流实现大规模的db.update()到我的Mongodb。

我得到的是这样的:

stream.on('data', function(data){
   db.collection('my-db').update({_id:data.id},{$set:{notes:data.notes}},{upsert:true},
   function(err,res){
      if(err) throw err;
      console.log(res);
   })
})

我的流读取了一个超过150万行的csv文件,在完成之前就崩溃了。

我理解Async。虽然可以做到这一点,但我在使用它时遇到了问题。我试过了:

stream.on('data', function(data)
var counter = 0;
async.whilst(
   function(){counter < 10;},
   function(cb){
      var docs = [];
      counter++;
      docs.push({id:data.id,notes:data.notes});   
   }
   db.collection('my-db').update(docs[0],{$set:docs[0]},{upsert:true},function(err,res){
     if(err)throw err;
     console.log(res);
     counter--;
   })
   function(err){
     //do something
   }
)
})

然而,这似乎并没有限制到我的数据库的连接,并使我的节点程序免于崩溃。

我通过使用async模块(特别是async.queue.

)克服了这个问题。

我可以创建这个变量:

var q  = async.queue(function(task, cb){
    cb();
}, 50)
q.drain = function() {
    console.log('all items have been processed');
}

From my stream:

q.push({name:dbUpdate}, function(err){
  db.collection('my-db').update({id:data.id},{$set:{notes:data.notes}},{upsert:true},function(err,res){  
     //do something
  })
})

我现在很肯定,我的问题更多的是在节点的mongodb-driver方面。
谢谢大家!

为了划分和征服这个问题,你如何排除从文件读取,只是循环超过150万"计数",或者从文件读取,但不调用mongodb。我想要得到的是弄清楚这是一个MongoDB驱动程序错误,还是异步错误。

Alex Lerner

最新更新