6

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

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

谢谢!

4

3 回答 3

1

Chrome对此有一个标志:

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

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

于 2018-04-01T18:23:05.957 回答
0

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

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

我希望这些想法对你有所帮助。

于 2016-02-13T14:37:20.357 回答
0

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

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

如何理解 JavaScript 中的蹦床?

于 2016-05-31T14:28:12.930 回答