哈希或其他对象的内存大小?

bev*_*anb 30 ruby

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

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

ste*_*lag 39

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
Run Code Online (Sandbox Code Playgroud)

  • 这个方法究竟返回了什么,内存中对象的大小(以字节为单位)? (12认同)
  • 甚至`ObjectSpace#memsize_of`的doc页面也没有列出单位是什么.令人难以置信的是必须寻找基本的东西. (5认同)
  • **ObjectSpace.memsize_of 返回字节**。我将结果与 `NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample` 进行了比较,后者给出了以 MB 为单位的结果([证明](https://github.com/newrelic/rpm/blob/2bc79e102185861ff078fd15ccbf31a32f088b8a /lib/new_relic/agent/samplers/memory_sampler.rb#L111)) 并得出两者之间的比率为 `1024*1024`。因此它是字节。 (3认同)
  • 不幸的是,对于2.1.4它不是.`ObjectSpace.memsize_of("a"*23)`返回`0` (2认同)
  • 这是因为现在它代表了ruby堆之外的内存 (2认同)

kas*_*rnj 10

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

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

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}"
Run Code Online (Sandbox Code Playgroud)

  • 此代码存在错误!它应该是这样的:`analyzer = Knj :: Memory_analyzer :: Object_size_counter.new(my_hash_object)` (3认同)