R内存管理/无法分配大小为n Mb的向量

R内存管理/无法分配大小为n Mb的向量,r,matrix,vector,memory-management,r-faq,R,Matrix,Vector,Memory Management,R Faq,我尝试在R中使用大型对象时遇到问题。例如: > memory.limit(4000) > a = matrix(NA, 1500000, 60) > a = matrix(NA, 2500000, 60) > a = matrix(NA, 3500000, 60) Error: cannot allocate vector of size 801.1 Mb > a = matrix(NA, 2500000, 60) Error: cannot allocate ve

我尝试在R中使用大型对象时遇到问题。例如:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for
我理解这与(从)获取连续内存块的困难有关:

错误消息无法开始 分配大小为的向量表示 也无法获取内存 因为尺寸超过了标准 进程或进程的地址空间限制, 更有可能,因为系统是 无法提供内存。注 在一个32位的构建中,很可能 有足够的可用内存,但是 没有足够大的连续数据块 要将其映射到的地址空间

我怎样才能避开这件事?我的主要困难是,我的脚本到了某个点,R无法为一个对象分配200-300 Mb的内存。。。我不能预先分配块,因为我需要内存来进行其他处理。即使我勤奋地移除不需要的对象,也会发生这种情况

编辑:是,抱歉:Windows XP SP3,4Gb内存,R2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

以下是您可能会感兴趣的关于此主题的演示:


我自己还没有尝试过讨论的内容,但是
bigmemory
包似乎非常有用

考虑一下您是否真的需要所有这些数据,或者矩阵是否可以稀疏?R中对稀疏矩阵有很好的支持(例如,请参见
Matrix
package)

当需要创建此大小的对象时,将R中的所有其他进程和对象保持在最小值。使用
gc()
清除现在未使用的内存,或者最好只在一个会话中创建所需的对象

如果上述情况无法帮助您,请获得一台具有尽可能多RAM的64位计算机,并安装64位R

如果你不能做到这一点,有许多远程计算的在线服务


如果您不能做到这一点,那么诸如package
ff
(或者Sascha提到的
bigmemory
)之类的内存映射工具将帮助您构建新的解决方案。在我有限的经验中,
ff
是更高级的软件包,但是您应该阅读关于CRAN任务视图的
高性能计算
主题

避开此限制的最简单方法是切换到64位R。

对于Windows用户,以下内容帮助我了解了一些内存限制:

  • 在打开R之前,打开Windows资源监视器(Ctrl-Alt-Delete/启动任务管理器/性能选项卡/单击底部按钮“资源监视器”/内存选项卡)
  • 在打开R之前,您将看到我们已经使用了多少RAM内存,以及使用了哪些应用程序。在我的例子中,总共使用了4GB中的1.6GB。因此,我将只能获得2.4GB的R,但现在来的更糟
  • 打开R并创建一个1.5 GB的数据集,然后将其大小减小到0.5 GB,资源监视器显示我的RAM使用率接近95%
  • 使用
    gc()
    进行垃圾收集
    =>它可以工作,我可以看到内存使用下降到2GB

适用于我的机器的其他建议:

  • 准备特征,另存为RData文件,关闭R,重新打开R,然后加载列车特征。资源管理器通常显示较低的内存使用率,这意味着即使是gc()也无法恢复所有可能的内存,关闭/重新打开R最适合从最大可用内存开始
  • 另一个技巧是只加载用于训练的训练集(不要加载测试集,测试集通常是训练集大小的一半)。训练阶段可以最大限度地使用内存(100%),因此任何可用的东西都是有用的。所有这些都是我在试验R记忆极限时的一点保留意见

如果在linux环境下运行脚本,可以使用以下命令:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

服务器将为您分配请求的内存(根据服务器限制,但使用良好的服务器,可以使用HugeFile)

我遇到了类似的问题,我使用了2个闪存驱动器作为“ReadyBoost”。这两个驱动器增加了8GB的内存(用于缓存),解决了这个问题,也提高了整个系统的速度。
要使用Readyboost,请右键单击驱动器,转到属性并选择“Readyboost”,然后选择“使用此设备”单选按钮,然后单击应用或确定进行配置

上面提到的保存/加载方法对我很有效。我不确定/if
gc()
如何对内存进行碎片整理,但这似乎可行

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")

我查看了
memory.limit
的帮助页面,发现在我的计算机上,默认情况下R最多可以使用~1.5 GB的RAM,用户可以增加此限制。使用以下代码

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

帮助我解决了我的问题。

一个选项是在运行命令之前和之后执行“垃圾收集”,通过运行
gc()
命令,除了使用
memory.limit()
命令之外,这将为您的分析释放内存

例如:

gc()
memory.limit(9999999999)
fit <-lm(Y ~ X)
gc() 
gc()
内存限制(9999999999)

fit是有效的,除非需要一个矩阵类(而不是大的.matrix)尝试使用“free”来降低其他未使用进程的内存分配。@Manoel Galdino:什么是“free”?R函数?@Manoel:在R中,释放内存的任务由垃圾收集器处理,而不是用户。如果在C级工作,可以手动
Calloc
Free
内存,但我怀疑Benjamin不是这样做的。在库XML中可以使用Free。文档中写道:“此通用函数可用于显式释放与给定对象关联的内存。它用于没有自动终结器函数/例程来清理本机对象使用的内存的外部指针对象。”任务是图像分类,与森林。我需要有一个训练数据矩阵(最多60个波段)和20000到6000000行的任意位置,以提供给randomForest。目前,我的最大值约为150,00