У объектов Ruby есть ограничение по размеру? - PullRequest
9 голосов
/ 03 сентября 2010

Я строю несколько больших строк, которые имеют короткий срок жизни в приложении.Будут ли объекты String расти сколь угодно большими до физических пределов экземпляра ruby?

Что мне интересно, так это то, что без какого-либо вмешательства в ограничение размера строки мое приложение зависло бы из-за нехватки памяти или из-за того, что оно изящно ухудшилось.

Спасибо за любыеввод!

1 Ответ

11 голосов
/ 03 сентября 2010

Есть ограничение. A 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 до 3 ГБ и 2**31 - 1 Длина строки сама по себе составляет почти 2 ГБ.) Как видно:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...