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

时间:2014-05-12 20:23:45

标签: node.js mongodb asynchronous

我正在尝试使用Node native mongodb模块通过流为我的Mongodb实现一个庞大的db.update()。

我看起来像这样:

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.wh虽然可以做到这一点,但我遇到了使用它的问题。 我试过了:

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
   }
)
})

然而,似乎似乎没有限制与我的数据库的连接并保存我的节点程序不会崩溃。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

好的,我通过使用异步模块async.queue克服了这个问题。

我能够创建这个变量:

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

来自我的信息流:

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方面 谢谢大家!

答案 1 :(得分:0)

为了划分并克服这个问题,如何排除从文件中读取并循环超过150万&#34;计数&#34;,或者从文件中读取,但不要调用mongodb。我想要弄清楚的是,这是一个MongoDB驱动程序错误,还是异步错误。

Alex Lerner