我有以下代码导致错误: fatal error :CALL_AND_RETRY_LAST 分配失败 - 进程内存不足
无论我是否设置--max_old_space_size=4096
(或更大的数字)都没有任何区别。我的电脑有 16 GB RAM。
系统:win10/node.js 6.9.2/mongodb 3.4
我在“chatModel”中有超过 16 000 000 条消息。对于较少量的消息,代码可以工作。
您对如何解决问题/优化代码有什么建议吗?
function sortOutMessages(){
var atSymbol = "@";
var rgx = new RegExp("^\\" +atSymbol);
chatModel.find({messageContent: rgx}, function (err, doc){
var docs = doc;
var docsLength = docs.length;
for (var i =0; i<docsLength;i++) {
var directedMessagesObj = new directedMessagesModel
({
timeStamp: docs[i].timeStamp,
channelName: docs[i].channelName,
userName: docs[i].userName,
userID: docs[i].userID,
messageContent: docs[i].messageContent,
messageLength: docs[i].messageLength,
subscriber: docs[i].subscriber,
turbo: docs[i].turbo,
moderator: docs[i].moderator
});
directedMessagesObj.save({upsert:true}, function (err) {
var fs = require('fs');
if (err) {
fs.appendFile("undefinedLog.txt", "error at " + new Date().toLocaleString() + " directedMessagesObj.save " + "\r\n")
loggerWinston.warn("error at " + new Date().toLocaleString() + " directedMessagesObj.save " + "\r\n");
return console.log(err);
}
});
}
});
}
最佳答案
您正在使用此代码创建 docs.length
数量的新 Promise
。您应该做的是限制可以运行的 Promise
数量。
由于您一直在尝试编写同步代码,因此我建议在上一个 dbSave 的回调中调用下一个 dbSave。
如果您想要一个并行系统,我会创建一个简单的信号量系统。
关于javascript - Node.js: "process run out of memory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346530/