节点 - 大型for循环,数据库工作耗尽内存

时间:2017-03-04 05:28:23

标签: mysql node.js database for-loop out-of-memory

因此,在生成所有数据后,我需要将大量数据放入数据库中。现在,无论是在生成数据还是之后尝试执行此操作,都无关紧要。它崩溃了两种方式

我有这样的代码:

for(var i = 0; i<4000, i++){
    for(var z = 0; z<1000; z++){
        c.query("REPLACE INTO `"+i+"`VALUES ("+z+", "+data+",)", function (err){
            if(err){
                throw err;
            }
        });
    }
}

在外部for循环的大约100个循环之后,它被杀死。当我查看内存信息时,内存不足。

如果我将所有内容更改为自调用函数并且调用延迟大约100毫秒,我可以获得更好的结果(它使其成为大约1500个外环)。我认为这是因为事件队列有时间清除。

我已经用各种方式尝试了这一点,我知道到目前为止。我尝试过redis,现在是mysql,都没有工作。它适用于json文件数据库,但不适用于这些。

任何人都有任何关于如何进行此循环的想法。这是一次性任务,所以速度根本不用担心,我只需要它完成大声笑。

编辑:这是正确的方向,但保持gettin Max调用堆栈大小超出。无法弄清楚。

async.eachOfSeries(chunk, function(item, key, outerCallback){
    async.eachOfSeries(item, function(value, slot, innerCallback){
        //console.log(slot);
        c.query("REPLACE INTO `"+key+"` (r, v) VALUES ("+slot+", "+value+")", function(err){
            if(err){
                throw err;
            }
        });
        innerCallback();
    }, function(err){
        outerCallback();
    });
}, function(err){
    callback();
});

我尝试设置延迟回调,但没有运气。

1 个答案:

答案 0 :(得分:1)

据我所知,到目前为止,问题是:

c.query()是异步方法。 我会使用async.eachSeries(或async.eachLimit)循环。

或者您可以使用Promise或async / await。

修改

更改了调用innerCallback的位置。

async.eachOfSeries(chunk, function(item, key, outerCallback){
    async.eachOfSeries(item, function(value, slot, innerCallback){
        //console.log(slot);
        c.query("REPLACE INTO `"+key+"` (r, v) VALUES ("+slot+", "+value+")", function(err){
            if(err){
                throw err;
            }
            innerCallback(); // Add callback here
        });
        // innerCallback(); // Remove this call
    }, function(err){
        outerCallback();
    });
}, function(err){
    callback();
});