Размер памяти хэша или другого объекта?
Каков наилучший способ получить размер данного хэша (или любого объекта по-настоящему) в байтах в Ruby 1.9.3?
Решение " Найти количество байтов, которое используется в Hash, используется в Ruby ", похоже, недействительно в 1.9.3, поскольку memsize_of
отсутствует в документации для ObjectSpace.
Ответы
Ответ 1
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
Ответ 2
У меня когда-то была такая же проблема. Вы должны знать, что реальный размер практически невозможно определить, поскольку он зависит от того, какую виртуальную машину вы используете, какую версию 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}"