我有一个包含大型列表的.rda文件,如下所示:
[[1]] Null
[[2]] Null
...
[[1000]] (Some data)
...
由于代码中的错误,创建了第一个K
空行(示例中为999),因此我决定删除所有1:K
行。保存文件后,它的大小变大了:在<1 GB之前和之后> 16 GB之前。怎么会这样?如何解决?
我可以想象问题是,在编辑列表之前,它的值从1到N
,编辑后它只包含从K+1
到N
的值,但是它如此不同?如果这是问题,如何清除索引?
答案 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