gpt4 book ai didi

ruby - Ruby 对象有大小限制吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:44 25 4
gpt4 key购买 nike

我正在构建一些在应用程序中生命周期很短的大字符串。 String 对象会增长到任意大到 ruby​​ 实例的物理限制吗?

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

感谢任何输入!

最佳答案

有一个限制。 String 可以是 2**31 - 1(相应地 2**63 - 1 在 64 位 ruby​​ 上)。您可以通过以下方式查看限制:

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

已更新以反射(reflect)来自 sepp2k 的评论

关于ruby - Ruby 对象有大小限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com