繁体   English   中英

带异步功能的for循环耗尽内存

[英]for-loop with async function runs out memory

在开始大喊“不要对异步函数使用for循环!”之前, 让我声明我确实知道如何使用异步函数对循环进行编程,该异步函数从回调内部调用下一次迭代。

但是,如果我对回调不感兴趣,或者仅在前任完成后才对处理一次迭代不感兴趣。 就我而言,我是从xml文件中导入大量记录并将其写入mongoDB中的。 正常调用我的“写入”功能将如下所示:

asyncWrite( record, function(err, result) {
    ...
});

现在,正如我所说,即时消息对回调(不会发生错误!)或串行过程都不感兴趣。 因此,我使用了for循环并省略了回调:

for( i=0; i<max; i+=1) {
    asyncWrite( record_arr[i] );
}

对于较小的max此方法非常有效。 但是随着max变得更大(> 100.000),我最终遇到了“内存不足”错误。 防止这种情况的唯一方法是回到“正常”异步循环(从回调内部进行递归函数调用)。

还有其他想法吗?

在for循环完成其工作之前,将不会执行异步功能。 它刚刚收集的队列太乞讨了。 对于大max您会因为队列已满out of memory不足错误。 您可以通过插入console.log(process.memoryUsage());查看内存泄漏的方式console.log(process.memoryUsage()); 在循环内部。 您需要使用块来处理此任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM