【问题标题】:Saving output from parallel jobs in R into one file将 R 中并行作业的输出保存到一个文件中
【发布时间】:2016-04-24 17:10:40
【问题描述】:

我正在运行一个相当长的作业,我需要复制 100 次,因此我转向了 R 中的 foreach 功能,然后我通过 shell 脚本在 8 核集群上运行它。我正在尝试将每次运行的所有结果输入到同一个文件中。我已经包含了我的代码的简化版本。

cl<-makeCluster(core-1)
registerDoParallel(cl,cores=core)
SigEpsilonSq<-list()
SigLSq<-list()
RatioMat<-list()
foreach(p=1:100) %dopar%{

functions defining my variables{...}

  for(i in 1:fMaxInd){
   rhoSqjMatr[,i]<-1/(1+Bb[i])*(CbAdj+AbAdj*XjBarAdj+BbAdj[i]*XjSqBarAdj)/(dataZ*dataZ)
     sigmaEpsSqV[i]<-mean(rhoSqjMatr[,i])
     rhoSqjMatr[,i]<-rhoSqjMatr[,i]/sigmaEpsSqV[i]
     biasCorrV[,i]<-sigmaEpsSqV[i]/L*gammaQl(rhoSqjMatr[,i])
     Qcbar[,i]<-Qflbar-biasCorrV[,i]
     sigmaExtSq[,i]<-sigmaSqExt(sigmaEpsSqV[i], rhoSqjMatr[,i])
     ratioMatr[,i]<-sigmaExtSq[,i]/(sigmaL*sigmaL)#ratio (sigma_l^e)^2/(sigmaL)^2

   }   

   sigmaEpsSqV<-as.matrix(sigmaEpsSqV)
   SigEpsilonSq[[p]]<-sigmaEpsSqV
   SigLSq[[p]]<-sigmaExtSq
   RatioMat[[p]]<-ratioMatr 

} #End of the dopar loop

stopCluster(cl)

write.csv(SigEpsilonSq,file="Sigma_Epsilon_Sq.csv")
write.csv(SigLSq,file="Sigma_L_Sq.csv")
write.csv(RatioMat,file="Ratio_Matrix.csv")

作业完成后,我的 .csv 文件为空。我相信我不太了解 foreach 如何保存结果以及如何访问它们。我想避免手动合并文件。另外,我需要写吗 停止集群(分类) 在我的 foreach 循环结束时还是要等到最后?任何帮助将不胜感激。

【问题讨论】:

  • 如果您将鼠标悬停在标签上,您可以看到它应该如何使用。 parallel.foreach 是一个 .NET 的东西。
  • @Laurel 你可以自己把它改成正确的parallel-foreach
  • @svick 我只是想帮助作者学习如何使用标签。 (我也不知道正确的标签。我不知道 R,所以我不确定它是否重要到足以保证标签存在。)无论如何,我感谢你添加标签。
  • 谢谢你们。我通常不发帖,所以我对一切如何运作都很陌生。我一定会在未来正确标记。

标签: r shell parallel-processing parallel-foreach


【解决方案1】:

这不是 foreach 的工作方式。你应该看看例子。如果您想从并行作业中输出某些内容,则需要使用 .combine。 另外,不要这样:

sigmaEpsSqV<-as.matrix(sigmaEpsSqV)
SigEpsilonSq[[p]]<-sigmaEpsSqV
SigLSq[[p]]<-sigmaExtSq
RatioMat[[p]]<-ratioMatr 

你必须重写这样的东西:

list(as.matrix(sigmaEpsSqV),sigmaEpsSqV,sigmaExtSq,ratioMatr)

您还可以使用 rbind、cbind、c、... 将结果汇总到一个最终输出中。 你甚至可以自己组合函数,例如:

.combine=function(x,y)rbindlist(list(x,y))

下面的解决方案应该有效。输出应该是列表列表。但是,检索结果并以正确的格式保存它们可能会很痛苦。如果是这样,您应该设计自己的 .combine 函数。

cl<-makeCluster(core-1)
registerDoParallel(cl,cores=core)
SigEpsilonSq<-list()
SigLSq<-list()
RatioMat<-list()
results = foreach(p=1:100, .combine=list) %dopar%{

  functions defining my variables{...}

  for(i in 1:fMaxInd){
   rhoSqjMatr[,i]<-1/(1+Bb[i])*(CbAdj+AbAdj*XjBarAdj+BbAdj[i]*XjSqBarAdj)/(dataZ*dataZ)
     sigmaEpsSqV[i]<-mean(rhoSqjMatr[,i])
     rhoSqjMatr[,i]<-rhoSqjMatr[,i]/sigmaEpsSqV[i]
     biasCorrV[,i]<-sigmaEpsSqV[i]/L*gammaQl(rhoSqjMatr[,i])
     Qcbar[,i]<-Qflbar-biasCorrV[,i]
     sigmaExtSq[,i]<-sigmaSqExt(sigmaEpsSqV[i], rhoSqjMatr[,i])
     ratioMatr[,i]<-sigmaExtSq[,i]/(sigmaL*sigmaL)#ratio (sigma_l^e)^2/(sigmaL)^2

   }   

   list(as.matrix(sigmaEpsSqV),sigmaEpsSqV,sigmaExtSq,ratioMatr)

} #End of the dopar loop

stopCluster(cl)

#Then you extract and save results

【讨论】:

  • 感谢您的解释。这肯定有很大帮助。
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2015-06-16
相关资源
最近更新 更多