我有一个带有大列表的 .rda 文件,如下所示:
[[1]] Null
[[2]] Null
...
[[1000]] (Some data)
...
由于代码中的错误,创建了第一个K
空行(示例中为 999),所以我决定删除所有1:K
行。保存文件后,它的大小变大了:之前小于 1 GB,之后大于 16GB。怎么可能?如何解决?
我可以想象问题在于,在编辑列表之前它的值从 1 到N
,而在编辑之后它只包含从K+1
to的值N
,但它有那么不同吗?如果这是问题,如何清除索引?
我有一个带有大列表的 .rda 文件,如下所示:
[[1]] Null
[[2]] Null
...
[[1000]] (Some data)
...
由于代码中的错误,创建了第一个K
空行(示例中为 999),所以我决定删除所有1:K
行。保存文件后,它的大小变大了:之前小于 1 GB,之后大于 16GB。怎么可能?如何解决?
我可以想象问题在于,在编辑列表之前它的值从 1 到N
,而在编辑之后它只包含从K+1
to的值N
,但它有那么不同吗?如果这是问题,如何清除索引?
我不能轻易复制这个,但我提供了这个模板:也许,正如上面的@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
删除 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