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干货盘点#

RangeError ReferenceError SyntaxError TypeError URIError

JavaScript的错误处理

RangeError:无效的数组缓冲区长度 - Meteor JS