R управление памятью /невозможно выделить вектор размером n Мб

Я сталкиваюсь с проблемами, пытаясь использовать большие объекты в 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
113 голосов | спросил Benjamin 2 MarpmWed, 02 Mar 2011 21:13:01 +03002011-03-02T21:13:01+03:0009 2011, 21:13:01

8 ответов


0

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

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

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

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

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

ответил mdsumner 3 MaramThu, 03 Mar 2011 01:34:15 +03002011-03-03T01:34:15+03:0001 2011, 01:34:15
0

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

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

введите описание изображения здесь

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

  • подготовьте объекты, сохраните их в виде файла RData, закройте R, снова откройте R и загрузите элементы поезда. Диспетчер ресурсов обычно показывает более низкое использование памяти, что означает, что даже gc () не восстанавливает всю возможную память, и закрытие /повторное открытие R работает лучше всего, чтобы начать с максимально доступной памяти .
  • другая хитрость заключается в загрузке только набора поездов для обучения (не загружайте набор тестов, который обычно может быть вдвое меньше набора наборов). На этапе обучения можно максимально использовать память (100%), поэтому все, что доступно, полезно. Все это нужно взять с крошкой соли, поскольку я экспериментирую с ограничением памяти R.
ответил tucson 15 J000000Tuesday14 2014, 13:35:33
0

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

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

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

ответил Sacha Epskamp 2 MarpmWed, 02 Mar 2011 21:32:15 +03002011-03-02T21:32:15+03:0009 2011, 21:32:15
0

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

ответил David Heffernan 3 MarpmThu, 03 Mar 2011 23:14:08 +03002011-03-03T23:14:08+03:0011 2011, 23:14:08
0

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

ответил Kwaku Damoah 10 ThuEurope/Moscow2015-12-10T23:31:29+03:00Europe/Moscow12bEurope/MoscowThu, 10 Dec 2015 23:31:29 +0300 2015, 23:31:29
0

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

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

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

ответил nurit 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2015 11:18:01 +0300 2015, 11:18:01
0

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

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
ответил Simon Woodward 26 FebruaryEurope/MoscowbMon, 26 Feb 2018 03:48:11 +0300000000amMon, 26 Feb 2018 03:48:11 +030018 2018, 03:48:11
0

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

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

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

ответил Rajib Kumar De 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2018 07:41:22 +0300 2018, 07:41:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132