foreach能較大的提高計算速度,但是R不會自動清理內存,導致服務器內存經常佔用過高,因此使用時需要及時清理內存,以如下例子所示。
我需要讀取一批excel文件,在運行下面的代碼前,經過4次測試,Rstudio的內存情況是這樣的(Mb):
232, 237, 231.8, 230.2
在執行下面的代碼後
qcc_result <- foreach(i=1:length(result_files), .combine=rbind) %dopar% {
require(readxl)
f_path <- paste0("test/", result_files[i])
# gc()
return(read_xls(f_path, skip = 1, col_names = T))
}
gc() # 釋放內存
內存佔用爲 397.6。
qcc_result <- foreach(i=1:length(result_files), .combine=rbind) %dopar% {
require(readxl)
f_path <- paste0("test/", result_files[i])
gc() # 釋放內存
return(read_xls(f_path, skip = 1, col_names = T))
}
gc() # 釋放內存
執行了5次,執行完成後,內存使用分別爲 352.9, 346, 373.1,369.0,346。顯然,foreach每次執行時,本身也會佔用內存,而且用完以後也不會釋放,因此在foreach代碼塊中使用gc()釋放內存後,也會減少使用的內存。
注意,gc()的位置要在return之前。