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

时间:2011-03-02 18:13:01

标签: 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 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

我知道这与获取连续内存块的难度有关(来自here):

  

错误消息开始不能   分配大小的向量表示a   也没有获得记忆   因为尺寸超过了   进程的地址空间限制,或   更有可能,因为系统是   无法提供记忆。注意   在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

7 个答案:

答案 0 :(得分:63)

考虑您是否确实需要所有这些数据,或者矩阵是否稀疏? R中有很好的支持(例如参见Matrix包)稀疏矩阵。

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

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

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

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

答案 1 :(得分:44)

对于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

enter image description here

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

  • 准备要素,另存为RData文件,关闭R,重新打开R,然后加载列车功能。资源管理器通常显示较低的内存使用量,这意味着甚至gc()无法恢复所有可能的内存,并且关闭/重新打开R最好以最大可用内存开始
  • 另一个技巧是仅加载用于训练的训练集(不加载测试集,通常可以是训练集的一半)。训练阶段可以最大限度地使用内存(100%),因此任何可用的内容都很有用。当我尝试R内存限制时,所有这些都需要花费一些时间。

答案 2 :(得分:15)

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

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

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

答案 3 :(得分:13)

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

答案 4 :(得分:11)

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

答案 5 :(得分:3)

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

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

帮助我解决了我的问题。

答案 6 :(得分:3)

一个选项是在运行导致高内存消耗的命令之前和之后通过运行 gc() 命令进行“垃圾收集”,这将释放内存用于分析,除了使用 {{ 1}} 命令。

示例:

memory.limit()