Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R “内存分配”;错误:无法分配大小为75.1 Mb的向量;_R_Memory Management - Fatal编程技术网

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

R “内存分配”;错误:无法分配大小为75.1 Mb的向量;,r,memory-management,R,Memory Management,在对一些模拟代码进行矢量化的过程中,我遇到了内存问题。我在Windows XP下使用32位R版本2.15.0(通过RStudio版本0.96.122)。我的机器有3.46 GB内存 > 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_

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

> 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
>内存限制(3000)
[1] 3000
>rm(list=ls())
>gc()
已用(Mb)gc触发器(Mb)最大已用(Mb)
Ncells 1069761 28.6 1710298 45.7 1710298 45.7
Vcells 901466 6.9 21692001 165.5 173386187 1322.9
>图书馆(麻省理工学院)

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

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


如果不可能,那么考虑另一种方法;也许您的模拟是分批进行的,每批的n比

n
小得多。通过这种方式,您可以绘制数量少得多的模拟,做任何您想做的事情,收集结果,然后重复此过程,直到完成足够的模拟。您没有显示
N
是什么,但我怀疑它很大,所以请多次尝试较小的
N
来为您提供
N

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

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

如果不可能,那么考虑另一种方法;也许您的模拟是分批进行的,每批的n比

n
小得多。通过这种方式,您可以绘制数量少得多的模拟,做任何您想做的事情,收集结果,然后重复此过程,直到完成足够的模拟。您没有显示
N
是什么,但我怀疑它很大,所以请多次尝试使用较小的
N
来显示
N

gc()
会有所帮助

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

请参见我的答案:有关更多详细信息,

gc()
可以提供帮助

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


请参见我的回答:有关更多详细信息,我在使用光栅软件包时收到了相同的警告

> my_mask[my_mask[] != 1] <- NA
Error: cannot allocate vector of size 5.4 Gb
希望这能帮助你解决这个问题
干杯

我在使用光栅包时收到了相同的警告

> my_mask[my_mask[] != 1] <- NA
Error: cannot allocate vector of size 5.4 Gb
希望这能帮助你解决这个问题
干杯

无论使用的N值是多少,R都会停止吗?尝试使用较小的值,看看问题出在mvrnorm函数上,还是可以在子集上循环它。在循环中插入
gc()?尝试使用较小的值,看看问题出在mvrnorm函数上,还是可以在子集上循环它。在循环中插入
gc()。我希望避免使用循环或应用程序的某些变体,但在这种情况下,也许我不能。@user1426701不,你不能。为什么最近每个人都希望避免在R中使用for循环?使用它们没有错,而且速度很快,只要您先为结果设置存储,然后在循环时填充该对象。在这个特定的示例中,当我减少复制次数以避免出现内存问题时,没有循环的版本速度快了近5倍。与其说想要完全避免循环,不如说想要从三个嵌套循环变成两个。@user1426701我怀疑有什么不对劲。在大多数情况下,循环应该和
lappy()
一样快。你的观点很好理解。我怀疑这可能是重复函数调用的开销问题,而不是循环本身。例如,我希望一次调用mvrnorm来生成所有5000个模拟副本要比单独调用它5000次快得多。这就是我试图通过矢量化最里面的循环来避免的问题。在我上面的例子中,N是894993。我希望避免使用循环或应用程序的某些变体,但在这种情况下,也许我不能。@user1426701不,你不能。为什么最近每个人都希望避免在R中使用for循环?使用它们没有什么错,而且速度很快,只要您先为结果设置存储,然后在循环时填充该对象