2014-05-12 25 views
0

我想通過使用Node本地mongodb模塊的流實現一個大規模的db.update()到我的Mongodb。MongoDb Node.js - 導致內存問題的大規模更新

我有什麼看起來是這樣的:

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

我流中讀取一個CSV文件即超過150萬行,它在完成之前崩潰。

我明白,Async.whilst可以做到這一點,但我遇到了使用它的問題。 我曾嘗試:

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

然而,這似乎似乎並沒有扼殺我的數據庫的連接,並從崩潰拯救我的節點計劃。

任何幫助將不勝感激。

+0

你能提供更多的細節和你正在遇到的崩潰,錯誤信息,內存統計等 – Sebastian

+0

當然我得到一個內存不足的錯誤:'Node.js「致命錯誤:JS分配失敗 - 進程內存不足」 ' – MonsterWimp757

+0

你有沒有考慮解析CSV和做小批量?我猜想,mongodb模塊正在將所有讀取的內容存儲到內存中以準備保存。 – Tony

回答

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中,駕駛員側。
謝謝大家!

0

爲了區分和克服這個問題,你如何排除從文件中讀取並循環超過150萬個「計數」,或者從文件中讀取,但不要調用mongodb。我試圖弄清楚這是一個MongoDB驅動錯誤還是異步錯誤。

亞歷克斯·勒納

+0

好的 - 我注意到,當我將它作爲插入插件時,它會完成而沒有問題。我也用upsert命令更新了一個新的集合,它可以工作。我認爲這與MongoDB驅動程序有關。這些信息有幫助嗎? – MonsterWimp757