我有以下代码导致错误:致命错误: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);
}
});
}
});
}
答案 0 :(得分:1)
您正在使用此代码创建docs.length
数量的新Promise
。你应该做的是限制可以运行的Promise
的数量。
由于您尝试编写的是同步代码,我建议在前一个回调中调用下一个dbSave。
如果您使用并行系统,我将创建一个简单的信号量系统。
答案 1 :(得分:0)
我建议
module.exports.asyncEach = function(iterableList, callback, done) {
var i = -1,
length = iterableList.length;
function loop() {
i++;
if (i === length) {
done();
return;
}
callback(iterableList[i], loop);
}
loop();
};
然后你用异步保存模型调用asyncEach是非常好的
答案 2 :(得分:0)
谢谢大家的回答!我决定采用不同的方式,现在可以使用:
var cursor = chatModel.find({messageContent: rgx}).cursor();
cursor.on('data',function (doc) {
var directedMessagesObj = new directedMessagesModel
({
timeStamp: doc.timeStamp,
channelName: doc.channelName,
userName: doc.userName,
userID: doc.userID,
messageContent: doc.messageContent,
messageLength: doc.messageLength,
subscriber: doc.subscriber,
turbo: doc.turbo,
moderator: doc.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);
}
});
});