内存管理/不能分配大小为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的向量。 您需要执行以下操作
- 关闭系统上的进程,尤其是浏览器
- 将所需的R数据帧保存在csv文件中
- 重新启动R会话并加载数据帧
瞧,指挥工作。 看起来rm()不会释放R中的内存。即使gc()也没有像其中一个线程中提到的那样工作