内存分配“错误:不能分配75.1 Mb大小的向量”

在向量化一些模拟代码的过程中,我遇到了一个内存问题。 我在Windows XP下使用32位R版本2.15.0(通过RStudio版本0.96.122)。 我的机器有3.46 GB的RAM。

> 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 

(在我的应用程序中,协方差matrixSigma不是对angular的,但是我也会得到同样的错误。)

我花了下午的时间阅读关于R的内存分配问题(包括这里和这里 )。 从我读到的内容来看,我认为这不是可用RAM本身,而是可用连续地址空间的问题。 尽pipe如此,75.1Mb对我来说还是很小的。

如果您有任何想法或build议,我将不胜感激。

R已经到了操作系统无法再分配75.1Mb内存的地步。 这是执行下一个子操作所需的内存块的大小。 这不是关于完成整个过程所需的连续RAM的数量的说明。 在这一点上,所有可用的RAM都已耗尽,但是您需要更多的内存才能继续运行,并且操作系统无法为R提供更多的RAM。

对此的潜在解决scheme是多方面的。 显而易见的是拥有更多RAM的64位机器。 我忘记了在32位Windows上的细节,但是IIRC,任何一个进程只能使用有限的内存(2GB?),而不pipeWindows将为自己保留一大块内存,所以R可用的内存将less于3.4Gb你有。 在64位的Windows R将能够使用更多的内存和最大数量的内存,你可以适应/安装将会增加。

如果这是不可能的,那么考虑一种替代方法; 也许你的模拟是以批量比n小得多的批量进行的。 这样你可以画出更less的模拟,做你想做的任何事情,收集结果,然后重复这个过程,直到你做了足够的模拟。 你不显示N是什么,但是我怀疑它是大的,所以尝试更小的N来给你N

我有使用光栅包相同的警告。

 > my_mask[my_mask[] != 1] <- NA Error: cannot allocate vector of size 5.4 Gb 

该解决scheme非常简单,并且增加了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 

希望这会帮助你解决问题干杯

gc()可以帮助

将数据保存为.RData,closures,重新打开R和加载RData可以提供帮助。

看到我的答案在这里: https : //stackoverflow.com/a/24754706/190791了解更多详情

无论你使用的N值是否R停止? 尝试使用小的值,看看是否是mvrnorm函数是问题,或者你可以简单地循环它的子集。 在循环中插入gc()函数以连续释放一些RAM