开发者问题收集

增加浏览器中的堆栈大小

2016-02-13
3964

简短问题:我有一个 javascript,它非常深入地进行递归。我如何增加堆栈大小以便可以执行它(类似于 Unix 系统中的“ulimit -s unlimited”)?

长话短说:我必须绘制一个图形,我使用 Cytoscape JS( http://js.cytoscape.org/ )结合 Dagre 布局扩展( https://github.com/cytoscape/cytoscape.js-dagre )。绘图算法深入递归,最终我在 Chrome 中收到“Uncaught RangeError:超出最大调用堆栈大小”,在 Firefox 中收到“过多递归”。我如何将堆栈大小设置为无限制或非常大(即像 Unix 系统中的“ulimit -s unlimited”)以便我可以绘制图形?

谢谢!

3个回答

Chrome 对此有一个标志:

chromium-browser --js-flags="--stack-size 2048"

不过,在运行上述命令之前,您还需要运行 ulimit -s unlimited :否则,深度递归的 Javascript 代码将导致 Chrome 崩溃。

Clément
2018-04-01

尝试更改算法,以在函数的每次迭代中不使用太多堆栈空间。例如:

  • 不使用时将局部变量设置为空。
  • 尽可能使用全局变量进行临时计算。这样,临时变量就不会在堆栈上。
  • 在递归函数中使用更少的变量。在函数的不同部分对不同的事情重复使用相同的变量。
  • 将递归函数分解为几个函数。其中一些函数不会递归,因此当递归函数调用自身时,这些函数中的局部变量将不会继续。
  • 创建一个要做的事情的全局数组,并将项目添加到此列表中,而不是递归调用函数。使用 array() 对象的 push 和 pop 方法。
  • 在递归函数中使用更少的参数。传递一个对象。

希望这些想法能帮到你。

Russell Hankins
2016-02-13

您无法在浏览器中更改堆栈大小,但您 可以 使用一种名为 trampolining 的技巧。

您可以在此处找到有效的代码解决方案:

如何理解 JavaScript 中的 trampoline?

Erik Kaplun
2016-05-31