2012-04-09 4 views
23

Qual è il modo migliore per ottenere le dimensioni di un dato hash (o qualsiasi oggetto) in byte in Ruby 1.9.3?Dimensioni di memoria di un hash o di un altro oggetto?

La soluzione a "Find number of bytes a particular Hash is using in Ruby" non sembra essere valida in 1.9.3, perché memsize_of non è nella documentazione per ObjectSpace.

+1

Vuoi sapere la dimensione di esso in modo ricorsivo, o solo l'Hash stesso? Voglio dire, se hai già degli oggetti memorizzati in altre variabili, ma anche nell'Hash, vuoi considerarli come contributi alla dimensione di Hash? (Avere un oggetto in più di un posto non usa il doppio della memoria)./Sto solo pensando a come farlo nell'API C sottostante. – d11wtq

+1

Buona domanda. Mi interessa solo l'hash stesso e i valori di stringa in esso contenuti. – bevanb

+0

domanda sembra simile a questo: http://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

risposta

31

ObjectSpace.memsize_ofdoes work a 1.9.3, documentata o no:

puts RUBY_VERSION #=>1.9.3 

require 'objspace' 

p ObjectSpace.memsize_of("a"*23) #=> 23 
p ObjectSpace.memsize_of("a"*24) #=> 24 
p ObjectSpace.memsize_of("a".*1000) #=> 1000 
h = {"a"=>1, "b"=>2} 
p ObjectSpace.memsize_of(h)   #=> 116 
+1

Sfortunatamente, per 2.1.4 non lo è. 'ObjectSpace.memsize_of (" a "* 23)' restituisce '0' – installero

+1

Questo perché ora rappresenta la memoria al di fuori del mucchio di rubini – ciaoben

+6

Cosa restituisce esattamente questo metodo, la dimensione in byte dell'oggetto in memoria? – ErikAGriffin

6

Una volta ho avuto lo stesso problema. Devi essere consapevole che la dimensione reale è quasi impossibile da determinare, poiché dipende dalla VM che stai utilizzando, dalla versione della VM e così via. Inoltre, se si fa riferimento a una stringa, viene fatto riferimento anche da qualche altra parte, quindi il disinserimento dell'hash non significa che anche la stringa specifica contenuta sarà disinserita, poiché è già referenziata da qualche altra parte.

Una volta ho scritto un analizzatore per contare le dimensioni stimate degli oggetti, passando attraverso tutti gli oggetti contenuti nell'oggetto dato. Trarre ispirazione per scrivere il proprio:

https://github.com/kaspernj/knjrbfw/blob/master/lib/knj/memory_analyzer.rb#L334

miniera funziona così:

require "rubygems" 
require "knjrbfw" 

analyzer = Knj::Memory_analyzer::Object_size_counter.new(my_hash_object) 

puts "Size: #{analyzer.calculate_size}" 
+1

questo codice esiste errore! dovrebbe essere così: 'analyzer = Knj :: Memory_analyzer :: Object_size_counter.new (my_hash_object)' – comme

+0

Sì - grazie. Ho modificato il mio commento. – kaspernj

Problemi correlati