我想创建一个哈希
,但我只对键
感兴趣。因此,我希望 values
具有尽可能最小的内存占用。最适合分配的对象是什么?
无
?- 像
:a
这样很短的符号 ? - 更小的东西?
最佳答案
您可以使用任何您想要的值,只要您使用相同的值即可。
x = "A string value"
h = Hash[ 10000.times.map{|i| [i, x]} ]
h2 = Hash[ 10000.times.map{|i| [i, nil]} ]
# h takes the same memory as h2
在上面的例子中,x
可以是你喜欢的任何东西。这些值将只保存指向 x
的指针,或者如果 x
是一个立即值(nil
,true
、false
或 Fixnum
)。
无论哪种情况,使用的内存都是相同的!它将是您平台上指针的大小(即 0.size
字节)。在 C 代码中,这对应于 VALUE
。
请注意重复使用相同的对象(即相同的 object_id
)并且不要每次都创建一个新对象。例如:
h3 = Hash[ 10000.times.map{|i| [i, "A string value"]} ]
# => h3 will take a lot more space!
h.values.map(&:object_id).uniq.size # => 1
h3.values.map(&:object_id).uniq.size # => 10000
简而言之,一个可靠的方法是使用false
、true
、nil
、Fixnum
或Symbol
,因为符号存储在全局表中。 :hello.object_id
在任何地方都是相同的,字符串 'hello'
只存储一次并为代码中的所有 :hello
符号共享.
h4 = Hash[ 10000.times.map{|i| [i, :some_symbol]} ]
# => h4 will only take as much space as h and h2
h4.values.map(&:object_id).uniq.size # => 1
仅供引用,内置库 Set
具有相同的要求,即它仅对键使用 Hash
。为简单起见,它使用 true
作为值。
关于ruby - 可以分配给变量的最低内存占用对象是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736048/