42

在矢量化一些模拟代码的过程中,我遇到了内存问题。我在 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 中的内存分配问题(包括这里这里这里)。根据我的阅读,我得到的印象不是可用 RAM 本身的问题,而是可用的连续地址空间的问题。不过,75.1Mb 对我来说似乎很小。

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

4

4 回答 4

58

我使用 raster 包也有同样的警告。

> 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

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

于 2017-05-18T08:51:59.337 回答
32

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

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

如果这不可能,则考虑另一种方法;也许您的模拟分批进行,每批的 n 远小于N. 这样你就可以绘制更少的模拟,做任何你想做的事情,收集结果,然后重复这个过程,直到你完成了足够的模拟。您没有显示是什么N,但我怀疑它很大,因此请尝试较小N的次数以N全面了解。

于 2012-06-06T15:50:48.853 回答
2

gc()能够帮助

将数据保存为 .RData、关闭、重新打开 R 并加载 RData 会有所帮助。

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

于 2014-07-15T12:12:30.620 回答
0

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

于 2017-09-07T16:28:25.527 回答