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之前。