查找Ruby Arrays的内存分配

时间:2014-12-31 06:18:39

标签: ruby memory-size

我想找出数据类型消耗的内存(以字节为单位)。我在整数上调用了size方法。由于我运行的是64位机器,因此返回8。

1.size # => 8

类似地,对于字符串和数组,它返回每个字符/整数1个字节。

'a'.size # => 1
['a'].size # => 1
['a', 1].size # => 2
  1. 为什么浮动没有尺寸方法?
  2. 不应该像['a', 1]这样的异构数组返回1 + 8 = 9 bytes(1表示char,8表示整数)?
  3. 调用size检查分配给ruby数据类型的内存是否正确?

3 个答案:

答案 0 :(得分:8)

我认为您正在寻找MRI内存使用情况。 Ruby有ObjectSpace:objspace库扩展了ObjectSpace模块并添加了几个方法来获取有关对象/内存管理的内部统计信息。

  

您需要'objspace'才能使用此扩展模块。

您将获得以下内容:

 > require 'objspace'
 => true 
 > ObjectSpace.memsize_of(Array)
 => 5096 
 > ObjectSpace.memsize_of(Hash)
 => 3304 
 > ObjectSpace.memsize_of(String)
 => 6344 
 > ObjectSpace.memsize_of(Integer)
 => 1768 

注意: 通常,如果您不了解MRI实施,不应该使用此库。主要是,该库适用于需要了解MRI内存使用情况的(内存)分析器开发人员和MRI开发人员。

答案 1 :(得分:4)

这两种方法适用于两种不同的数据类型。

在例如1中,您将size应用于fixnum。这个方法:

Returns the number of bytes in the machine representation of fix.

来源:http://www.ruby-doc.org/core-2.2.0/Fixnum.html#method-i-size

但是,与数组一起使用时,sizelength的别名。在这里:http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-size。其中:

Returns the number of elements in self. May be zero.

答案 2 :(得分:2)

Array#size返回Array的元素数,而不是分配的内存。