/ / Gli oggetti Ruby hanno un limite di dimensioni? - rubino

Gli oggetti Ruby hanno un limite di dimensioni? - rubino

Sto costruendo alcune stringhe di grandi dimensioni che hanno una durata breve all'interno dell'applicazione. Gli oggetti String cresceranno arbitrariamente fino ai limiti fisici dell'istanza ruby?

Quello che mi chiedo è se, senza alcun intervento nel limitare la dimensione della stringa, la mia applicazione verrebbe cancellata esaurendo la memoria, o se si degraderebbe con grazia.

Grazie per qualsiasi input!

risposte:

10 per risposta № 1

C'è un limite UN String può essere 2**31 - 1 (e di conseguenza 2**63 - 1 su 64 bit ruby). Puoi vedere il limite con:

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

Detto questo, mentre potresti provare ad allocareuna stringa così grande probabilmente non riuscirà (almeno su un sistema a 32 bit poiché in genere la quantità massima di memoria che un processo può allocare è compresa tra 2,5 e 3 GB e un 2**31 - 1 la stringa di lunghezza è quasi 2 GB da sola.) Come visto:

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

Non credo che ci sia un modo per catturare il NoMemoryError.

Aggiornato per riflettere il commento di sepp2k