内存分配“错误:无法分配大小为75.1 Mb的向量”

时间:2012-06-06 15:40:12

标签: r memory-management

在向量化某些模拟代码的过程中,我遇到了内存问题。我在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

(在我的应用中,协方差矩阵Sigma不是对角线,但无论如何我都会得到相同的误差。)

我花了一整天的时间阅读R中的内存分配问题(包括hereherehere)。根据我的阅读,我得到的印象是,这不是可用的RAM本身,而是可用的连续地址空间。不过,75.1Mb对我来说似乎很小。

我非常感谢您的任何想法或建议。

4 个答案:

答案 0 :(得分:35)

我使用光栅包发出了相同的警告。

> 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

希望这可以帮助您解决问题 干杯

答案 1 :(得分:29)

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

对此的潜在解决方案是多方面的。显而易见的是获得具有更多RAM的64位机器。我忘记了32位Windows上的细节但IIRC,任何一个进程只能使用有限数量的RAM(2GB?)而且无论Windows是否会为自己保留一块内存,因此R可用的RAM将略低于你有3.4Gb。在64位Windows上,R将能够使用更多的RAM,并且可以增加/安装的最大RAM量。

如果不可能,那么考虑另一种方法;或许你可以批量进行模拟,每批次的n比N小得多。这样,您可以绘制更少数量的模拟,执行您想要的任何操作,收集结果,然后重复此过程,直到您完成足够的模拟。您没有显示N是什么,但我怀疑它很大,所以请多次尝试NN来覆盖{{1}}。

答案 2 :(得分:2)

gc()可以提供帮助

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

请在此处查看我的回答:https://stackoverflow.com/a/24754706/190791了解更多详情

答案 3 :(得分:0)

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