如何清理R内存(无需重启我的电脑)?

时间:2012-07-20 12:51:29

标签: r

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

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

8 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:18)

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

rm(list = ls())

.rs.restartR()

答案 2 :(得分:7)

使用ls()函数查看R对象占用的空间。使用rm(“objectName”)清除R内存中不再需要的对象。另见this

答案 3 :(得分:2)

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中创建这个大数据集之前和之后可用内存的开发方式。

答案 4 :(得分:2)

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

使用Paul的例子,

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

现在

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

清理内存

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

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