在 R 中清除内存

Gustavo du Mortier 2021年2月7日
在 R 中清除内存

在使用 R 脚本一段时间后,R 环境可能会存留大量的内存数据,从而占用计算机的大量资源。这种情况最终可能会导致 R 系统因为无法再分配内存而拒绝运行代码。即使重启 R 环境,也可能发生内存没有被释放出来的情况。

命令 rm(list=ls()) 预计会释放所有对象使用的内存,但它真正做的是销毁使用的内存块的指针。问题是这些内存块并没有立即释放出来供新任务使用。

在 R 中使用 gc 函数清除内存

垃圾回收过程会在 R 中自动定期运行,但有时当你需要大量内存来进行一些大数据操作时,垃圾回收过程并没有在准确的时刻运行。在这种情况下,调用 gc() 函数来清除 R 中的内存可能会很有用。

gc() 的主要目的是显示一份关于内存使用情况的报告。副作用是,调用 gc() 会触发垃圾回收过程,清除内存。因此,正如 gc 文档所指出的那样,在删除一个大对象后调用 gc() 是个好主意,因为这个操作会提示 R 释放它不再使用的内存。

你也可以在一个循环中插入对 gc() 的调用来重复运行垃圾回收过程。只是要考虑到这个过程每次调用都需要一些时间,大约是 100ms,所以不建议把它放在一个高度重复的循环或者迭代次数多的循环中。

如果使用的是 Windows,可以调用 memory.size() 函数,用 max=T 参数来显示操作系统可访问的内存量,或者用 max=F 来显示任何时刻使用的内存量。R 文档解释了 memory.size() 函数的其他方面。

为了显示创建和销毁大数据对象时的内存消耗是如何变化的,我们可以在 Windows 中运行以下代码,创建一个具有 100,000 个元素的样本向量,删除向量,最后执行垃圾回收。在每条指令之间,我们可以通过执行 memory.size 函数,并使用 max=F 参数来检查使用了多少内存。

memory.size (max = F)

输出:

[1] 32.6

这 32.6MB 代表了 R 使用的最小内存量。

my_data <- sample (1:100000)
memory.size (max = F)

输出:

[1] 33.75

我们可以看到,由于 memory.size 函数报告的使用内存增加了 1,所以创建的样本数据大约消耗了 1 MB 的内存。

rm (my_data)
memory.size (max = F)

输出:

[1] 33.75

尽管我们删除了对象,但内存似乎仍然被占用。

gc()

输出:

         used (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells 315785 16.9     617200  33.0    617200  33.0
Vcells 633077  4.9   25730861 196.4 110503932 843.1
memory.size (max = F)

输出:

[1] 32.6

每台电脑的内存量都不一样,但你可以看到,在运行 rm (my_data) 指令后,memory.size 报告的空闲内存量保持不变,只有在执行 gc() 指令后,它才返回到 32.6 MB 的初始值,内存被有效释放。