ruby - 如何增加 ruby​​ 应用程序的堆栈大小。递归应用获取 : Stack level too deep (SystemStackError)

标签 ruby recursion

在 stackoverflow.com 上发布一个堆栈溢出问题,多么有趣:-)

我正在运行一些递归 Ruby 代码,我得到:“堆栈级别太深 (SystemStackError)”

(我很确定代码有效,我没有陷入无限递归的死亡螺旋,但这不是重点)

是否可以更改我的 Ruby 应用程序允许的堆栈深度/大小?

如果这是 Ruby 中的限制,我不太明白,因为错误显示“堆栈级别”,这给我的印象是 Ruby 以某种方式计算堆栈的“级别”,或者它只是意味着堆栈满了。

我已经尝试在 Vista 和 Ubuntu 下运行这个程序,结果相同。 在 Ubuntu 下,我尝试使用“ulimit -s”将堆栈大小从 8192 更改为 16000,但这并没有改变任何东西。

编辑: 感谢您的反馈。
我确实意识到使用递归函数可能不是最可靠的方法。 但这也不是重点。 我只是想知道是否有办法增加堆栈大小……期间。 正如我提到的,我确实在运行 ruby​​ 脚本之前尝试运行 ulimit -s 16000.. 没有任何改进.. 我用错了吗?

编辑2: 事实上,我在代码的边缘情况下进行了无限递归。
当您收到“Stack level too deep” 错误时截断的ruby 堆栈跟踪有点误导。
当具有涉及多个函数的递归行为时,您会觉得递归次数比实际少得多。在此示例中,可能会在调用 190 多次后崩溃,但实际上大约调用了 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

-安德烈亚斯

最佳答案

这个问题及其答案似乎可以追溯到使用 C 堆栈的 Ruby 1.8.x。 Ruby 1.9.x 及更高版本使用具有自己堆栈的 VM。在 Ruby 2.0.0 及更高版本中,可以通过 RUBY_T​​HREAD_VM_STACK_SIZE 环境变量控制 VM 堆栈的大小。

关于ruby - 如何增加 ruby​​ 应用程序的堆栈大小。递归应用获取 : Stack level too deep (SystemStackError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242617/

相关文章:

c - 寻找一对整数之间的最小差异

ruby-on-rails - 在 Rails 中,我从 Guard 那里收到这个错误,说我必须更新到新的 :cmd syntax

javascript - 变量计算完成后如何将变量从 Controller 传递给javascript?

javascript - 从命名空间中使用递归函数时为 "Too much recursion"

python - 为什么我的递归函数返回 None?

Python检查是否有可能通过左跳或右跳到达数组的最右端

ruby-on-rails - 如何进行 Ruby on Rails 并发测试?

ruby-on-rails - 无法将 Puma 作为守护进程运行 OptionParser::AmbiguousOption:模糊选项:-d

ruby-on-rails - 未定义的方法图

c - 递归二分查找/C