2014-05-23 107 views
1

循環過程中,內存和速度都很低。如果我在write.csv()之後立即將gc()放入循環中,是否正確並有幫助?清除與R循環中的內存

圈我有:在需要的時候

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

我想你的意思是'糊( 「C:/ ....」,我,名爲 「.csv」 09月= 「」))'和'也x [[i]]'而不是'x'。考慮提供一些關於你在循環中做什麼的更多信息,你是否創建臨時對象然後刪除它們? – alko989

+0

不,實際上我正在做一些刮擦,這需要我一步一步來做。所以數據是分步存儲的。所有的作品,只是想知道在每個「i」存儲數據之後,我是否可以在循環中釋放一些內存。 – Maximilian

+2

我不確定你爲什麼不能自己試試看看。不過,我的猜測是,如果有的話,它不會有太大的幫助。 – joran

回答

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循環有時可以提供幫助。

希望它能幫助,

亞歷