2012-04-09 17 views
23

Jaki jest najlepszy sposób na uzyskanie rozmiaru danego skrótu (lub dowolnego obiektu naprawdę) w bajtach w Rubim 1.9.3?Wielkość pamięci hasha lub innego obiektu?

Rozwiązanie "Find number of bytes a particular Hash is using in Ruby" nie wydaje się być poprawne w wersji 1.9.3, ponieważ memsize_of nie znajduje się w dokumentacji dla ObjectSpace.

+1

Chcesz wiedzieć rozmiar rekurencyjnie, czy po prostu sam Hash? Mam na myśli, jeśli masz już obiekty przechowywane w innych zmiennych, ale także w mieszaniu, czy chcesz je uważać za przyczyniające się do rozmiaru hasza? (Posiadanie jednego obiektu w więcej niż jednym miejscu nie wymaga dwukrotnej pamięci)./Po prostu zastanawiam się, jak to zrobić w bazowym C API. – d11wtq

+1

Dobre pytanie. Interesuje mnie sam skrót i zawarte w nim wartości ciągów. – bevanb

+0

Pytanie wydaje się podobny do tego: http://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

Odpowiedz

31

ObjectSpace.memsize_ofdoes work w 1.9.3, udokumentowane lub nie:

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

Niestety, dla wersji 2.1.4 tego nie robi. 'ObjectSpace.memsize_of (" a "* 23)' zwraca '0' – installero

+1

Dzieje się tak, ponieważ teraz reprezentuje pamięć poza stosem ruby. – ciaoben

+6

Co dokładnie zwraca ta metoda, rozmiar w bajtach obiektu w pamięci? – ErikAGriffin

6

Raz miałem ten sam problem. Musisz mieć świadomość, że rzeczywisty rozmiar jest prawie niemożliwy do ustalenia, ponieważ zależy to od używanej maszyny wirtualnej, której wersji maszyny wirtualnej i tak dalej. Ponadto, jeśli odwołujesz się do łańcucha znaków, który jest również przywoływany gdzie indziej, wówczas wyłączenie hasza nie oznacza, że ​​określony łańcuch będzie również unieważniony, ponieważ jest już przywoływany gdzie indziej.

Kiedyś napisałem analizator, aby policzyć szacowany rozmiar obiektów, przechodząc przez wszystkie zawarte obiekty w danym obiekcie. Zainspiruj napisać własny:

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

Kopalnia działa tak:

require "rubygems" 
require "knjrbfw" 

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

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

ten kod istnieje błąd! powinno być tak: 'analyzer = Knj :: Memory_analyzer :: Object_size_counter.new (my_hash_object)' – comme

+0

Tak - dziękuję. Zmieniłem swój komentarz. – kaspernj

Powiązane problemy