Управление памятью/не может выделить вектор размера n Mb

У меня возникают проблемы с попыткой использовать большие объекты в R. Например:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

Я понимаю, что это связано с трудностью получения смежных блоков памяти (от здесь):

Сообщения об ошибках не могут выделить вектор размера, указать невозможность получить память, либо потому что размер превысил адресный пробел для процесса или, более вероятно, потому что система была не удалось обеспечить память. Заметка что на 32-битной сборке вполне может достаточно свободной памяти, но не достаточно большой смежный блок адресное пространство, в которое его можно сопоставить.

Как я могу обойти это? Моя основная трудность заключается в том, что я добираюсь до определенного момента в моем script, а R не может выделить 200-300 Мб для объекта... Я не могу предварительно выделить блок, потому что мне нужна память для другой обработки, Это происходит даже тогда, когда я удаляю ненужные объекты.


Edit: Windows XP SP3, оперативная память 4 ГБ, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

Ответ 1

Учитывайте, действительно ли вам нужны все эти данные, или может быть разрешена матрица? В R есть хорошая поддержка (см. Пакет Matrix, например,) для разреженных матриц.

Сохраняйте все остальные процессы и объекты в R до минимума, когда вам нужно создавать объекты такого размера. Используйте gc(), чтобы очистить неиспользуемую память или лучше создать только тот объект, который вам нужен за один сеанс.

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

Если вы не можете этого сделать, есть много онлайн-сервисов для удаленных вычислений.

Если вы не можете сделать это, инструменты для сопоставления памяти, такие как пакет ff (или bigmemory как упоминается Sascha), помогут вам построить новое решение. В моем ограниченном опыте ff является более сложным пакетом, но вы должны прочитать тему High Performance Computing в представлении задач CRAN.

Ответ 2

Для пользователей Windows следующее помогло мне понять некоторые ограничения памяти:

  • перед открытием R откройте монитор ресурсов Windows (Ctrl-Alt-Delete/Start Task Manager/Performance tab/нажмите на нижнюю кнопку "Монитор ресурсов" /вкладка "Память" ).
  • вы увидите, сколько оперативной памяти мы уже использовали, прежде чем открывать R и какие приложения. В моем случае используется 1,6 ГБ всего 4 ГБ. Поэтому я смогу получить только 2,4 ГБ для R, но теперь все хуже...
  • откройте R и создайте набор данных объемом 1,5 ГБ, а затем уменьшите его размер до 0,5 ГБ, монитор ресурсов показывает, что моя оперативная память используется почти на 95%.
  • использовать gc() для сборки мусора = > он работает, я вижу, что использование памяти сокращается до 2 ГБ.

enter image description here

Дополнительные советы, которые работают на моей машине:

  • подготовьте функции, сохраните их как файл RData, закройте R, заново откройте R и загрузите функции поезда. Диспетчер ресурсов обычно показывает более низкое использование памяти, что означает, что даже gc() не восстанавливает всю возможную память, а закрытие/повторное открытие R лучше всего работает с максимальной доступной памятью.
  • Другой трюк состоит в том, чтобы загружать только набор для тренировки (не загружайте тестовый набор, который обычно может быть вдвое меньше размера набора поездов). Фаза тренировки может использовать максимальную память (100%), поэтому все, что доступно, полезно. Все это нужно принимать с солью, поскольку я экспериментирую с ограничениями памяти R.

Ответ 4

Самый простой способ обойти это ограничение - переключиться на 64 бит R.

Ответ 5

У меня возникла аналогичная проблема, и я использовал 2 флеш-накопителя в качестве "ReadyBoost". Эти два диска обеспечили дополнительную память объемом 8 ГБ (для кеша), и она решила проблему, а также увеличила скорость всей системы в целом. Чтобы использовать Readyboost, щелкните правой кнопкой мыши на диске, перейдите к свойствам и выберите "ReadyBoost" и выберите переключатель "использовать это устройство" и нажмите "Применить" или "ОК" для настройки.

Ответ 6

Если вы используете script в среде linux, вы можете использовать эту команду:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

и сервер будет выделять запрошенную вам память (в соответствии с лимитами сервера, но с хорошим сервером - огромные файлы могут быть использованы)

Ответ 7

Недавно я столкнулся с проблемой запуска CARET по набору данных из 500 строк

В нем говорилось, что он не смог выделить вектор из 137 МБ. Вам нужно сделать следующее

  • Закрыть процессы в вашей системе, особенно в браузере
  • Сохранение необходимых кадров данных R в файле csv
  • Перезапустить сеанс R и загрузить кадры данных

Воила, команда работала. Кажется, что rm() не освобождает память в R. Даже gc() не работает, как упоминалось в одном из потоков