Это явление, которое часто случается. Я стараюсь, чтобы управлять каким-то большими объемами данных, напримерПроблемы с памятью в R
a <- matrix(rnorm(1e4 * 200), ncol= 1e4)
gr <- factor(rep(1:2, each= 100))
l <- lm(a ~ gr)
covs <- estVar(l)
cors <- cov2cor(covs)
Довольно часто сообщается следующее сообщение об ошибке: Ошибки: не могу выделить вектор размера 509,5 Mb
Fine. Я удалить некоторые переменные не нужно больше и вызвать сборщик мусора:
rm(a, l)
gc(TRUE)
Однако ошибка сохраняется. Теперь я сохраняю R и запускаю его снова. И - происходит чудо: память теперь доступна. Зачем? Если памяти раньше не хватало для выделения R, но сейчас достаточно, что изменилось? Могу ли я заставить R как-то очистить, не сохраняя данные на диск и ожидая, пока он снова загрузит их? Я не понимаю.
мой sessionInfo()
:
> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: i486-pc-linux-gnu (32-bit)
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8 LC_MONETARY=en_US.utf8
[6] LC_MESSAGES=en_US.utf8 LC_PAPER=C LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] graphics utils datasets grDevices stats methods base
P.S .: система, кажется, есть много неиспользуемой памяти осталось, как сообщает free
. top
сообщает, что мой R-процесс (до ошибки) использует до 2 ГБ из моего 8, и все еще осталось много.
Вы смотрели какие-либо существующие сообщения здесь, в R и управлении памятью? –
@DirkEddelbuettel: Да. Несколько упоминаний об использовании gc(), некоторые используют (теперь устаревшие) ключи командной строки, также рекомендуется использовать data.table() (но слияние больших данных здесь не проблема). Большинство из них предлагают специальные модификации для данной проблемы, так что используется меньше памяти. Я не нашел ответа на свои конкретные вопросы (почему gc() не работает, почему мне нужно перезапустить R). – January
gc() очищает вещи, которые вам не нужны, но если у вас много объектов в вашей среде с использованием памяти, возможно, вы не сможете получить блок смежной памяти достаточно большой. Запустите сеанс, чтобы снова воссоздать вашу проблему, затем используйте 'rm (list = ls()); gc() 'и снова запустите код и посмотрите, работает ли он. –