随着循环的进行,我的内存和速度都很低。如果我在write.csv()之后立即将gc()
置于循环中,这是正确的还是有任何帮助?
循环我得到了:
for(i in seq_along(x) {
....
....
write.csv(x, file=paste("C:/....",i,".csv",sep=""))
}
答案 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)
因此,似乎每次调用gc()
可能不是一个好主意。当然,这取决于你在循环中做了什么。
只是预感:垃圾收集问题不会减慢您的代码速度。您可以优化代码的其他部分,例如使用*ply
函数代替for
循环有时可以提供帮助。
希望它有所帮助,
亚历