Memory Allocation "Ошибка: не может выделить вектор размера 75.1 Mb"
В процессе векторизации некоторого кода моделирования я столкнулся с проблемой памяти. Я использую 32-битную версию R версии 2.15.0 (через RStudio версии 0.96.122) под Windows XP. Моя машина имеет 3,46 ГБ оперативной памяти.
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.0-6 lattice_0.20-6 MASS_7.3-18
loaded via a namespace (and not attached):
[1] grid_2.15.0 tools_2.15.0
Вот минимальный пример проблемы:
> memory.limit(3000)
[1] 3000
> rm(list = ls())
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1069761 28.6 1710298 45.7 1710298 45.7
Vcells 901466 6.9 21692001 165.5 173386187 1322.9
> N <- 894993
> library(MASS)
> sims <- mvrnorm(n = N, mu = rep(0, 11), Sigma = diag(nrow = 11))
> sims <- mvrnorm(n = N + 1, mu = rep(0, 11), Sigma = diag(nrow = 11))
Error: cannot allocate vector of size 75.1 Mb
(В моем приложении ковариационная матрица Sigma не диагональна, но я получаю ту же ошибку в любом случае.)
Я провел день, читая о проблемах с распределением памяти в R (включая здесь, здесь и здесь). Из того, что я читал, у меня создается впечатление, что это не вопрос доступной ОЗУ как таковой, а доступное постоянное адресное пространство. Тем не менее, 75.1Mb кажется довольно маленьким для меня.
Я бы очень признателен за любые мысли или предложения, которые у вас могут быть.
Ответы
Ответ 1
R попал в точку, где ОС не может выделить его еще 75,1 Мб фрагмента ОЗУ. Это размер блока памяти, необходимый для выполнения следующей операции. Это не утверждение о количестве непрерывной памяти, необходимой для завершения всего процесса. К этому моменту вся ваша оперативная память исчерпана, но вам нужно больше памяти для продолжения, и ОС не может сделать больше RAM доступным для R.
Потенциальные решения этого многообразны. Очевидным является получение 64-битной машины с большим объемом оперативной памяти. Я забываю детали, но IIRC на 32-битной Windows, любой отдельный процесс может использовать только ограниченное количество оперативной памяти (2 ГБ?), И независимо от того, что Windows сохранит кусок памяти для себя, поэтому оперативная память, доступная для R, будет несколько меньше 3.4Gb у вас есть. В 64-битной Windows R будет больше использовать оперативную память, и максимальный объем оперативной памяти, который вы можете установить/установить, будет увеличен.
Если это невозможно, рассмотрите альтернативный подход; возможно, ваши симуляции в партиях с n за партию намного меньше, чем N
. Таким образом, вы можете нарисовать намного меньшее количество симуляций, делать все, что хотите, собирать результаты, а затем повторять этот процесс, пока не сделаете достаточные симуляции. Вы не показываете, что такое N
, но я подозреваю, что он большой, поэтому попробуйте уменьшить N
несколько раз, чтобы дать вам N
все.
Ответ 2
У меня было такое же предупреждение, используя растровый пакет.
> my_mask[my_mask[] != 1] <- NA
Error: cannot allocate vector of size 5.4 Gb
Решение действительно простое и состоит в увеличении емкости хранилища R, здесь строка кода:
##To know the current storage capacity
> memory.limit()
[1] 8103
## To increase the storage capacity
> memory.limit(size=56000)
[1] 56000
## I did this to increase my storage capacity to 7GB
Надеюсь, это поможет вам решить проблему
Приветствия
Ответ 3
gc()
может помочь
сохранение данных как .RData, закрытие, повторное открытие R и загрузка RData могут помочь.
см. мой ответ здесь: fooobar.com/questions/70482/... для более подробной информации
Ответ 4
останавливается ли R независимо от значения N, которое вы используете? попробуйте использовать небольшие значения и посмотрите, является ли это проблемой функция mvrnorm, или вы можете просто закодировать ее на подмножествах. Вставьте функцию gc()
в цикле, чтобы освободить некоторую ОЗУ непрерывно