Node.js:"进程耗尽内存"

时间:2017-06-03 17:06:56

标签: javascript node.js mongodb

我有以下代码导致错误:致命错误: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);
            }

        });
    }

});



}

3 个答案:

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