如何在不重新启动电脑的情况下清理 R 内存?

我在 R (在 Windows 下)运行我的代码,这涉及到大量的内存数据。我尝试使用 rm(list=ls())来清理内存,但似乎内存仍然占用,我不能重新运行我的代码。我试图关闭 R 并重新启动 R,但它是相同的,似乎仍然占用内存,因为当我运行代码它说它不能分配内存(但它可以在第一次)。内存似乎只有在我重新启动电脑后才清理干净。

有没有办法清理内存,这样我就可以重新运行我的代码,而不用每次都重新启动我的电脑?

177206 次浏览

也许您可以尝试使用函数 gc()。对 gc()的调用会导致发生垃圾回收。在删除大型对象之后调用 gc()可能很有用,因为这可能会提示 R 将内存返回到操作系统。 gc()还返回占用内存的摘要。

Linux 下的一个例子(Fedora 16)显示,当 R 关闭时,内存被释放:

$ free -m
total       used       free     shared    buffers     cached
Mem:          3829       2854        974          0        344       1440
-/+ buffers/cache:       1069       2759
Swap:         4095         85       4010

使用2854MB,接下来我打开一个 R 会话并创建一个大的随机数矩阵:

m = matrix(runif(10e7), 10000, 1000)

当创建矩阵时,使用3714MB:

$ free -m
total       used       free     shared    buffers     cached
Mem:          3829       3714        115          0        344       1442
-/+ buffers/cache:       1927       1902
Swap:         4095         85       4010

After closing the R session, I nicely get back the memory I used (2856 MB free):

$ free -m
total       used       free     shared    buffers     cached
Mem:          3829       2856        972          0        344       1442
-/+ buffers/cache:       1069       2759
Swap:         4095         85       4010

当然,您使用的是 Windows,但是您可以在 Windows 中重复这个练习,并在 R 中创建这个大型数据集之前和之后报告可用内存的开发情况。

使用 ls()函数查看哪些 R 对象占用了空间。使用 rm (“ objectName”)从 R 内存中清除不再需要的对象。也参见 这个

我遇到了与 R 相同的问题,我深入研究了一下,得到了一个解决方案,我们需要重新启动 R 会话来完全清理内存/RAM。为此,您可以在从工作区中删除所有内容之后使用一个简单的代码。守则如下:

rm(list = ls())


.rs.restartR()
memory.size(max=T) # gives the amount of memory obtained by the OS
[1] 1800
memory.size(max=F) # gives the amount of memory being used
[1] 261.17

以保罗为例,

m = matrix(runif(10e7), 10000, 1000)

Now

memory.size(max=F)
[1] 1024.18

为了消除记忆

gc()
memory.size(max=F)
[1] 184.86

In other words, the memory should now be clear again. If you loop a code, it is a good idea to add a gc() as the last line of your loop, so that the memory is cleared up before starting the next iteration.

我发现进入我的“ tmp”文件夹并删除所有挂起的会话文件很有帮助。这通常可以释放任何看似“卡住”的内存。

只是添加这个作为参考,以防有人需要重新启动并立即运行命令。

I'm using this approach just to clear RAM from the system. Make sure you have deleted all objects no longer required. Maybe gc() can also help before hand. But nothing will clear RAM better as restarting the R session.

library(rstudioapi)
restartSession(command = "print('x')")

您只能对 rm ()和 gc ()做这么多。正如 Gavin Simpson 所建议的,即使你在 R 中释放了实际的内存,Windows 通常也不会回收它,直到你关闭 R 或者它是必需的,因为所有明显的 Windows 内存都被填满了。

这通常不是问题。但是,如果您运行的是大型循环,从长远来看,这有时会导致内存碎片化,即使您释放内存并重新启动 R ——碎片化内存可能会阻止您分配大块内存。特别是如果其他应用程序在运行 R. rm ()和 gc ()时分配了片段内存,可能会延迟这种不可避免的情况,但是更多的 RAM 更好。