アプリケーション内で寿命の短い大きな文字列をいくつか構築しています。Stringオブジェクトは、rubyインスタンスの物理的限界まで任意に大きくなるでしょうか。
私が疑問に思っているのは、文字列サイズを制限することに何の介入もしなければ、私のアプリケーションがメモリ不足に陥ることになるのか、それとも適切に劣化するのかということです。
入力をありがとう!
回答:
回答№1の場合は10制限があります。 A String
することができます 2**31 - 1
(そしてそれに応じて 2**63 - 1
64ビットルビー)あなたは限界を見ることができます:
>> 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