Ruby对象有大小限制吗?

我正在构建一些在应用程序中具有短寿命的大字符串。 String对象会不断增长到ruby实例的物理极限?

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

谢谢你的任何输入!

有一个限制。 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 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的评论