【问题标题】:for-loop with async function runs out memory具有异步功能的 for 循环耗尽内存
【发布时间】:2013-02-03 08:39:07
【问题描述】:

在您开始大喊“不要将 for 循环与异步函数一起使用!”之前让我声明,我确实知道如何使用异步函数编写一个循环,从回调中调用下一次迭代。

但是,如果我对回调不感兴趣,或者只在前任完成后才处理一次迭代,那该怎么办。就我而言,我从 xml 文件中导入大量记录并将它们写入 mongoDB。对我的“写”函数的正常调用是这样的:

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

现在正如我所说,我对回调不感兴趣(不会发生错误!)也不对串行过程感兴趣。所以我使用了一个for循环并省略了回调:

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

对于小的max,这非常有效。但是随着max 变大(> 100.000),我最终会收到“内存不足”错误。防止这种情况的唯一方法是返回“正常”异步循环(回调中的递归函数调用)。

还有什么想法吗?

【问题讨论】:

  • 您将该函数称为“asyncWrite(record_arr[i])”。函数的另一个参数在哪里?
  • 也许试试 process.nextTick(function(){asyncWrite(record_arr[i] );});
  • @polin:我有意将其省略,因为正如我所说,我不想在回调中处理任何内容。
  • @Chris:会有帮助吗?我认为这只是将问题向前转移了一步。填满队列的问题不会消失,不是吗?

标签: javascript node.js asynchronous


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多