Я сталкиваюсь с проблемами, пытаясь использовать большие объекты в 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
Calloc
и сFree
памятью, но я подозреваю, что это не то, что делает Бенджамин.Ответы:
Подумайте, действительно ли вам нужны все эти данные явно, или матрица может быть разреженной? В R есть хорошая поддержка (см.
Matrix
, Например, пакет) для разреженных матриц.Держите все другие процессы и объекты в R как минимум, когда вам нужно сделать объекты такого размера. Используйте,
gc()
чтобы очистить теперь неиспользуемую память, или, лучше, только создать нужный объект за один сеанс .Если вышеперечисленное не может помочь, установите 64-разрядную машину с максимально возможным объемом оперативной памяти и установите 64-разрядную версию R.
Если вы не можете сделать это, есть много онлайн-сервисов для удаленного вычисления.
Если вы не можете сделать это, инструменты отображения памяти, такие как package
ff
(или,bigmemory
как упоминает Sascha), помогут вам создать новое решение. В моем ограниченном опытеff
есть более продвинутый пакет, но вы должны прочитатьHigh Performance Computing
тему о представлениях задач CRAN.источник
Для пользователей Windows следующее помогло мне понять некоторые ограничения памяти:
gc()
чтобы сделать сборку мусора => это работает, я вижу, использование памяти уменьшится до 2 ГБДополнительные советы, которые работают на моей машине:
источник
gc()
это всего лишь иллюзия. Проверка Диспетчера задач - это просто очень простая операция с Windows. Единственный совет, с которым я могу согласиться, - это сохранение в формате .RDatagc()
это не работает. Я просто имею в виду, что R делает это автоматически, поэтому вам не нужно делать это вручную. Смотрите здесьgc()
РАБОТАЕТ . Вам просто не нужно использовать это, потому что R делает это внутреннеВот презентация на эту тему, которая может вас заинтересовать:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
Я не пробовал обсуждаемые вещи сам, но
bigmemory
пакет кажется очень полезнымисточник
Самый простой способ обойти это ограничение - перейти на 64-битную R.
источник
Error: cannot allocate vector of size ... Gb
(но да, у меня много данных).Я столкнулся с подобной проблемой, и я использовал 2 флеш-накопителя как «ReadyBoost». Два диска дали дополнительное увеличение памяти на 8 ГБ (для кеша), и это решило проблему, а также увеличило скорость системы в целом. Чтобы использовать Readyboost, щелкните правой кнопкой мыши на диске, перейдите в свойства и выберите «ReadyBoost» и установите переключатель «Использовать это устройство» и нажмите «Применить» или «ОК» для настройки.
источник
Я перешел на страницу справки memor.limit и обнаружил, что на моем компьютере R по умолчанию может использовать до ~ 1,5 ГБ ОЗУ и что пользователь может увеличить этот предел. Используя следующий код,
помог мне решить мою проблему.
источник
Если вы запускаете свой скрипт в среде Linux, вы можете использовать эту команду:
и сервер выделит для вас запрошенную память (в соответствии с ограничениями сервера, но с хорошим сервером - могут использоваться огромные файлы)
источник
server_name
? Я сталкиваюсь с этим,cannot allocate vector size...
пытаясь создать огромную матрицу условий документа для AMI, и я не могу понять, почему у нее недостаточно памяти или сколько еще мне нужно арендовать. Спасибо!Метод сохранения / загрузки, упомянутый выше, работает для меня. Я не уверен, как / если
gc()
дефрагментирует память, но это, кажется, работает.источник