/ / Czy obiekty Ruby mają limit rozmiaru? - rubinowy

Czy obiekty Ruby mają limit rozmiaru? - rubin

Buduję jakieś duże łańcuchy, które mają krótką żywotność w aplikacji. Czy obiekty String zwiększą się dowolnie do fizycznych granic instancji ruby?

Zastanawiam się, czy bez interwencji w ograniczanie rozmiaru łańcucha moja aplikacja zostałaby zablokowana z powodu braku pamięci lub czy mogłaby się z wdziękiem degradować.

Dzięki za wszelkie dane wejściowe!

Odpowiedzi:

10 dla odpowiedzi № 1

Jest limit. ZA String może być 2**31 - 1 (i odpowiednio 2**63 - 1 na 64-bitowym ruby). Możesz zobaczyć limit za pomocą:

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

Powiedziawszy to, możesz spróbować przydzielićtak duży ciąg prawdopodobnie zawiedzie (przynajmniej w systemie 32-bitowym, ponieważ zazwyczaj maksymalna ilość pamięci, jaką proces może przydzielić, wynosi od 2,5 do 3 GB, a 2**31 - 1 długość łańcucha sama w sobie jest prawie 2 GB.) Jak widać:

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

Nie wierzę, że jest jakiś sposób na złapanie NoMemoryError.

Zaktualizowano w celu odzwierciedlenia komentarza z sepp2k