Ruby 1.9.3で特定のハッシュ(または実際には任意のオブジェクト)のサイズをバイト単位で取得するための最良の方法は何ですか?
「特定のハッシュがRubyで使用しているバイト数を検索する」の解決策は、 ObjectSpacememsize_of
のドキュメントにないため、1.9.3では有効ではないようです。
Ruby 1.9.3で特定のハッシュ(または実際には任意のオブジェクト)のサイズをバイト単位で取得するための最良の方法は何ですか?
「特定のハッシュがRubyで使用しているバイト数を検索する」の解決策は、 ObjectSpacememsize_of
のドキュメントにないため、1.9.3では有効ではないようです。
ObjectSpace.memsize_of
文書化されているかどうかにかかわらず、1.9.3で機能します。
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
私はかつて同じ問題を抱えていました。実際のサイズは、使用しているVM、VMのバージョンなどによって異なるため、実際のサイズを決定することはほとんど不可能であることに注意する必要があります。また、別の場所でも参照されている文字列を参照している場合、ハッシュの設定を解除しても、含まれている特定の文字列もすでに別の場所で参照されているため、設定が解除されるわけではありません。
私はかつて、オブジェクトに含まれるすべてのオブジェクトを調べて、オブジェクトの推定サイズをカウントするアナライザーを作成しました。自分で書くためのインスピレーションを得る:
https://github.com/kaspernj/knjrbfw/blob/master/lib/knj/memory_analyzer.rb#L334
私の作品は次のようになります。
require "rubygems"
require "knjrbfw"
analyzer = Knj::Memory_analyzer::Object_size_counter.new(my_hash_object)
puts "Size: #{analyzer.calculate_size}"
ハッシュのサイズを大まかに見積もる別の方法は、ハッシュを文字列に変換して文字数を数えることです。各文字は1バイトになります。
hash = {hello: "world"}
=> {:hello=>"world"}
hash.to_s
=> "{:hello=>\"world\"}"
hash.to_s.size
=> 17
次に、文字からバイト/メガバイトの計算機を使用できます