首页 文章

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

提问于
浏览
112

我遇到了试图在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):

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

8 回答

  • 41

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

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

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

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

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

  • 59

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

    在打开R之前

    • ,打开Windows资源监视器(Ctrl-Alt-Delete /启动任务管理器/性能选项卡/单击底部按钮'Resource Monitor' / Memory选项卡)

    • 您将看到在打开R之前我们已经使用了多少RAM内存,以及哪些应用程序 . 在我的例子中,使用了总共4GB中的1.6 GB . 所以我只能获得2.4 GB的R,但现在变得更糟......

    • 打开R并创建一个1.5 GB的数据集,然后将其大小减小到0.5 GB,资源监视器显示我的RAM使用率接近95% .

    • use gc() to do garbage collection =>它工作正常,我可以看到内存使用量降至2 GB

    enter image description here

    可在我的机器上运行的其他建议:

    • 准备功能,另存为RData文件,关闭R,重新打开R,然后加载列车功能 . 资源管理器通常显示较低的内存使用量,这意味着 even gc() does not recover all possible memory and closing/re-opening R works the best to start with maximum memory available .

    • 另一个技巧是仅加载用于训练的训练集(不加载测试集,通常可以是训练集的一半) . 训练阶段可以最大限度地使用内存(100%),因此任何可用的内容都很有用 . 当我尝试R内存限制时,所有这些都需要花费一些时间 .

  • 7

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

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

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

  • 2

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

  • 13

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

  • 10

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

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

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

  • 14

    上面提到的保存/加载方法适合我 . 我不确定如何 gc() defrags内存,但这似乎工作 .

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

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

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

    帮助我解决了我的问题 .

相关问题