提问人:Benjamin 提问时间:3/3/2011 最后编辑:Gregor ThomasBenjamin 更新时间:3/14/2021 访问量:652932
R 内存管理 / 无法分配大小为 n Mb 的向量
R memory management / cannot allocate vector of size 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
我知道这与获得连续内存块的困难有关(从这里):
错误消息开头 cannot 分配大小的向量表示 无法获取内存,或者 因为大小超出了 进程的地址空间限制,或者 更有可能,因为该系统是 无法提供内存。注意 在 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
答:
以下是您可能会感兴趣的有关此主题的演示文稿:
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。
如果您不能做到这一点,那么有许多用于远程计算的在线服务。
如果你做不到这一点,内存映射工具,如package(或Sascha提到的)将帮助你构建一个新的解决方案。在我有限的经验中,是更高级的软件包,但您应该阅读有关 CRAN 任务视图的主题。ff
bigmemory
ff
High Performance Computing
评论
规避此限制的最简单方法是切换到 64 位 R。
评论
Error: cannot allocate vector of size ... Gb
对于 Windows 用户,以下内容帮助我了解了一些内存限制:
- 在打开 R 之前,打开 Windows 资源监视器(Ctrl-Alt-Delete / 启动任务管理器 / 性能选项卡 / 单击底部按钮“资源监视器”/内存选项卡)
- 您将看到在打开 R 之前我们已经使用了多少 RAM 内存,以及由哪些应用程序使用。就我而言,使用了总共 1.6GB 中的 4 GB。所以我只能为 R 获得 2.4 GB,但现在更糟了......
- 打开 R 并创建一个 1.5 GB 的数据集,然后将其大小减小到 0.5 GB,资源监视器显示我的 RAM 使用率接近 95%。
- 使用
gc()
进行垃圾回收 => 它有效,我可以看到内存使用量下降到 2 GB
适用于我的机器的其他建议:
- 准备功能,另存为 RData 文件,关闭 R,重新打开 R,然后加载训练功能。资源管理器通常显示较低的内存使用率,这意味着即使 gc() 也无法恢复所有可能的内存,关闭/重新打开 R 最适合从最大可用内存开始。
- 另一个技巧是只加载用于训练的训练集(不要加载测试集,测试集的大小通常只有训练集的一半)。训练阶段可以最大限度地使用内存 (100%),因此任何可用的东西都是有用的。所有这些都是一粒盐,因为我正在试验 R 内存限制。
评论
gc()
gc()
如果您在 linux 环境中运行脚本,则可以使用以下命令:
bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
服务器将为您分配请求的内存(根据服务器限制,但使用良好的服务器 - 可以使用 hugefiles)
评论
server_name
cannot allocate vector size...
我遇到了类似的问题,我使用了 2 个闪存驱动器作为“ReadyBoost”。这两个驱动器提供了额外的 8GB 内存提升(用于缓存),它解决了问题,也提高了整个系统的速度。 要使用 Readyboost,请右键单击驱动器,转到属性并选择“ReadyBoost”,然后选择“使用此设备”单选按钮,然后单击“应用”或“确定”进行配置。
上面提到的保存/加载方法对我有用。我不确定如何/是否对内存进行碎片整理,但这似乎有效。gc()
# defrag memory
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
我关注到帮助页面,发现在我的计算机上,默认情况下 R 最多可以使用 ~ 1.5 GB 的 RAM,并且用户可以增加此限制。使用以下代码,memory.limit
>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
帮助我解决了我的问题。
评论
memory.limit(size=7000)
一种选择是在运行命令之前和之后,通过运行命令来执行“垃圾回收”,这将导致高内存消耗,除了使用命令外,这将为您的分析释放内存。gc()
memory.limit()
例:
gc()
memory.limit(9999999999)
fit <-lm(Y ~ X)
gc()
评论
memory.limit(9999999999) [1] Inf Warning message: 'memory.limit()' is no longer supported
上一个:在 R 中列出向量中的非重复值
下一个:如何从多个向量中找到共同元素?
评论
Calloc
Free