使用R在循环中清除内存

时间:2014-05-23 18:03:30

标签: r

随着循环的进行,我的内存和速度都很低。如果我在write.csv()之后立即将gc()置于循环中,这是正确的还是有任何帮助?

循环我得到了:

for(i in seq_along(x) {
 ....
 ....
 write.csv(x, file=paste("C:/....",i,".csv",sep=""))
}

1 个答案:

答案 0 :(得分:1)

需要时会自动调用垃圾收集器。使用gc()调用垃圾收集器。我认为,如果你在循环中删除对象,只使用它是有意义的。然后调用垃圾收集器可以提供帮助。引自?gc

  

“[...]删除大对象后调用'gc'会很有用,因为这可能会提示R将内存返回给操作系统。”

调用gc()可能非常耗时。我做了一点测试来检查:

library(microbenchmark)
library(ggplot2)
lst <- rep(list(rnorm(10000)), 30)

res <- microbenchmark(
  for(i in seq_along(lst)) {
    write.csv(lst[[i]], file="delme.csv")
    gc()
  }, 
  for(i in seq(ll)) {
    write.csv(lst[[i]], file="delme.csv")
  })

levels(res$expr) <- c("with gc()","without gc()")
autoplot(res)

enter image description here

因此,似乎每次调用gc()可能不是一个好主意。当然,这取决于你在循环中做了什么。

只是预感:垃圾收集问题不会减慢您的代码速度。您可以优化代码的其他部分,例如使用*ply函数代替for循环有时可以提供帮助。

希望它有所帮助,

亚历