【问题标题】:Is there a way to guess the size of data.frame based on rows, columns and variable types?有没有办法根据行、列和变量类型来猜测 data.frame 的大小?
【发布时间】:2015-10-13 23:26:08
【问题描述】:

我希望生成大量数据,然后将其捕获 R。如何通过行数、列数和变量类型来估计 data.frame 的大小(以及所需的内存)?

示例。

如果我有 10000 行和 150 列,其中 120 个是数字,20 个是字符串,10 个是因子级别,我可以预期的数据框大小是多少?结果是否会根据列中存储的数据而改变(如max(nchar(column)))?

> m <- matrix(1,nrow=1e5,ncol=150)
> m <- as.data.frame(m)
> object.size(m)
120009920 bytes
> a=object.size(m)/(nrow(m)*ncol(m))
> a
8.00066133333333 bytes
> m[,1:150] <- sapply(m[,1:150],as.character)
> b=object.size(m)/(nrow(m)*ncol(m))
> b
4.00098133333333 bytes
> m[,1:150] <- sapply(m[,1:150],as.factor)
> c=object.size(m)/(nrow(m)*ncol(m))
> c
4.00098133333333 bytes
> m <- matrix("ajayajay",nrow=1e5,ncol=150)
> 
> m <- as.data.frame(m)
> object.size(m)
60047120 bytes
> d=object.size(m)/(nrow(m)*ncol(m))
> d
4.00314133333333 bytes

【问题讨论】:

  • 我做了以下并得到以下内容来获取每个变量类型的字节数

标签: r memory objectsize


【解决方案1】:

您可以使用object.size 模拟一个对象并计算用于将其存储为 R 对象的内存的估计值:

m <- matrix(1,nrow=1e5,ncol=150)
m <- as.data.frame(m)
m[,1:20] <- sapply(m[,1:20],as.character)
m[,29:30] <- sapply(m[,29:30],as.factor)
object.size(m)
120017224 bytes
print(object.size(m),units="Gb")
0.1 Gb

【讨论】:

  • 我想关键是要知道大小创建它。
  • @nicola 这是一个估计。假设内存分配是线性函数,您可以用作参考..
  • 此解决方案有效,因为在做了一些示例后,用户将能够更好地估计其他情况下的输出。
  • 是的,但是生成一个与我们想要创建的对象如此相似的对象有什么意义呢?可以创建对象并查看。我想也许人们可以看到单一类型的单个列需要多少空间并进行一些数学运算。这甚至可能适用于非常大的对象。
  • @nicola 很好,但我认为您过于简化了内存的分配方式,我不知道您所说的 some math 是什么意思,但我认为您不能使用一些添加来获取大小内存.. 看看memory.profile()
【解决方案2】:

您可以创建虚拟变量来存储您将存储在数据框中的数据示例。

然后使用object.size() 找到它们的大小并相应地与行和列相乘。

【讨论】:

    【解决方案3】:

    也可以查看pryr 包。它有object_size,这对你来说可能稍微好一点。来自advanced R

    此函数比内置的 object.size() 更好,因为它考虑了对象内的共享元素并包括环境的大小。

    您还需要考虑attributes 的大小以及列类型等。

    object.size(attributes(m))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多