我正在构建一些在应用程序中具有短寿命的大字符串.String对象是否会随意增大,直到ruby实例的物理极限?
我想知道的是,如果在没有任何干预限制字符串大小的情况下,我的应用程序会因内存不足而受到冲击,或者它是否会优雅地降级.
感谢您的任何意见!
rjk*_*rjk 11
有一个限制.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
Run Code Online (Sandbox Code Playgroud)
话虽如此,虽然你可以尝试分配一个很大的字符串,但它可能会失败(至少在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!!
Run Code Online (Sandbox Code Playgroud)
我不相信有任何方法可以赶上NoMemoryError.
更新以反映sepp2k的评论
| 归档时间: |
|
| 查看次数: |
3222 次 |
| 最近记录: |