因此,在生成所有数据后,我需要将大量数据放入数据库中。现在,无论是在生成数据还是之后尝试执行此操作,都无关紧要。它崩溃了两种方式
我有这样的代码:
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();
});
我尝试设置延迟回调,但没有运气。
答案 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();
});