【问题标题】:.rda file containing large list grows in size after deleting some rows删除一些行后,包含大列表的 .rda 文件大小增加
【发布时间】:2014-12-29 10:00:50
【问题描述】:

我有一个包含很大列表的 .rda 文件,看起来像这样:

[[1]] Null
[[2]] Null
...
[[1000]] (Some data)
...

由于代码中的错误,创建了第一个 K 空行(示例中为 999),因此我决定删除所有 1:K 行。保存文件后,它的大小变大了:之前是 16GB。怎么可能?如何解决?

我可以想象问题是在编辑列表之前它的值从 1 到 N,而在编辑之后它只包含从 K+1N 的值,但它有那么不同吗?如果是这个问题,如何清除索引?

【问题讨论】:

  • 这很有趣,但是一个(小!)可重现的例子(使用save()file.size())会非常有用。
  • 您使用什么代码来删除 NULL。除非您有一个数据框开始,否则这些不一定是“行”。行索引如何失败的示例replicate(5, NULL)[3,]

标签: r list compression rda


【解决方案1】:

我不能轻易复制这个,但我提供了这个模板:也许,就像上面的@RichardScriven cmets,你可以告诉我们你是如何删除NULL 值的?

补资料:

set.seed(101)
z1 <- replicate(1000,runif(1000),simplify=FALSE)
z1[1:500] <- replicate(500,NULL)

保存并检查文件大小:

save("z1",file="tmp.rda")
file.size("tmp.rda")
## [1] 2666278

只保留最后 500 个元素:

z2 <- z1[501:1000]
save("z2",file="tmp2.rda")
file.size("tmp2.rda")
## [1] 2666249

变得越来越小。

NULL 替换为numeric(0) 会使结果稍微大一些。

z3 <- z1
z3[1:500] <- replicate(500,numeric(0))
save("z3",file="tmp3.rda")
file.size("tmp3.rda")
## [1] 2666290

【讨论】:

  • file.size 未找到。忘了它在哪里...utils?
  • 我有它在基地。它可能是特定于平台的吗?我认为file.info() 应该可以在任何地方使用。
  • 不,在 Linux 上没有 file.size
  • 不幸的是,我无法提供可重现的示例。我尝试了几种不同的方法,但像你一样,我无法制作任何方法。
  • 那么我认为我们无法提供帮助,除非有人得到灵感……
【解决方案2】:

删除 NULL 后,文件可能需要不同的压缩类型。它可能是未压缩的,然后在相同的压缩方案下重新压缩,尽管它应该不同,因为列表变小了很多倍。

来自?save

...保存的文件可以在不同的压缩方案下解压缩和重新压缩(请参阅 resaveRdaFiles 以了解从 R 中执行此操作的方法)。

因此,当我在 Ben Bolker 的回答中对 z2 对象运行 resaveRdaFiles 时,它会变小很多

file.info("tmp2.rda")[,1]
# [1] 2666373
tools::resaveRdaFiles("tmp2.rda")
file.info("tmp2.rda")[,1]
# [1] 2210736

【讨论】:

  • 很有趣,但我有点怀疑。 resaveRdaFilestmp.rda 做了什么?默认压缩为gzip(请参阅?save),而resaveRdaFiles 尝试了几种不同的压缩方案并选择最佳的一种。
  • @BenBolker - tmp.rda 上的大小为 2212664
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多