Recursion 增加浏览器中的堆栈大小

Recursion 增加浏览器中的堆栈大小,recursion,stack,size,cytoscape.js,cytoscape-web,Recursion,Stack,Size,Cytoscape.js,Cytoscape Web,简短问题:我有一个非常深入递归的javascript。如何增加堆栈大小以便执行它(类似于Unix系统中的“ulimit-s unlimited”) 说来话长:我必须绘制一个图形,我使用Cytoscape JS()和Dagre布局扩展()。绘图算法深入到递归中,我最终在Chrome中得到“uncaughtRangeError:超过最大调用堆栈大小”,在Firefox中得到“太多递归”。如何将堆栈大小设置为无限或非常大(如Unix系统中的“ulimit-s unlimited”),以便绘制图形 谢谢

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

说来话长:我必须绘制一个图形,我使用Cytoscape JS()和Dagre布局扩展()。绘图算法深入到递归中,我最终在Chrome中得到“uncaughtRangeError:超过最大调用堆栈大小”,在Firefox中得到“太多递归”。如何将堆栈大小设置为无限或非常大(如Unix系统中的“ulimit-s unlimited”),以便绘制图形


谢谢大家!

尝试更改算法节奏,使其在每次迭代函数时不使用太多堆栈空间。例如:

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

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

您不能在浏览器中更改堆栈大小,但可以使用一种称为

您可以在此处找到工作代码解决方案:


Chrome为此设置了一个标志:

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

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

您确定您的算法正确吗?您是否计算了在堆栈空间用完时的嵌套调用数?这是一个合理的数字吗?是的,算法是正确的。问题是图形有点大,绘图算法深入递归。然而,使用其他绘图算法(不使用递归),我能够相当快地绘制它。。。所以我假设如果我能把堆栈的大小增加到一个合理的大尺寸,我就能画出来。我搜索了一下,但找不到任何答案。。。在最坏的情况下,我需要修改Dagre算法,将其从递归改为迭代。。。但我想检查是否有任何方法可以设置浏览器javascript引擎的堆栈大小限制。添加更多上下文,在这里可以找到几种浏览器的堆栈大小限制:。我只需要增加这个限制。但是你能在内存不足之前报告一下你的嵌套呼叫数吗?你好。我使用的是第三方库,有几个函数深入递归。其中一个大约有3000级,但是我不可能为了这个改变整个库。我现在有一个解决方法,它涉及通过使用--js flags=“--stack_size x”命令行参数调用Google Chrome来更改其堆栈大小,并使用一个大x。非常感谢你的帮助。你好。谢谢你的回答。我已经考虑过其中一些事情,但是你的清单确实更完整了!但是,如果我在每次函数调用时都尽可能地最小化堆栈空间,但是算法本身在递归中太深了,我不能改为迭代算法,那该怎么办?也就是说,我真的需要增加堆栈大小?我就是不能在现代浏览器中这么做?我是否应该将我的脚本重新编码为桌面应用程序,以便能够拥有一个大的堆栈大小?我曾经在Windows中用C编程,并且有一个非常大的二叉树。我编写了一个递归函数,在函数完成后删除树。递归函数将崩溃。我不得不将递归函数重写为迭代函数。我不认为更改语言或扩展堆栈可以解决您的算法问题。如果将堆栈大小增加一倍或三倍,则可能仍然存在相同的问题。您好。我使用的是第三方库,有几个函数深入递归。为了这个而改变整个图书馆对我来说是不切实际的。我也同意并且更喜欢迭代编写代码,而不是递归编写代码,但有时候递归在算法上要干净得多。在UNIX系统中,有时会出现这种情况,而ulimit-s unlimited解决了这个问题。我现在有一个针对js的解决方案,它涉及通过使用--js flags=“--stack_size x”命令行参数调用Google Chrome来更改其堆栈大小,并使用一个大x。非常感谢您的帮助。在dagre repo中发布Github问题是一个好主意,因为这就是递归发生的地方:问题是“如何将堆栈大小设置为无限或非常大?”这并没有回答问题。@Clément…即使它已被选为公认的答案??:O答案暗示这是不可能的,只是没有明确说明。谢谢编辑。你确定这是不可能的吗?注释中提到的OP标志似乎确实增加了堆栈大小(javascript无法实现这种效果,但它仍然可以在命令行中工作)。可用的V8标志可以使用
--js flags=“--help”
找到。