nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小
Posted
技术标签:
【中文标题】nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小【英文标题】:nodeJs huge array processing throws RangeError: Maximum call stack size exceeded 【发布时间】: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))
【问题讨论】:
【参考方案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。
我不认为增加堆栈大小是一个真正的解决方案。它不能解决根本问题。代码应该通过使用流或分成多个子流程来重新实现。以上是关于nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 JavaScript 中抛出和捕获 RangeError、ReferenceError、TypeError?
抛出错误 RangeError:将自定义日期设置为 react-datepicker 的 DatePicker 时时间值无效
JavaScript错误处理try..catch...finally,涵盖throw,TypeError,RangeError#yyds干货盘点#