2014-11-02 29 views
0

我有一个大名单的.rda文件,那这个样子后(在本例中999).rda文件的大小增长删除某些行

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

第一K空行是由于代码中的错误而创建的,所以我决定删除所有1:K行。保存文件后,它的尺寸变大了:在1GB之前是<,之后是> 16GB。那怎么可能?如何解决它?

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

+0

这是有趣的,但一个(小!)重复的例子(使用'保存() '和'file.size()')将会非常有用。 – 2014-11-02 18:02:25

+1

你用什么代码去除NULL。这些不一定是“行”,除非你有一个数据框开始。行索引失败的例子'replicate(5,NULL)[3,]' – 2014-11-02 18:05:02

回答

2

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

?save

...保存的文件可以被解压缩,并根据不同的压缩方案重新压缩(看看resaveRdaFiles一种方式,从R内这样做)。

所以,当我在本Bolker的答案z2对象运行resaveRdaFiles,它得到一个好大块较小

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

有趣,但我有点怀疑。 'resaveRdaFiles'对'tmp.rda'有什么作用?默认的压缩方法是'gzip'(参见'save“),而'resaveRdaFiles'则尝试了几种不同的压缩方案并选择最好的压缩方案。 – 2014-11-02 18:47:07

+0

@BenBolker - 在tmp.rda上的大小是2212664 – 2014-11-02 19:05:17

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 

获取不断所谓稍微小一些。

numeric(0)代替NULL使结果稍微大一些。

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

'file.size'找不到。忘记它在哪里...'utils'? – 2014-11-02 18:20:34

+0

我有它在基地。它可能是平台特定的吗?我认为''file.info()'应该在任何地方工作。 – 2014-11-02 18:44:24

+0

不,在Linux上没有file.size – Tim 2014-11-03 06:30:18