2012-04-09 27 views
23

Cách tốt nhất để lấy kích thước của một băm đã cho (hoặc bất kỳ đối tượng nào thực sự) bằng byte trong Ruby 1.9.3?Kích thước bộ nhớ của một băm hoặc đối tượng khác?

Giải pháp cho "Find number of bytes a particular Hash is using in Ruby" có vẻ không hợp lệ trong 1.9.3, vì memsize_of không có trong tài liệu cho ObjectSpace.

+1

Bạn có muốn biết kích thước của nó đệ quy, hoặc chỉ là bản thân Hash? Tôi có nghĩa là, nếu bạn đã có các đối tượng được lưu trữ trong các biến khác, nhưng cũng trong Hash, bạn có muốn xem xét chúng như là đóng góp cho kích thước Hash? (Có một đối tượng ở nhiều nơi không sử dụng bộ nhớ gấp đôi)./Chỉ cần suy nghĩ về cách thực hiện điều này trong API C cơ bản. – d11wtq

+1

Câu hỏi hay. Tôi chỉ quan tâm đến bản thân hàm băm và các giá trị chuỗi chứa trong đó. – bevanb

+0

Câu hỏi có vẻ tương tự như sau: http://stackoverflow.com/questions/3973094/how-to-measure-the-size-of-a-ruby-object – joshnuss

Trả lời

31

ObjectSpace.memsize_ofdoes work trong 1.9.3, ghi nhận hay không:

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

Thật không may, cho 2.1.4 nó không. 'ObjectSpace.memsize_of (" a "* 23)' trả về '0' – installero

+1

Điều này là bởi vì bây giờ nó đại diện cho bộ nhớ bên ngoài của đống ruby ​​ – ciaoben

+6

Chính xác thì phương thức này trả về, kích thước tính bằng byte của đối tượng trong bộ nhớ? – ErikAGriffin

6

Tôi đã từng gặp vấn đề tương tự. Bạn phải nhận thức được rằng kích thước thật là gần như không thể xác định, vì nó phụ thuộc vào VM bạn đang sử dụng, phiên bản nào của VM và vân vân. Ngoài ra, nếu bạn đang tham chiếu một chuỗi, cũng được tham chiếu ở một nơi khác, sau đó unsetting băm của bạn không có nghĩa là chuỗi chứa cụ thể cũng sẽ không được đặt, vì nó đã được tham chiếu ở một nơi khác.

Tôi đã từng viết một bộ phân tích để đếm kích thước ước tính của các đối tượng, bằng cách đi qua tất cả các đối tượng chứa trong đối tượng đã cho. Lấy cảm hứng để viết riêng của bạn:

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

Mine làm việc như thế này:

require "rubygems" 
require "knjrbfw" 

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

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

lỗi này tồn tại! nó phải như thế này: 'analyzer = Knj :: Memory_analyzer :: Object_size_counter.new (my_hash_object)' – comme

+0

Có - cảm ơn. Tôi đã chỉnh sửa bình luận của mình. – kaspernj

Các vấn đề liên quan