内存管理/不能分配大小为n的矢量Mb

我遇到了试图在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 RAM,R 2.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 

考虑你是否真的需要所有这些数据,还是矩阵可以是稀疏的? 对于稀疏矩阵,在R中有很好的支持(见例如Matrix包)。

当您需要制作这种尺寸的物体时,请将R中的所有其他进程和对象保持在最低限度。 使用gc()来清除现在未使用的内存,或者,最好只在一个会话中创建所需的对象

如果上述情况不能解决问题,可以购买一台拥有尽可能多RAM的64位机器,然后安装64位的R。

如果你不能这样做,那么有很多远程计算的在线服务。

如果你不能这样做的内存映射工具,如包ff (或Sascha提到的bigmemory )将帮助你建立一个新的解决方案。 在我有限的经验中, ff是更高级的包,但是您应该阅读CRAN任务视图上的High Performance Computing主题。

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

  • 在打开R之前,打开Windows资源监视器(Ctrl-Alt-Delete /启动任务管理器/性能标签/点击底部按钮“Resource Monitor”/ Memory标签)
  • 你会看到有多少内存我们已经使用之前,你打开R,并通过哪些应用程序。 在我的情况下,使用总共4GB的1.6 GB。 所以我只能得到2.4 GB的R,但现在变得更糟…
  • 打开R并创建一个1.5 GB的数据集,然后将其大小减小到0.5 GB,资源监视器显示我的RAM使用率接近95%。
  • 使用gc()做垃圾收集 =>它的工作原理,我可以看到内存使用下降到2 GB

在这里输入图像描述

在我的机器上可以使用的其他建议:

  • 准备功能,保存为RData文件,关闭R,重新打开R,并加载列车功能。 资源管理器通常显示较低的内存使用量,这意味着即使gc()也不会恢复所有可能的内存,关闭/重新打开R最适合以最大可用内存启动
  • 另一个诀窍是只加载训练集训练(不要加载测试集,它通常是火车集的一半大小)。 训练阶段可以使用最多的内存(100%),所以任何可用的东西都是有用的。 所有这一切都是要用一粒盐,因为我正在试验R内存限制。

以下是关于这个话题的介绍,您可能会感兴趣:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

我自己没有尝试过讨论过的东西,但是大bigmemory包似乎非常有用

避开这个限制最简单的方法是切换到64位R.

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

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

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

服务器将为你分配请求的内存(根据服务器的限制,但是用好的服务器 – 可以使用巨大的文件)

我最近遇到了一个在500行数据集上运行CARET的问题

它说,它无法分配一个137 MB的向量。 您需要执行以下操作

  1. 关闭系统上的进程,尤其是浏览器
  2. 将所需的R数据帧保存在csv文件中
  3. 重新启动R会话并加载数据帧

瞧,指挥工作。 看起来rm()不会释放R中的内存。即使gc()也没有像其中一个线程中提到的那样工作