1
循環過程中,內存和速度都很低。如果我在write.csv()之後立即將gc()
放入循環中,是否正確並有幫助?清除與R循環中的內存
圈我有:在需要的時候
for(i in seq_along(x) {
....
....
write.csv(x, file=paste("C:/....",i,".csv",sep=""))
}
循環過程中,內存和速度都很低。如果我在write.csv()之後立即將gc()
放入循環中,是否正確並有幫助?清除與R循環中的內存
圈我有:在需要的時候
for(i in seq_along(x) {
....
....
write.csv(x, file=paste("C:/....",i,".csv",sep=""))
}
垃圾收集器被自動調用。使用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
循環有時可以提供幫助。
希望它能幫助,
亞歷
我想你的意思是'糊( 「C:/ ....」,我,名爲 「.csv」 09月= 「」))'和'也x [[i]]'而不是'x'。考慮提供一些關於你在循環中做什麼的更多信息,你是否創建臨時對象然後刪除它們? – alko989
不,實際上我正在做一些刮擦,這需要我一步一步來做。所以數據是分步存儲的。所有的作品,只是想知道在每個「i」存儲數據之後,我是否可以在循環中釋放一些內存。 – Maximilian
我不確定你爲什麼不能自己試試看看。不過,我的猜測是,如果有的話,它不會有太大的幫助。 – joran