当我运行我的代码时,Node.js抛出了一个"RangeError: Maximum call stack size exceeded"
异常,这是由过多的递归调用引起的。我试图通过sudo node --stack-size=16000 app
来增加Node.js堆栈的大小,但是Node.js崩溃了,没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将打印'Segmentation fault: 11'
。有没有可能在不删除递归调用的情况下解决这个问题?
发布于 2014-01-06 06:32:30
我找到了一个肮脏的解决方案:
/bin/bash -c "ulimit -s 65500; exec /usr/local/bin/node --stack-size=65500 /path/to/app.js"
它只会增加调用堆栈限制。我认为这不适合于产品代码,但我需要它用于只运行一次的脚本。
发布于 2014-01-06 01:29:40
在一些语言中,这可以通过尾部调用优化来解决,其中递归调用在幕后转换为循环,因此不存在最大堆栈大小达到的错误。
但是在javascript中,当前的引擎并不支持这一点,预计新版本的Ecmascript 6语言也会支持。
Node.js有一些启用ES6功能的标志,但尾部调用尚不可用。
因此,您可以重构代码以实现一种称为trampolining的技术,或重构以实现transform recursion into a loop。
发布于 2014-12-05 18:52:55
如果你不想实现自己的包装器,你可以使用队列系统,例如async.queue,queue。
https://stackoverflow.com/questions/20936486
复制相似问题