节点 - 大型 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();
});
所以我有大量的数据在生成之后需要放入数据库中。现在,无论我是在生成数据时还是之后尝试执行此操作,都无关紧要。双向崩溃
我有这样的代码:
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();
});