40

在 Ruby 1.9.3 中以字节为单位获取给定哈希(或任何对象)大小的最佳方法是什么?

查找特定哈希在 Ruby 中使用的字节数”的解决方案在 1.9.3 中似乎无效,因为memsize_of它不在ObjectSpace的文档中。

4

3 回答 3

54

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
于 2014-01-23T21:39:11.917 回答
11

我曾经遇到过同样的问题。您必须知道,实际大小几乎无法确定,因为它取决于您使用的虚拟机、虚拟机的版本等。此外,如果您正在引用一个字符串,该字符串也在其他地方被引用,那么取消设置您的哈希并不意味着特定包含的字符串也将被取消设置,因为它已经在其他地方引用。

我曾经写过一个分析器,通过遍历给定对象中所有包含的对象来计算对象的估计大小。获得灵感来编写自己的:

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}"
于 2013-04-04T09:32:59.313 回答
-3

粗略估计散列大小的另一种方法是将其转换为字符串并计算字符数,每个字符将是一个字节。

hash = {hello:  "world"}
=> {:hello=>"world"}
hash.to_s
=> "{:hello=>\"world\"}"
hash.to_s.size
=> 17

然后您可以使用字符到字节/兆字节计算器

于 2019-11-11T06:49:19.457 回答