27

创建大对象并用完 RAM 后,我将尝试使用删除当前环境中的对象

rm(list=ls())

当我检查我的 RAM 使用情况时,没有任何变化。即使打电话后gc()也没有任何改变。我只能通过退出 R 来补充我的 RAM。

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

4

4 回答 4

20

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

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

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

于 2009-08-13T15:45:04.413 回答
9

在 Windows 上,您描述的技术对我有用。试试下面的例子。

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

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

类型

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

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

键入rm("x")。RGui.exe mem 使用量仍然是 811 100K。

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

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

于 2009-07-23T11:46:06.043 回答
3

gc()我的印象是在 R 报告内存分配失败之前尝试了多种形式。除了按照您的建议重新启动 R 之外,我目前不知道有解决方案。看来R不会对内存进行碎片整理。

于 2009-07-23T04:04:24.947 回答
2

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

于 2019-07-06T03:17:19.210 回答