Ruby对象是否有大小限制?

问题描述:

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

我想知道的是,如果没有任何限制字符串大小的干预,我的应用程序就会因为内存不足而崩溃,或者它是否会优雅地退化。

感谢您的任何意见!

有一个限制。 A String可以是2**31 - 1(因此在64位ruby中为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和2**31 - 1长度的字符串之间几乎2GB)可以看出:

>> "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!! 

我不相信有什么办法赶NoMemoryError

更新以反映从sepp2k

+3

注释实际上它可以大如'2 ** 31 - 1'(并相应地'2 ** 63 - 1'在64位红宝石)。 – sepp2k 2010-09-03 19:23:11

+0

是'2 ** 31 - 1'字符还是'2 ** 31 -1'字节?另外,不是在说'救援异常'而不是'救援'(后者只是挽救相对温和的异常)而不是捕获'NoMemoryError'? (不要说neversaydie ......) – 2010-09-04 05:11:42

+0

'2 ** 31 - 1'字节。包括'rescue exception'确实会捕获'NoMemoryError',但它似乎并没有真正执行分配(因为它立即返回)。 – rjk 2010-09-04 17:04:09