ruby - 可以分配给变量的最低内存占用对象是多少?

标签 ruby

我想创建一个哈希,但我只对感兴趣。因此,我希望 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 是一个立即值(niltruefalseFixnum)。

无论哪种情况,使用的内存都是相同的!它将是您平台上指针的大小(即 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

简而言之,一个可靠的方法是使用falsetruenilFixnumSymbol,因为符号存储在全局表中。 :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/

相关文章:

Mysql 查询使用 Rails 返回数组?

ruby-on-rails - 如何设置延迟作业和事件作业队列中的优先级?

ruby-on-rails - SimpleForm 标签将我的文本大写。如何预防?

java - 在 Java 中运行 JRuby 代码是否需要安装 JRuby?

Ruby - 确定方法来源?

ruby - 使用范围迭代数组

ruby - Ruby 中的非阻塞 SSL 套接字协商。可能的?

ruby-on-rails - 运行 ruby​​ 脚本时,Heroku 上的 Ruppell 套接字崩溃(权限被拒绝)

ruby - if + else 和 if -> unless 不一致

mysql - Rails 从列名中包含特殊字符的 csv 创建表