【问题标题】:How to compute the size of the allocated memory for a general type如何计算一般类型的分配内存大小
【发布时间】:2013-01-20 23:42:00
【问题描述】:

我需要处理一些使用 csv 中的 read.table 读取的数据库(逗号分隔值),我想知道如何计算每种类型变量的分配内存大小。

怎么做?

编辑——换句话说:R 为从.csv 文件读取的一般数据帧分配多少内存?

【问题讨论】:

  • This post 可能有助于检查 R 会话中分配对象的内存。特别是 Tony Breyal 对 Dirk 函数的修改。
  • 我没有看到如何在纸上计算包含整数和分类变量的表格的大小。
  • 抱歉,以前从未听说有人想这样做。我应该误读了你的问题。
  • 我的问题是:如果我用眼睛查看 cvs 文件,我如何在纸上计算 R 分配多少内存?
  • 对于整数值,我认为大卫的答案是正确的。

标签: r


【解决方案1】:

您可以使用object.size 获取分配给对象的内存量。例如:

x = 1:1000
object.size(x)
# 4040 bytes

This script 也可能会有所帮助 - 它可以让您查看或绘制所有当前对象使用的内存量。

在回答您为什么object.size(4) 是 48 字节的问题时,原因是每个数字向量都有一些开销。 (在R 中,数字4 不像其他语言那样只是一个整数——它是一个长度为1 的数字向量)。但这不会影响性能,因为开销不会随着向量的大小而增加。如果你尝试:

> object.size(1:100000) / 100000
4.0004 bytes

这表明每个整数本身只需要 4 个字节(如您所料)。

因此,总结:

  • 对于长度为n 的数值向量,字节大小通常为40 + 8 * floor(n / 2)。然而,在我的 R 和 OS 版本上,有一个轻微的不连续性,它比您预期的快到 168 字节(见下图)。除此之外,线性关系仍然成立,即使是长度为 10000000 的向量。

    plot(sapply(1:50, function(n) object.size(1:n)))
    

  • 对于分类变量,您可以看到一个非常相似的线性趋势,但开销更大(见下文)。除了一些轻微的不连续性之外,这种关系非常接近400 + 60 * n

    plot(sapply(1:100, function(n) object.size(factor(1:n))))
    

【讨论】:

  • @alinsoar:你的问题是“为什么长度为 1 的数字向量占用 48 个字节”?
  • @alinsoar:我最新的编辑解释了为什么它是 48 字节。是否还有其他让您感到惊讶的原因?
  • 是的。您可以通过plot(sapply(1:100000, function(n) object.size(1:n))) 确认这一点,它显示了一个线性图。
  • @alinsoar:我在答案中展示了如何计算因子变量。由于我在上面的评论中解释的原因,最好对自己的变量执行object.size,而不是在纸上计算。
  • @alinsoar:无论如何,您应该在自己的机器上尝试我的plot 两行代码,以确保这与您的操作系统和 R 版本匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2015-09-02
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多