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 № 1Jest 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