增加浏览器中的堆栈大小

时间:2016-02-13 14:15:29

标签: recursion stack size cytoscape.js cytoscape-web

简短的问题:我的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 个答案:

答案 0 :(得分:1)

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

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

我希望这些想法可以帮到你。

答案 1 :(得分:1)

您可以使用名为trampolining的技巧。

How to understand trampoline in JavaScript?

找到了一个解决方案

答案 2 :(得分:0)

Chrome有一个标志:

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

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