73

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

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

4

8 回答 8

91

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

于 2012-07-23T08:31:20.280 回答
36

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

rm(list = ls())

.rs.restartR()
于 2016-04-14T08:49:30.037 回答
13

使用ls()函数查看哪些 R 对象正在占用空间。使用 rm("objectName") 从 R 内存中清除不再需要的对象。也看到这个

于 2014-10-18T10:27:45.080 回答
6
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)

现在

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

清理内存

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

换句话说,现在应该再次清除内存。如果循环代码,最好在gc()循环的最后一行添加 a,以便在开始下一次迭代之前清除内存。

于 2017-09-11T11:56:05.700 回答
3

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     

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

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

创建矩阵时,使用 3714 MB:

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

关闭 R 会话后,我很好地取回了我使用的内存(2856 MB 可用):

$ 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 中创建此大型数据集之前和之后可用内存的发展情况。

于 2012-07-23T09:04:37.897 回答
2

只需添加此内容以供参考,以防有人需要重新启动并立即运行命令。

我使用这种方法只是为了从系统中清除 RAM。确保您已删除所有不再需要的对象。也许gc()也可以事先提供帮助。但是没有什么比重新启动 R 会话更能清除 RAM 了。

library(rstudioapi)
restartSession(command = "print('x')")
于 2018-09-20T10:00:44.673 回答
1

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

这通常不是问题。但是,如果您正在运行大型循环,这有时会导致长期内存碎片,这样即使您释放内存并重新启动 R - 碎片内存也可能会阻止您分配大块内存。尤其是如果在您运行 R 时为其他应用程序分配了碎片内存。rm() 和 gc() 可能会延迟不可避免的情况,但更多的 RAM 更好。

于 2019-07-02T15:07:28.890 回答
0

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

于 2018-06-21T14:02:26.697 回答