R 内存管理/不能分配大小为 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兆对象... 我不能真正预先分配块,因为我需要的内存为其他处理。即使我努力删除不需要的对象,也会发生这种情况。

编辑: 是的,抱歉: 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
608225 次浏览

这里有一个关于这个话题的演讲,你可能会感兴趣:

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

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

考虑是否真的需要显式地使用所有这些数据,或者矩阵可以是稀疏的?R 中对稀疏矩阵有很好的支持(例如,参见 Matrix包)。

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

如果上面的方法没有用,那么就买一台64位机器,尽可能多地使用 RAM,并安装64位 R。

如果您不能做到这一点,有许多远程计算的联机服务。

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

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

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

  • 在打开 R 之前,打开 Windows 资源监视器(Ctrl-Alt-Delete/Start Task Manager/Performance 选项卡/点击底部按钮‘ Resource Monitor’/Memory 选项卡)
  • 您将看到多少内存我们 已经使用之前,您打开 R,以及由哪些应用程序。在我的示例中,使用了总共4 GB 中的1.6 GB。所以我只能得到2.4 GB 的 R,但现在更糟..。
  • 打开 R 并创建一个1.5 GB 的数据集,然后将其大小减少到0.5 GB,资源监视器显示我的 RAM 使用率接近95% 。
  • 使用 gc()进行垃圾收集 = > 它工作了,我可以看到内存使用下降到2GB

enter image description here

在我的机器上运行的附加建议:

  • 准备特性,保存为 RData 文件,关闭 R,重新打开 R,并加载列车特性。资源管理器通常显示较低的内存使用率,这意味着 即使 gc ()也不能恢复所有可能的内存,关闭/重新打开 R 最好以最大可用内存开始
  • 另一个技巧是只加载用于训练的列车集(不要加载测试集,它通常只有列车集的一半大小)。训练阶段可以最大限度地利用内存(100%) ,所以任何可用的东西都是有用的。所有这一切都是以一粒盐,因为我正在试验 R 记忆限制。

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

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

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

我遇到了类似的问题,我使用2个闪存驱动器作为“ ReadyBoost”。这两个驱动器提供了额外的8GB 内存增加(缓存) ,它解决了这个问题,也提高了整个系统的速度。 要使用 ReadyBoost,右键单击驱动器,进入属性,选择“ ReadyBoost”,并选择“ use this device”单选按钮,然后单击 application 或 ok 进行配置。

上面提到的保存/加载方法对我很有用。我不知道如何/如果 gc()整理记忆,但这似乎工作。

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

我跟随 memory.limit的帮助页面,发现在我的计算机 R 上,默认情况下最多可以使用1.5 GB 的内存,用户可以增加这个限制。使用以下代码,

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

帮我解决了我的问题。

一种选择是在运行命令之前和之后,通过运行 gc()命令来执行“垃圾收集”,从而导致高内存消耗,除了使用 memory.limit()命令之外,这将为您的分析释放内存。

例如:

gc()
memory.limit(9999999999)
fit <-lm(Y ~ X)
gc()