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