28

Вопрос по ruby – Объем памяти хеша или другого объекта?

Каков наилучший способ получить размер заданного хеша (или любого другого объекта) в байтах в Ruby 1.9.3?

Решение & quot;Найти количество байтов, которые конкретный хеш использует в Ruby& Quot; не представляется действительным в 1.9.3, потому чтоmemsize_of нет в документации дляпространства объектов.

  • Error: User Rate Limit ExceededObjectSpace#memsize_ofError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededObjectSpace.memsize_of("a"*23)Error: User Rate Limit Exceeded0

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededanalyzer = Knj::Memory_analyzer::Object_size_counter.new(my_hash_object)

    от
  • Вы хотите узнать его размер рекурсивно или просто сам хэш? Я имею в виду, если у вас уже есть объекты, хранящиеся в других переменных, но также и в Hash, хотите ли вы рассматривать их как вклад в размер Hash? (Наличие одного объекта в более чем одном месте не использует вдвое больше памяти). / Просто думаю о том, как сделать это в базовом C API.

    от d11wtq
  • Вопрос похоже на это:stackoverflow.com/questions/3973094/…

    от joshnuss
  • Вы не должны предлагать денежную компенсацию за ответы на переполнение стека. Существует целая система стимулов, и деньги не являются ее частью.

    от Cezar
  • Хороший вопрос. Меня просто интересует сам хэш и содержащиеся в нем строковые значения.

    от bevanb
  • 38

    puts RUBY_VERSION #=>1.9.3

    ObjectSpace.memsize_of работает в 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
    

  • 8

    У меня когда-то была такая же проблема. Вы должны знать

    что реальный размер определить практически невозможно, поскольку он зависит от того, какую ВМ вы используете, какую версию ВМ и так далее. Кроме того, если вы ссылаетесь на строку, на которую также ссылаются где-то еще, то удаление вашего хэша не означает, что конкретная содержащаяся строка также будет сброшена, поскольку на нее уже ссылаются где-то еще.

    Однажды я написал анализатор для подсчета приблизительного размера объектов, просматривая все содержащиеся в данном объекте объекты. Вдохновитесь, чтобы написать свой собственный:

    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}"