2013-04-05 2 views
11

Я имею ГБ памяти 6 в моей машине (Windows 7 Pro 64 бит) и в R, я получаюЭффективное управление памятью в R

> memory.limit() 
6141 

Конечно, при работе с большими данными, возникает ошибка выделения памяти. Поэтому для того, чтобы сделать R использовать виртуальную память, я использую

> memory.limit(50000) 

Теперь, когда работает мой сценарий, я не ошибка выделения памяти больше, но R свиньи вся память в моем компьютере, так что я могу Не используйте машину до завершения скрипта. Интересно, есть ли лучший способ заставить R управлять памятью машины. Я думаю, что что-то, что он может сделать, это использовать виртуальную память, если она использует физическую память больше, чем указано пользователем. Есть ли такой вариант?

ответ

9

Посмотрите на фф и bigmemory пакетов. Это использует функции, которые знают о объектах R, чтобы держать их на диске, а не позволять ОС (которая просто знает о кусках памяти, но не то, что они представляют).

5

R не управляет памятью машины. Это ответственность операционной системы. Единственная причина, по memory.size и memory.limit существует на Windows, потому, что (от help("Memory-limits")):

Under Windows, R imposes limits on the total memory allocation 
available to a single session as the OS provides no way to do so: 
see 'memory.size' and 'memory.limit'. 

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

+0

Или инвестируйте в большую ОЗУ. – Roland

3

Это не решение, а предложение. По возможности используйте эффективные объекты памяти: например, используйте матрицу вместо data.frame.

Вот пример

m = matrix(rnorm(1000), 2, 2) 
d = as.data.frame(m) 
object.size(m) 
232 bytes 
object.size(d) 
808 bytes 
+3

В этом примере, по-видимому, выделяется очень небольшая фиксированная разница в распределении данных. Возьмите матрицу как 'm = matrix (rnorm (1000), 20000, 10)', а разницы в размерах между объектами станут незначительными. Фактически, проверяя это на случайный 'data.frame', который я имел в своей рабочей области, версия' matrix' была в 2 раза больше. Поэтому я не думаю, что это предложение полезно для этой проблемы. – eddi

+1

Нет. Я не согласен. Матрица более эффективна, чем data.frame. Это одна из причин, по которой внутренне многие функции R будут принуждать к матрицам данных, которые находятся в кадрах данных. Я четко заявляю, что мой ответ - просто предложение, если вы хотите. Для вашего второго комментария (случайный data.frame меньше, чем версия матрицы), я думаю, что это False. – agstudy

+0

Это то, что я вижу для конкретного 'data.frame', который у меня есть в моей рабочей области. 'object.size (as.data.frame (rec)): 11542192 bytes' и' object.size (as.matrix (rec)): 26516160 bytes'. – eddi

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