R中的内存使用情况

时间:2009-07-23 03:03:09

标签: memory-management r

在创建大对象并耗尽RAM之后,我将尝试使用

删除当前环境中的对象
rm(list=ls())

当我检查我的RAM使用情况时,没有任何改变。即使在致电gc()之后,一切都没有改变。我只能通过退出R来补充我的RAM。

有人建议处理R中的内存密集型对象吗?

4 个答案:

答案 0 :(得分:20)

未立即释放已删除对象的内存。 R使用一种称为“垃圾收集”的技术来回收已删除对象的内存。它会定期循环访问可访问对象列表(基本上是那些具有名称且尚未删除且可由用户访问的对象),并“标记”它们以进行保留。垃圾收集扫描后,任何未标记对象的内存都将返回给操作系统。

垃圾收集会自动进行,您无法直接控制此过程。但是您可以通过从命令行调用命令gc()来强制扫描。

即便如此,在某些操作系统上,垃圾收集可能无法回收内存(如操作系统所报告)。例如,较旧版本的Windows可能会增加但不会减少R的内存占用。垃圾收集只会在将来为新对象腾出空间,但不会减少R的内存使用。

答案 1 :(得分:8)

在Windows上,您描述的技术适合我。请尝试以下示例。

打开Windows任务管理器(CTRL + SHIFT + ESC)。

启动RGui。 RGui.exe内存使用量为27 460K。

类型

gcinfo(TRUE)
x <- rnorm(1e8)

RGui.exe内存使用现在是811 100K。

输入rm("x")。 RGui.exe内存使用率仍为811 100K。

输入gc()。 RGui.exe内存使用现在为28 332K。

请注意,如果已从工作区中删除了对象,则会自动调用gc,然后尝试为新变量分配更多内存。

答案 2 :(得分:3)

我的印象是,在R报告内存分配失败之前,会尝试多种形式的gc()。我目前还没有意识到解决方案,除了按照你的建议重新启动R. R似乎没有对内存进行碎片整理。

答案 3 :(得分:0)

我意识到这是一个老问题,但是我发现(在OS Mojave上)在R会话中调用pryr :: mem_used()会导致活动监视器立即更新报告的内存使用情况以仅反映保留的对象在R环境中。