节点 - 大型 for 循环,数据库工作 运行 内存不足

Node - Large for loops with database work running 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 文件数据库,但不适用于这些。

任何人都知道我如何完成这个循环。这是一次性任务,所以速度根本不重要,我只需要它来完成哈哈。

编辑:这是正确的方向,但要保持超出最大调用堆栈大小。想不通。

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();
});

我尝试为回调设置延迟,但没有成功。

据我目前对问题的理解:

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();
});