在stackoverflow.com上发布一个堆栈溢出的问题,多有趣啊:-)
我在运行一些递归Ruby代码时,遇到了:"Stack level too deep (SystemStackError)"
(我相当确定代码是可以工作的,我没有陷入无限递归死循环,但这并不是重点)
有没有办法改变我的Ruby应用程序允许的堆栈深度/大小?
我不太明白这是否是Ruby中的限制,因为错误显示“栈级别”,这让我觉得Ruby会以某种方式计算堆栈的“级别”,或者它只是意味着堆栈已满。
我尝试在Vista和Ubuntu下运行此程序,结果相同。在Ubuntu下,我尝试使用'ulimit -s'将堆栈大小从8192更改为16000,但没有任何改变。
编辑:感谢反馈。
我确实意识到使用递归函数可能不是最稳健的方法。但那也不是重点。我只是想知道是否有一种方法可以增加堆栈大小..只要。正如我之前提到过的,我尝试在运行ruby脚本之前运行ulimit -s 16000..但没有任何改进..我用错了吗?
编辑2:实际上,在代码的边缘情况下,我正在进行无限递归。
当您获得"Stack level too deep"
错误时截断的Ruby堆栈跟踪有点误导人。
当涉及到几个函数的递归行为时,您会感到递归次数比实际少得多。在这个例子中,你可能认为它在稍微多一点的调用后崩溃了,但实际上是大约15000次调用。
tst.rb:8:in `p': stack level too deep (SystemStackError)
from tst.rb:8:in `bar'
from tst.rb:12:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
... 190 levels...
from tst.rb:19:in `foo'
from tst.rb:10:in `bar'
from tst.rb:19:in `foo'
from tst.rb:22
-安德烈亚斯
export RUBY_THREAD_VM_STACK_SIZE=5000000
将其设置为5 MB。 - Jochem Schulenklopper