【问题标题】:nodeJs huge array processing throws RangeError: Maximum call stack size exceedednodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小
【发布时间】:2013-12-13 04:22:07
【问题描述】:

这是处理大量条目的代码的一部分(最初它适用于文件系统并对文件进行一些操作)。有什么好的方法可以绕过限制并防止抛出 RangeError: Maximum call stack size exceeded (至于现在它允许我迭代大约 3000 个项目)

var async = require('async')
    , _u = require('underscore')

var tifPreview = function (item, callback) {
    console.log(item)
    return callback();
}

var tifQueue = async.queue(tifPreview, 2)

tifQueue.push(_u.range(0, 5000, 1))

【问题讨论】:

    标签: javascript arrays node.js memory-management


    【解决方案1】:

    问题是您要进行许多函数调用。将stack-size设置为更高的值只会增加您可以处理的项目数量,并不能解决实际问题。

    您将直接从您的函数调用下一次迭代,这使其成为递归函数。有点难以发现,因为它要通过async

    这段代码应该可以工作:

    var tifPreview = function (item, callback) {
      console.log(item);
    
      // defer the callback
      setImmediate(callback);
    }
    

    在此处阅读有关setImmediate 函数的更多信息: http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg

    【讨论】:

    • 这绝对应该是公认的答案。实际上是修复而不是推动瓶颈。
    【解决方案2】:

    一个选项可以将--max-stack-size 传递给node

    node --max-stack-size 32000 app.js
    

    供参考,请使用node -h

    --max-stack-size=val 设置最大 v8 堆栈大小(字节)

    更新

    尽管帮助将其打印为--max-stack-size,但在node -v v0.10.x+ 中,您需要改用--stack-size

    node --stack-size=32000 app.js
    

    【讨论】:

    • 在最近的版本中,它实际上是 --stack-size,尽管帮助文本中另有说明。
    • @Nico: 使用 --stack-size=32000 它退出时没有错误,但无论如何它都会停止执行。从 Node 的手册页看来,是 --stack_size 而不是 --stack-size。
    • 我不认为增加堆栈大小是一个真正的解决方案。它不能解决根本问题。代码应该通过使用流或分成多个子流程来重新实现。
    猜你喜欢
    • 2019-07-05
    • 2014-02-07
    • 1970-01-01
    • 2013-08-18
    • 2018-02-06
    • 2015-06-28
    • 2018-11-01
    相关资源
    最近更新 更多