是否有人建议如何更新大型集合中每个文档中的字段?
我使用这样的东西:
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
。
有没有办法以块或类似的方式处理上述更新?
答案 0 :(得分:3)
您可以使用async
库的async.eachLimit
方法来限制并发save
操作的数量(文档链接到each
,向下滚动查看{ {1}}变体)。
例如,要一次将保存限制为不超过5个:
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);
});
});
});
运算符的单update
和$inc
选项来增加每个文档的multi: true
值会更高效1。
Field
答案 1 :(得分:1)
你需要更多内存: - max_new_space_size和/或--max_old_space_size,如下所示:
node --max-old-space-size=4096 server.js
目前,默认情况下,v8在32位上的内存限制为512MB 系统,64位系统上的1.4GB。限制可以提高 将--max_old_space_size设置为最大值~1024(~1 GB)(32位) 和~4096(~4GB)(64位),但建议你拆分你的 如果你达到内存限制,单个进程会分成几个工作者