2012-04-09 19 views
23

Was ist der beste Weg, um die Größe eines gegebenen Hash (oder irgendein Objekt wirklich) in Bytes in Ruby 1.9.3 zu erhalten?Speichergröße eines Hash oder eines anderen Objekts?

Die Lösung zu "Find number of bytes a particular Hash is using in Ruby" scheint in 1.9.3 nicht gültig zu sein, da memsize_of nicht in der Dokumentation für ObjectSpace enthalten ist.

+1

Wollen Sie wissen, die Größe davon rekursiv oder nur der Hash selbst? Ich meine, wenn Sie bereits Objekte in anderen Variablen, aber auch im Hash gespeichert haben, möchten Sie sie als Beitrag zur Hash-Größe betrachten? (Wenn Sie ein Objekt an mehr als einer Stelle haben, wird nicht doppelt so viel Speicher belegt)./Ich denke nur darüber nach, wie dies in der zugrunde liegenden C-API zu tun ist. – d11wtq

+1

Gute Frage. Ich interessiere mich nur für den Hash selbst und die darin enthaltenen String-Werte. – bevanb

+0

Frage scheint dies ähnlich: http://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

Antwort

31

ObjectSpace.memsize_ofdoes work in 1.9.3, dokumentiert oder nicht:

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

Leider, für 2.1.4 tut es nicht. 'ObjectSpace.memsize_of (" a "* 23)' gibt '0' zurück – installero

+1

Dies liegt daran, dass es jetzt den Speicher außerhalb des Ruby-Heaps darstellt. – ciaoben

+6

Was genau liefert diese Methode, die Größe des Objekts im Speicher in Byte? – ErikAGriffin

6

Ich hatte einmal das gleiche Problem. Sie müssen sich bewusst sein, dass die tatsächliche Größe fast unmöglich zu bestimmen ist, da es davon abhängt, welche VM Sie verwenden, welche Version der VM und so weiter. Wenn Sie auf einen String verweisen, auf den auch anderswo verwiesen wird, bedeutet dies nicht, dass der betreffende enthaltene String auch nicht gesetzt ist, da er bereits anderweitig referenziert wurde.

Ich habe einmal einen Analysator geschrieben, um die geschätzte Größe von Objekten zu zählen, indem ich alle enthaltenen Objekte in dem gegebenen Objekt durchlaufe. Lassen Sie sich inspirieren schreiben Ihre eigenen:

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

-Mine funktioniert wie folgt:

require "rubygems" 
require "knjrbfw" 

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

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

dieser Code existiert Fehler! Es sollte so sein: 'analyzer = Knj :: Memory_analyzer :: Object_size_counter.new (mein_hash_object)' – comme

+0

Ja - danke. Ich habe meinen Kommentar bearbeitet. – kaspernj

Verwandte Themen