nodeJs巨大数组处理抛出RangeError:超出最大调用堆栈大小

Alb*_*ber 11 javascript arrays memory-management node.js

这是进行大量条目的代码的一部分(最初它与文件系统一起工作并对文件进行一些操作).是否有任何好方法可以绕过限制并防止抛出RangeError:超出最大调用堆栈大小 (现在它允许我迭代大约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))
Run Code Online (Sandbox Code Playgroud)

bev*_*qua 23

一个选项可能会传递--max-stack-sizenode.

node --max-stack-size 32000 app.js
Run Code Online (Sandbox Code Playgroud)

供参考,请使用 node -h

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

更新

即使帮助打印出来--max-stack-size,在node -v v0.10.x+中你需要使用--stack-size.

node --stack-size=32000 app.js
Run Code Online (Sandbox Code Playgroud)

  • 在最近的版本中,它实际上是`--stack-size`,即使帮助文本另有说明. (3认同)
  • 我认为增加堆栈大小不是真正的解决方案。它不能解决根本问题。该代码应通过使用流或分成多个子流程来重新实现。 (2认同)

Lin*_*äck 23

问题是你正在进行许多函数调用.将stack-size值设置为更高的值只会增加您可以处理的项目数,而不是解决实际问题.

您正在从函数中直接调用下一个迭代,这使它成为递归函数.这是有点难以发现,因为它正在通过async.

这段代码应该有效:

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

  // defer the callback
  setImmediate(callback);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这绝对应该是公认的答案.实际上修复而不是推动瓶颈向下. (5认同)