R语言使用foreach循环无法保存abc列表至myResults.rds文件
问题原因
你代码里的核心问题是并行进程的内存隔离:用%dopar%时,每个worker都是独立的进程,主进程中定义的abc列表在worker里的修改不会同步回主进程,所以最后保存的abc还是初始的空列表。
解决方案
不需要在foreach循环里手动给全局列表赋值,直接利用foreach的返回值特性——它会自动把每个迭代的结果收集成一个列表。
方案1:仅保存目标结果(lstData)
修改后的代码如下:
library(foreach) library(doParallel) # 创建6核集群 cl <- makeCluster(6) registerDoParallel(cl) # 定义生成数据的函数 generate<-function(p){ MIN <- (1-p)*100 MAX <- (1+p)*100 print(paste(MIN,MAX)) # 直接初始化正确行数的矩阵,避免循环里rbind(更高效) mat <- matrix(nrow=11, ncol=4) for (i in 1:11){ mat[i,] <- round(runif(4, MIN, MAX), 2) } return(mat) } # 并行循环,直接将返回值赋值给abc abc <- foreach(i = 1:3) %dopar% { lstData <- generate(0.05) # 这里放你的分析代码 addNum <- 1+2+3 subNum <- 1-2-3 # 最后返回你想要保存的目标数据(lstData) lstData } # 保存结果 saveRDS(abc, file = "myResults.rds") stopCluster(cl)
方案2:需要保存多个结果(比如lstData和分析后的数值)
如果循环里有多个需要保留的结果,可以让每个迭代返回一个包含多个元素的列表,之后再按需提取:
# 并行循环返回多结果列表 results <- foreach(i = 1:3) %dopar% { lstData <- generate(0.05) addNum <- 1+2+3 subNum <- 1-2-3 # 返回包含所有需要数据的列表 list(data = lstData, sum = addNum, diff = subNum) } # 提取目标的lstData到abc列表 abc <- lapply(results, function(x) x$data) saveRDS(abc, file = "myResults.rds")
额外优化建议
- 原
generate函数里用rbind循环扩展矩阵效率很低,直接初始化对应行数的矩阵再赋值更高效(已在方案1代码中修改)。 - 如果不需要打印
MIN和MAX,可以去掉print语句,减少并行时的输出干扰。
内容的提问来源于stack exchange,提问作者BasicTex
相关产品推荐
相关产品推荐

