2014-11-02 1 views
0

У меня был файл .rda с большим списком, который выглядел так:.rda файл, содержащий большой список увеличивается в размерах после удаления некоторых строк

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

Первые K пустые строки (999 в данном примере) были созданы из-за ошибки в коде, поэтому я решил удалить все строки 1:K. После сохранения файла он стал большим по размеру: до того, как он был < 1 ГБ и после него было> 16 ГБ. Как это могло быть? Как это исправить?

Я могу себе представить, что проблема заключается в том, что перед внесением изменений в списке он имел значение от 1 до N, а после редактирования он содержит только значение от K+1 до N, но она так отличается? Если это проблема, как очистить индексацию?

+0

это интересно, но (маленький!) Воспроизводимый пример (с помощью 'сохранить() 'и' file.size() ') было бы очень полезно. –

+1

Какой код вы использовали для удаления NULL. Это не обязательно «строки», если у вас не был фрейм данных. Пример того, как неудача строки индексируется 'replicate (5, NULL) [3,]' –

ответ

2

После удаления NULL для файла может потребоваться другой тип сжатия. Вероятно, он был несжатым, а затем повторно сжат по той же схеме сжатия, хотя он должен был отличаться, поскольку список был во много раз меньше.

?save От

... сохраненный файл может быть несжатым и повторно сжимается под другой схемой сжатия (и см resaveRdaFiles способа сделать это изнутри R).

Так что, когда я бег resaveRdaFiles на z2 объекта в ответе Бен Bolker, он получает хороший кусок меньше

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' проверяет несколько различных схем сжатия и выбирает лучший. –

+0

@BenBolker - размер 2212664 на tmp.rda –

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 
+0

'file.size' не найден. Забыл, где это ... 'utils'? –

+0

У меня есть это в базе. Может ли это быть специфичной для платформы? 'file.info()' должен работать где угодно, я думаю. –

+0

Нет, в Linux нет файла.size – Tim