2012-04-09 22 views
23

¿Cuál es la mejor forma de obtener el tamaño de un hash determinado (o cualquier objeto realmente) en bytes en Ruby 1.9.3?Tamaño de memoria de un hash u otro objeto?

La solución para "Find number of bytes a particular Hash is using in Ruby" no parece ser válida en 1.9.3, porque memsize_of no se encuentra en la documentación de ObjectSpace.

+1

¿Quieres saber el tamaño recursivo, o solo el Hash en sí? Es decir, si ya tiene objetos almacenados en otras variables, pero también en el hash, ¿quiere considerar que contribuyen al tamaño del hash? (Tener un objeto en más de un lugar no usa el doble de memoria)./Solo estoy pensando en cómo hacer esto en la API C subyacente. – d11wtq

+1

Buena pregunta. Solo me interesa el hash en sí mismo y los valores de cadena que contiene. – bevanb

+0

pregunta parece similar a esto: http://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

Respuesta

31

ObjectSpace.memsize_ofdoes work en 1.9.3, documentados 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

Desafortunadamente, para 2.1.4 no lo hace. 'ObjectSpace.memsize_of (" a "* 23)' returns '0' – installero

+1

Esto es porque ahora representa la memoria fuera del montón de ruby ​​ – ciaoben

+6

¿Qué devuelve exactamente este método, el tamaño en bytes del objeto en la memoria? – ErikAGriffin

6

Una vez tuve el mismo problema. Debe tener en cuenta que el tamaño real es casi imposible de determinar, ya que depende de la máquina virtual que esté usando, qué versión de la máquina virtual, etc. Además, si está haciendo referencia a una cadena, que también se hace referencia en otro lugar, entonces la desconexión de su hash no significa que la cadena contenida específica también se desarmará, ya que ya se hace referencia a ella en otro lugar.

Una vez escribí un analizador para contar el tamaño estimado de los objetos, pasando por todos los objetos contenidos en el objeto dado. Como fuente de inspiración para escribir su propia:

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

mina funciona así:

require "rubygems" 
require "knjrbfw" 

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

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

este código existe error! debería ser así: 'analizador = Knj :: Memory_analyzer :: Object_size_counter.new (my_hash_object)' – comme

+0

Sí, gracias. He editado mi comentario. – kaspernj

Cuestiones relacionadas