删除一些行后,包含大型列表的.rda文件的大小会增大

时间:2014-11-02 17:58:38

标签: r list compression rda

我有一个包含大型列表的.rda文件,如下所示:

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

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

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

2 个答案:

答案 0 :(得分:3)

我无法轻易复制此内容,但我提供了此模板:或许,正如上面的@RichardScriven评论,您可以告诉我们您如何删除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

答案 1 :(得分:2)

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

来自?save

  

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

因此,当我在Ben Bolker的答案中对resaveRdaFiles对象运行z2时,它会变得更小一些

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