2013-09-04 4 views
0

Это явление, которое часто случается. Я стараюсь, чтобы управлять каким-то большими объемами данных, напримерПроблемы с памятью в 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, и все еще осталось много.

+1

Вы смотрели какие-либо существующие сообщения здесь, в R и управлении памятью? –

+0

@DirkEddelbuettel: Да. Несколько упоминаний об использовании gc(), некоторые используют (теперь устаревшие) ключи командной строки, также рекомендуется использовать data.table() (но слияние больших данных здесь не проблема). Большинство из них предлагают специальные модификации для данной проблемы, так что используется меньше памяти. Я не нашел ответа на свои конкретные вопросы (почему gc() не работает, почему мне нужно перезапустить R). – January

+0

gc() очищает вещи, которые вам не нужны, но если у вас много объектов в вашей среде с использованием памяти, возможно, вы не сможете получить блок смежной памяти достаточно большой. Запустите сеанс, чтобы снова воссоздать вашу проблему, затем используйте 'rm (list = ls()); gc() 'и снова запустите код и посмотрите, работает ли он. –

ответ

2

Установите и используйте 64-бит R, чтобы использовать больше ОЗУ. От ?Memory-limits:

Unix
The address-space limit is system-specific: 32-bit OSes imposes a limit of no more than 4Gb: it is often 3Gb. Running 32-bit executables on a 64-bit OS will have similar limits: 64-bit executables will have an essentially infinite system-specific limit (e.g. 128Tb for Linux on x86_64 cpus).

+0

Это странно. Адресное пространство зависит от ядра, ядро ​​использует расширение PAE и может обращаться к полной памяти. – January

+1

Похоже, что он использует 32-битную машину, поэтому это было бы невозможно. Примечание: «Платформа: i486-pc-linux-gnu (32-разрядная версия)» из 'sessionInfo' – gwatson

+0

@gwatson, так почему у вас 8 ГБ оперативной памяти на 32-битной ОС? Я предполагаю, что есть двойная загрузка, или он использует какую-то виртуальную установку? –

0

Не уверен, что еще можно сделать на 32-битной машине. Может быть, попробуйте использовать один из популярных пакетов обработки памяти, например bigmemory? Вот ссылка, http://www.bigmemory.org/

Смежные вопросы