【问题标题】:Object size discrepancy对象大小差异
【发布时间】:2011-10-12 00:57:10
【问题描述】:

我试图弄清楚为什么我保存为 .rda 的某些数组似乎比同等大小的其他数组消耗更多的内存。下面是大小、类型和维度相同的两个对象 x 和 y。当我保存每一个时,一个是 41 Mb,另一个是 6 Mb。谁能想到会发生这种情况的原因?

> dim(x)
[1]    71    14 10000
> dim(y)
[1]    71    14 10000 
> class(x)
[1] "array"
> class(y)
[1] "array"  
> object.size(y)
79520208 bytes
> object.size(x)
79520208 bytes

【问题讨论】:

  • str(x)str(y) 怎么说?
  • 或者更好的是,您使用什么命令来生成 x 和 y?

标签: r


【解决方案1】:

如果您使用savesaveRDS 命令保存,则默认使用压缩。如果向量中有不同的内容,它们的压缩方式也会不同...

尝试savecompress=FALSE 并再次比较...

在下面的示例中,文件大小几乎相差 700 倍:

set.seed(42)
x <- runif(1e6)  # random values should not compress well...
y <- rep(0, 1e6) # zeroes should compress very well...
object.size(x) # 8000040 bytes
object.size(y) # 8000040 bytes

save('x', file='x.rds')
save('y', file='y.rds')
file.info(c('x.rds', 'y.rds'))$size
#[1] 5316773    7838

save('x', file='x.rds', compress=FALSE)
save('y', file='y.rds', compress=FALSE)
file.info(c('x.rds', 'y.rds'))$size
#[1] 8000048 8000048

【讨论】:

  • 如果它与其他人相关:readr::write_rds() 默认不压缩 - 它不能与 saveRDS() 互换。
【解决方案2】:

它们都可以是字符数组、列表或数据框。或者一个可以是字符(一个或两个字节是最小元素大小,而 otehr 可以是数字(每个元素 8 个字节)或者更大的一个可以有大字符元素.....或各种其他可能性。我得到与您的结果有些相同:

x <- array(runif( 71* 14 *10000), dim = c(71 ,   14, 10000) )
 save(x, file="test.rda")
 object.size(x)
# 79520208 bytes  and the file is over 50 MB
x <- array(sample(letters, 71* 14 *10000, replace=TRUE), dim = c(71 ,   14, 10000) )
 save(x, file="test2.rda")
 object.size(x)
# 79521456 bytes   and the file is around 8 MB

【讨论】:

  • 我在第一次尝试时找不到链接,但我暗中怀疑这在 r-help 上至少出现了几次。
  • 嗯。它们都是数字。在 41Mb 数组中,我存储了记录 (x) 的值,这可能与它有关吗?
  • 我发布了另一个有趣的观察结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多