我在R中运行我的代码(在Windows下),这涉及大量的内存数据。我试图使用rm(list=ls())
清理内存,但似乎内存仍然被占用,我无法重新运行我的代码。我试图关闭R并重新启动R,但它是一样的,似乎内存仍然被占用,因为当我运行代码它说它不能分配内存(但它可能在第一次)。重新启动电脑后,内存似乎才被清除。
有没有办法清理内存,以便我可以重新运行代码而不必每次都重新启动我的电脑?
答案 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越多越好。