2014-11-02 87 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