Ruby对象有大小限制吗?

时间:2010-09-03 18:37:50

标签: ruby

我正在构建一些在应用程序中具有短生命周期的大字符串。 String对象是否会随意增大,直到ruby实例的物理极限?

我想知道的是,如果没有任何限制字符串大小的干预,我的应用程序会因内存不足而受到冲击,或者它是否会优雅地降级。

感谢您的任何意见!

1 个答案:

答案 0 :(得分:11)

有一个限制。 String可以是2**31 - 1(并且相应{64}红宝石上的2**63 - 1。您可以通过以下方式查看限制:

>> s = String.new("1" * (2**32))
RangeError: bignum too big to convert into `long'
    from (irb):3:in `*'
    from (irb):3
>> s = String.new("1" * (2**31))
RangeError: bignum too big to convert into `long'
    from (irb):4:in `*'
    from (irb):4

话虽如此,虽然您可以尝试分配一个很大的字符串,但它可能会失败(至少在32位系统上,因为一个进程可以分配的最大内存量通常在2.5到3GB之间,并且{{1长度字符串本身接近2GB。)如图所示:

2**31 - 1

我不相信有任何方法可以抓住>> "1" * (2**30) NoMemoryError: failed to allocate memory from /usr/lib/ruby/1.8/irb.rb:310:in `inspect' from /usr/lib/ruby/1.8/irb.rb:310:in `output_value' from /usr/lib/ruby/1.8/irb.rb:159:in `eval_input' from /usr/lib/ruby/1.8/irb.rb:271:in `signal_status' from /usr/lib/ruby/1.8/irb.rb:155:in `eval_input' from /usr/lib/ruby/1.8/irb/ruby-lex.rb:244:in `each_top_level_statement' from /usr/lib/ruby/1.8/irb/ruby-lex.rb:230:in `loop' from /usr/lib/ruby/1.8/irb/ruby-lex.rb:230:in `each_top_level_statement' from /usr/lib/ruby/1.8/irb/ruby-lex.rb:229:in `catch' from /usr/lib/ruby/1.8/irb/ruby-lex.rb:229:in `each_top_level_statement' from /usr/lib/ruby/1.8/irb.rb:154:in `eval_input' from /usr/lib/ruby/1.8/irb.rb:71:in `start' from /usr/lib/ruby/1.8/irb.rb:70:in `catch' from /usr/lib/ruby/1.8/irb.rb:70:in `start' from /usr/bin/irb:13 Maybe IRB bug!!

已更新,以反映sepp2k

的评论