如何在ruby中计算或找到变量占用的存储空间?

时间:2018-01-16 09:00:20

标签: ruby-on-rails ruby

来自样本红宝石代码,如:

a = 0.0
a = nil  

现在,我想知道变量' a'当它的价值是' 0.0'当它在'nil'中的价值时。谢谢。

2 个答案:

答案 0 :(得分:3)

我所知道的最接近现实的方法是使用操作系统的内存报告。以下内容可能仅适用于MRI。

▶ def report
▷   puts 'Memory ' + `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.
▷     strip.split.map(&:to_i)[1].to_s + 'KB'  
▷ end  
▶ report
#⇒ Memory 90276KB
▶ a = nil && report
#⇒ Memory 90712KB
▶ a = nil && report
#⇒ Memory 90712KB   NB!!! NOT CHANGED!
▶ a = "a" && report
#⇒ Memory 90908KB
▶ a = "a" && report
#⇒ Memory 91096KB   NB!!! CHANGED!!
▶ a = "a" && report
#⇒ Memory 91388KB   NB!!! CHANGED!!
▶ ObjectSpace.garbage_collect && report
#⇒ Memory 91512KB   NB!!! INCREASED!!!

也就是说,没有办法确定对象占用多少空间。消耗的内存量将是:

的总和
  • 堆中分配的内存量
  • RValue需要声明变量
  • ruby​​内部内存分配器,负责处理Ruby堆(以及它们运行的​​堆)

后者是不可预测的,无法根据数据大小预测/计算。当有足够数量的Ruby插槽时,短字符串可能需要零个字节。

请注意,RValue被分配在所谓的Ruby Heap中,并且此内存永远不会返回到操作系统。永远不会意味着永远。

答案 1 :(得分:1)

ObjectSpace.memsize_of在1.9.3中有效,有无论是否记录:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /server/getTransaction/123
       Parameters = {}
          Headers = {}

来源:Memory size of a hash or other object?