2016-02-13 77 views
3

简短问题:我有一个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”),以便我可以绘制图形?

谢谢!

+0

找到你确定你的算法是正确的?您是否计算了您在离开堆栈空间时的嵌套调用数?这是一个合理的数字吗? – trincot

+0

是的,算法是正确的。事情是这个图有点大,绘图算法在递归中深入。但是,使用其他绘图算法(不使用递归),我可以很快地绘制它...因此,我认为如果我可以将堆栈大小增加到相当大的大小,我将能够绘制它。我搜索了,但找不到任何答案......在最糟糕的情况下,我需要修改Dagre算法,将其从递归更改为迭代...但我想检查是否有任何设置堆栈的方式浏览器的JavaScript引擎的大小限制。 – iwicopd2

+1

添加更多的上下文,在这里你可以找到几个浏览器的堆栈大小限制:http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit?rq=1。我只需要增加这个限制。 – iwicopd2

回答

1

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

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

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

+0

你好。谢谢你的答案。我曾考虑过其中的一些内容,但是您的列表确实比较完整!然而,如果我尽可能地减少每个函数调用的堆栈空间,但是算法本身在递归中过深,我不能改变为迭代算法?即我真的需要增加堆栈大小?我在现代浏览器中无法做到这一点?我是否应该将脚本重新编码为桌面应用程序,以便能够拥有庞大的堆栈大小? – iwicopd2

+0

我在Windows中编程一次,并且有一个非常大的二叉树。一旦函数完成,我写了一个递归函数来删除树。递归函数会崩溃。我不得不将递归函数重写为迭代函数。我不认为改变语言或扩大堆栈可以解决算法问题。如果您将堆栈大小加倍或堆栈大小加倍,那么您可能仍会遇到同样的问题。 –

+0

你好。我正在使用第三方库,并且在递归中有很多功能深入。我为此改变整个图书馆是不切实际的。我也同意并且喜欢以递归方式迭代地编写代码,但有时候递归只是在算法上更清晰。在UNIX系统中,有时候我们会有这个,而ulimit -s unlimited将解决这个问题。我现在有一个替代js的解决方法,它涉及到通过用--js-flags =“ - stack_size x”命令行参数调用Google Chrome来改变堆栈大小,并使用大的x。非常感谢你的帮助。 – iwicopd2