所以我有大量数据需要在生成后放入数据库中。现在,无论我在生成数据时还是之后尝试执行此操作,都无关紧要。双向都会崩溃
我有这样的代码:
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();
});
关于mysql - Node - 数据库工作内存不足的大型 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592477/