R управление памятью / невозможно выделить вектор размером n Мб - PullRequest
126 голосов
/ 02 марта 2011

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

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

РЕДАКТИРОВАТЬ: Да, извините: 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

Ответы [ 8 ]

66 голосов
/ 03 марта 2011

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

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

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

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

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

45 голосов
/ 15 июля 2014

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

  • перед открытием R откройте монитор ресурсов Windows (Ctrl-Alt-Delete / Start Task Manager / вкладка Performance)/ нажмите нижнюю кнопку «Монитор ресурсов» / вкладка «Память»)
  • . Вы увидите, сколько оперативной памяти мы использовали , уже использовало до открытия 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.
15 голосов
/ 02 марта 2011

Вот презентация на эту тему, которая может быть вам интересна:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

Я сам не пробовал обсуждаемые вопросы, но пакет bigmemory кажется очень полезным

12 голосов
/ 03 марта 2011

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

11 голосов
/ 10 декабря 2015

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

7 голосов
/ 10 сентября 2015

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

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

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

6 голосов
/ 21 сентября 2018

Я перешел на страницу справки memor.limit и обнаружил, что на моем компьютере R по умолчанию может использовать до ~ 1,5 ГБ ОЗУ и что пользователь может увеличить этот предел.Используя следующий код,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

помог мне решить мою проблему.

2 голосов
/ 26 февраля 2018

Метод сохранения / загрузки, упомянутый выше, работает для меня.Я не уверен, как / если gc() дефрагментирует память, но это, кажется, работает.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
...