Расхождение размеров объекта - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь выяснить, почему определенные массивы, которые я сохраняю, так как .rda, похоже, потребляют больше памяти, чем другие с одинаковым размером. Ниже приведены два объекта, x и y, одинакового размера, типа и размера. Когда я сохраняю каждый из них, один 41 МБ, а другой 6 МБ. Может кто-нибудь придумать причину, по которой это могло произойти?

> dim(x)
[1]    71    14 10000
> dim(y)
[1]    71    14 10000 
> class(x)
[1] "array"
> class(y)
[1] "array"  
> object.size(y)
79520208 bytes
> object.size(x)
79520208 bytes

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

Они оба могут быть массивами символов, списками или фреймами данных.Или один может быть символом (один или два байта будут минимальным размером элемента, а другой может быть числовым (8 байт на элемент), или более крупный может иметь большие символьные элементы ..... или множество других возможностей. Я получаюпримерно такие же результаты, как у вас:

x <- array(runif( 71* 14 *10000), dim = c(71 ,   14, 10000) )
 save(x, file="test.rda")
 object.size(x)
# 79520208 bytes  and the file is over 50 MB
x <- array(sample(letters, 71* 14 *10000, replace=TRUE), dim = c(71 ,   14, 10000) )
 save(x, file="test2.rda")
 object.size(x)
# 79521456 bytes   and the file is around 8 MB
5 голосов
/ 12 октября 2011

Если вы сохраняете, используя команды save или saveRDS, по умолчанию используется сжатие.Если у вас разный контент в векторах, они будут сжиматься по-разному ...

Попробуйте save с compress=FALSE и сравните снова ...

В приведенном ниже примере почти700-кратная разница в размере файла:

set.seed(42)
x <- runif(1e6)  # random values should not compress well...
y <- rep(0, 1e6) # zeroes should compress very well...
object.size(x) # 8000040 bytes
object.size(y) # 8000040 bytes

save('x', file='x.rds')
save('y', file='y.rds')
file.info(c('x.rds', 'y.rds'))$size
#[1] 5316773    7838

save('x', file='x.rds', compress=FALSE)
save('y', file='y.rds', compress=FALSE)
file.info(c('x.rds', 'y.rds'))$size
#[1] 8000048 8000048
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...