2012-04-09 11 views
23

Ruby 1.9.3では、指定されたハッシュ(または実際にオブジェクト)のサイズをバイト単位で取得するにはどうすればよいですか?ハッシュまたは他のオブジェクトのメモリサイズ?

ObjectSpaceのマニュアルに記載されていないため、「Find number of bytes a particular Hash is using in Ruby」の解決策は1.9.3で有効ではありません。

+1

はあなたが知りたいですそれの大きさは再帰的に、あるいはハッシュそのものだけですか?つまり、既に他の変数に格納されているオブジェクトだけでなく、ハッシュにもオブジェクトが格納されていれば、ハッシュサイズに貢献しているとみなしたいのですか? (複数の場所に1つのオブジェクトを持つことはメモリの2倍を使用しない)。 /基本的なC APIでこれを行う方法について考えてみてください。 – d11wtq

+1

良い質問です。私はちょうどハッシュ自体とその中に含まれている文字列の値に興味があります。 – bevanb

+0

質問は次のように思える: あなたがのために金銭的な補償を提供することになっていませんhttp://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

答えて

31

ObjectSpace.memsize_ofdoes work、文書かどうか:

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

残念ながら、2.1.4ではそれはありません。 'ObjectSpace.memsize_of(" a * 23) 'は' 0'を返します – installero

+1

これはルビのヒープ外のメモリを表すためです – ciaoben

+6

このメソッドは正確に何を返しますか?メモリ内のオブジェクトのバイト単位のサイズですか? – ErikAGriffin

6

私はかつて同じ問題を抱えていました。実際のサイズは、使用しているVM、使用しているVMのバージョンなどによって異なりますので、実際のサイズはほとんど決定できません。また、他の場所で参照されている文字列を参照している場合は、ハッシュを解除しても、既に含まれている特定の文字列も設定されていないことにはなりません。

私はかつてオブジェクトの推定サイズをカウントするアナライザーを作成しました。あなた自身を書くためにインスピレーションを得る:

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

鉱山は、このように動作します:1.9.3で

require "rubygems" 
require "knjrbfw" 

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

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

このコードはエラーです! 'analyzer = Knj :: Memory_analyzer :: Object_size_counter.new(my_hash_object)' – comme

+0

はい - ありがとうございます。私は私のコメントを編集しました。 – kaspernj

関連する問題