内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]
Posted
技术标签:
【中文标题】内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]【英文标题】:Memory Allocation "Error: cannot allocate vector of size 75.1 Mb" [duplicate] 【发布时间】:2012-06-10 15:57:01 【问题描述】:在对一些模拟代码进行矢量化处理的过程中,我遇到了内存问题。我在 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 中的内存分配问题(包括 here、here 和 here)。根据我的阅读,我得到的印象不是可用 RAM 本身的问题,而是可用的连续地址空间的问题。不过,75.1Mb 对我来说似乎很小。
如果您有任何想法或建议,我将不胜感激。
【问题讨论】:
【参考方案1】:我在使用 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
希望这将帮助您解决问题 干杯
【讨论】:
得到这个。Error in memory.limit(size = 56000) : don't be silly!: your machine has a 4Gb address limit
无论如何,为我工作! :)
我想是因为你的内存比我的大。
@juandelsur:这对我也有用。我有 8GB 的内存,只是像你一样增加到 7。谢谢!【参考方案2】:
无论您使用 N 值,R 是否都会停止?尝试使用较小的值并查看问题是否是 mvrnorm 函数,或者您可以简单地在子集上循环它。在循环中插入gc()
函数以不断释放一些RAM
【讨论】:
【参考方案3】: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
是什么,但我怀疑它很大,所以尝试更小的N
多次以给你N
。
【讨论】:
在我上面的例子中,N 是 894993。我希望避免使用循环或 apply 的一些变体,但在这种情况下我可能不能。 @user1426701 不,你不能。为什么Stack Overflow 上的每个人最近都想避免在 R 中使用 for 循环?使用它们并没有什么问题,而且它们很快,只要您先为结果设置存储,然后在循环时填充该对象。 在这个特定的例子中,当我减少复制的数量以便不会出现这个内存问题时,没有循环的版本快了近 5 倍。与其说是想完全避免循环,不如说是从三个嵌套循环变为两个。 @user1426701 我怀疑那里有问题。大多数情况下,循环应该几乎和lapply()
一样快。
你的观点很好。我怀疑这可能是重复函数调用的开销而不是循环本身的问题。例如,我希望调用一次 mvrnorm 来生成所有 5000 个模拟复制比调用它 5000 次来单独生成它们要快得多。这是我试图通过矢量化我的最内层循环来避免的。【参考方案4】:
gc()
可以帮忙
将数据保存为 .RData、关闭、重新打开 R 并加载 RData 会有所帮助。
在这里查看我的回答:https://***.com/a/24754706/190791 了解更多详情
【讨论】:
以上是关于内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]的主要内容,如果未能解决你的问题,请参考以下文章