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

Ben*_*min 131 memory-management r vector matrix 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 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
Run Code Online (Sandbox Code Playgroud)

我知道这与获取连续内存块的难度有关(从这里开始):

错误消息开始无法分配大小的向量表示无法获取内存,因为大小超出了进程的地址空间限制,或者更可能是因为系统无法提供内存.请注意,在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
Run Code Online (Sandbox Code Playgroud)

mds*_*ner 68

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

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

如果以上情况无法帮助,请使用尽可能多的RAM来获得64位计算机,并安装64位R.

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

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


tuc*_*son 51

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

  • 在打开R之前,打开Windows资源监视器(Ctrl-Alt-Delete /启动任务管理器/性能选项卡/单击底部按钮'资源监视器'/内存选项卡)
  • 您将看到在打开R之前我们已经使用了多少RAM内存,以及哪些应用程序.在我的例子中,使用了总共​​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内存限制时,所有这些都需要花费一些时间.

  • 好的,最后一次.`gc()`**做**工作.你只是不需要使用它,因为R是内部的 (14认同)
  • R自己进行垃圾收集,`gc()`只是一种幻觉.检查任务管理器只是非常基本的Windows操作.我唯一同意的建议是保存.RData格式 (9认同)
  • 我并不是说`gc()`不起作用.我只是意味着R会自动执行,因此您无需手动执行此操作.见[这里](http://adv-r.had.co.nz/memory.html) (4认同)
  • @DavidArenburg gc()是一种幻觉?这意味着我上面的图片显示内存使用量下降是一种错觉.我认为你错了,但我可能弄错了. (3认同)
  • @DavidArenburg我可以告诉你一个事实,上面图片中的内存使用量下降是由gc()命令引起的.我不相信你指出的文档是正确的,至少不是我的设置(Windows,R版本3.1.0(2014-04-10)平台:i386-w64-mingw32/i386(32位)). (2认同)
  • 仅有一种情况可以使用`gc()`:为R以外的另一个进程释放可用内存。释放RAM以在紧接其后请求它只是浪费时间用`free`和`malloc`来调用引擎盖。 (2认同)

Sac*_*amp 16

以下是您可能感兴趣的有关此主题的演示文稿:

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

我自己没有尝试过讨论过的东西,但是这个bigmemory包看起来非常有用

  • 工作,除非预期矩阵类(而不是big.matrix) (4认同)

Dav*_*nan 13

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

  • 这不是一般的治疗方法 - 我已经切换了,现在我有了`错误:不能分配大小的矢量... Gb`而是(但是,我有很多数据). (22认同)
  • 也许不是治愈但它有很多帮助.只需加载RAM并继续启动memory.limit().或者,也许考虑对数据进行分区/采样. (2认同)

小智 12

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


小智 8

如果您在Linux环境中运行脚本,则可以使用以下命令:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
Run Code Online (Sandbox Code Playgroud)

并且服务器将为您分配所请求的内存(根据服务器限制,但具有良好的服务器 - 可以使用hugefiles)


Raj*_* De 7

我转到memor.limit的帮助页面,发现默认情况下,我的计算机上R最多可以使用1.5 GB的RAM,并且用户可以增加此限制。使用以下代码,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
Run Code Online (Sandbox Code Playgroud)

帮助我解决了我的问题。

  • 为什么这会被否决?当然,这是一种危险的方法,但如果需要为会话分配更多内存以使其工作,它通常会有所帮助。 (3认同)
  • 这只是 Windows 特定的解决方案 (3认同)
  • @JeppeOlsen 为什么这是一种危险的方法? (3认同)