0

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

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

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

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

4

2 回答 2

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

变得越来越小。

替换NULLnumeric(0)使结果稍微大一点。

z3 <- z1
z3[1:500] <- replicate(500,numeric(0))
save("z3",file="tmp3.rda")
file.size("tmp3.rda")
## [1] 2666290
于 2014-11-02T18:09:16.370 回答
2

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

?save

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

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

file.info("tmp2.rda")[,1]
# [1] 2666373
tools::resaveRdaFiles("tmp2.rda")
file.info("tmp2.rda")[,1]
# [1] 2210736
于 2014-11-02T18:27:51.490 回答