清除R会话分配的内存(gc()无效!)

23

我正在进行大规模的机器学习,但是一段时间后,由于R内存占用过高,我的计算机变得非常缓慢。
我清除了我的对象,并尝试了 gc(),结果是:

           used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  4460452 231.5   15288838 1116.6  36599071 1954.7
Vcells 29572776 349.4  324509788 2712.9 350796378 3376.4

我的任务管理器显示R的会话仍然占用了超过3GB的内存,导致电脑运行缓慢。
我该如何释放被R占用的内存?(我不想重启电脑)


内存分配不是由操作系统自己管理的吗? - user3710546
@Pascal,No R需要内存,使用后应该释放。但由于某些原因它没有释放! - Cina
1
你是退出还是重新启动了R会话? - Roland
2
@Roland,我想如果我重新启动会话,问题就会解决。但实际上,我不想这样做,因为我经常遇到这个问题,不想每次都重新启动会话。 - Cina
1
您是否使用了一些用于并行计算的软件包? - Jot eN
显示剩余4条评论
3个回答

11

我找到的最佳解决方案是重新启动R会话。 在R Studio中,使用ctr+shft+f10

如果您不想保存工作区,则可以执行此操作。

makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)

paste0(R.home(),"/bin/i386/R --no-save") #--save will save workspace

干杯。


3
这似乎也是我唯一的选择。这真是令人恼火! - RobertMyles
9
这不是问题的答案,任何建议重新开始会话的答案也都不是。当然,如果您重启会话,所有内容都将被删除。但您不应该这样做。一旦使用gc()删除对象并进行垃圾回收,内存就应该被释放。由于某种原因,R无法正确地执行此操作。这是一个重要问题,需要由R核心团队解决。这个问题已经困扰我多年了... - Davit Sargsyan
@DavitSargsyan:你有关于那个问题的任何更新消息吗?我同意你的观点,gc()不是一个适当的解决方案(只会把空间还回来)。 - T. Beige

8

你需要遵循两个步骤。 首先,运行rm(list = ls()) 然而,尽管它会删除ls()中的所有对象,但你需要使用.rs.restartR()重新启动R。

这将有效地完全清除内存。


Error in .rs.restartR() : could not find function ".rs.restartR" - jangorecki
2
.rs.restartR()是一个RStudio的方法,它不能在普通的R中使用。 - Shique

1

就像这个答案 - https://dev59.com/4Goy5IYBdhLWcg3wCpoz#8813862 - "gc不会删除你仍在使用的任何变量,它只会释放那些你无法访问的内存。"

您可以使用rm函数删除工作环境中(几乎)所有内容:

rm(list = ls())

请注意,如果您想删除隐藏的对象,您需要使用该方法。
rm(list = ls(all.names = TRUE))

4
已经尝试过了,没有大的改变。 - Cina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接