创建大对象并用完 RAM 后,我将尝试使用删除当前环境中的对象
rm(list=ls())
当我检查我的 RAM 使用情况时,没有任何变化。即使打电话后gc()
也没有任何改变。我只能通过退出 R 来补充我的 RAM。
有人对在 R 中处理内存密集型对象有什么建议吗?
创建大对象并用完 RAM 后,我将尝试使用删除当前环境中的对象
rm(list=ls())
当我检查我的 RAM 使用情况时,没有任何变化。即使打电话后gc()
也没有任何改变。我只能通过退出 R 来补充我的 RAM。
有人对在 R 中处理内存密集型对象有什么建议吗?
已删除对象的内存不会立即释放。R 使用一种称为“垃圾收集”的技术来回收已删除对象的内存。它会定期循环访问可访问对象的列表(基本上,那些具有名称但未被删除,因此用户可以访问的对象),并“标记”它们以进行保留。在垃圾收集扫描之后,任何未标记对象的内存都会返回给操作系统。
垃圾收集会自动发生,您无法直接控制此过程。但是您可以通过从命令行调用命令 gc() 来强制扫描。
即便如此,在某些操作系统上,垃圾收集可能不会回收内存(如操作系统所报告的那样)。例如,旧版本的 Windows 可以增加但不会减少 R 的内存占用。垃圾收集只会为将来的新对象腾出空间,但不会减少 R 的内存使用。
在 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,然后您尝试为新变量分配更多内存。
gc()
我的印象是在 R 报告内存分配失败之前尝试了多种形式。除了按照您的建议重新启动 R 之外,我目前不知道有解决方案。看来R不会对内存进行碎片整理。
我意识到一个老问题,但我发现(在 OS Mojave 上),在 R 会话中调用 pryr::mem_used() 会导致活动监视器立即更新报告的内存使用情况,以仅反映 R 中保留的对象环境。