2016-03-20 7 views
1

大規模なコレクションの各ドキュメントのフィールドを更新する方法についての提案がありますか?大きなコレクションを更新する

私はこのようなものを使用します。

MyModel.find().exec(function(err,data){ 
    if(err){ 
     return console.log(err); 
    } 
    data.forEach(function(doc){ 
     doc.Field = doc.Field + 1; 
     doc.save(function (err) { 
     if(err) { 
     console.error('ERROR!'); 
     } 
     }); 
    }); 
}); 

をしかし、私はFATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memoryを取得します。

上記のアップデートをチャンクなどで処理する方法はありますか?このように、--max_new_space_sizeおよび/または--max_old_space_size:

+0

することにより、各ドキュメントのField値をインクリメントするためにあなたのコレクションはどれくらい大きいですか? MongoDBサーバーのメモリまたはスワップサイズを増やしてみてください。 – Saleem

答えて

3

をヒットしている場合(ドキュメントリンクがeachにある、eachLimitバリアントを表示するには、スクロールダウン) 。

MyModel.find().exec(function(err, data){ 
    if (err) { 
     return console.log(err); 
    } 
    async.eachLimit(data, 5, function(doc, callback){ 
     doc.Field = doc.Field + 1; 
     doc.save(function(err) { 
     if (err) { 
      console.error('ERROR!'); 
     } 
     callback(err); 
     }); 
    }); 
}); 

しかし、この場合には、$incオペレータと単一updateを使用することがはるかに効率的であろう:

は、例えば、一度にせいぜい5卓越したに保存し制限しますそしてmulti: trueオプションは、1

MyModel.update({}, {$inc: {Field: 1}}, {multi: true), function(err) { ... }); 
+0

まだ致命的なエラーです。私は他の答えを試してみます。 – user1665355

1

あなたはより多くのメモリを必要とする

node --max-old-space-size=4096 server.js 

現在、デフォルトのV8で、32ビット システム上の512メガバイトのメモリ制限があり、 64ビットシステムで1.4GB制限は --max_old_space_sizeを最大1024(〜1 GB)(32ビット)に設定して 〜4096(〜4GB)(64ビット)にすることができますが、 いくつかの労働者への単一のプロセスあなたはあなたが同時save操作の数を制限するasyncライブラリのasync.eachLimitメソッドを使用することができ、メモリの制限

+0

Good find。私は気づいていませんでした。 +1 – Saleem

+0

@ profesor79ありがとうございますが、しばらくすると "Killed"と表示されます... – user1665355

関連する問題