繁体   English   中英

在 R 中并行计算 shell 命令

[英]Parallel computation in R for shell commands

我有一个用例,我试图在一堆文件上运行调用我的 Rscript。 我已经写下了下面的片段 -

for(i in 1:length(fileNames)){

  generateTolerancesCommand = paste(c("Rscript ",modelScriptName,
                                      " --inp=",paste(c("'",dimensionsFolder, "/", fileNames[i],"'"), collapse = ""),
                                      " --sea=",seasonal,
                                      " --freq=",freq,
                                      " --outp=",paste(c("'",outputFolder,"/","'"), collapse=""),
                                      " --tp=",tp,
                                      " --sd=",sd,
                                      " --end=",end,
                                      " --op=",op,
                                      " --tls=",tls,
                                      " --pts=",pts,
                                      " --userf=",paste(c("'",dimensionsFeedbackFolder, "/", fileNames[i],"'"), collapse = "")
                                     ),collapse="")
  system(generateTolerancesCommand)
}

这工作正常,但通常需要大约 3-4 分钟才能完成 1 个循环,最终目前需要大约 2 小时才能完成脚本。 我想我可以通过使其平行来做得更好。 在每次迭代中,我都会生成一个独立的 R 执行运行片段,它可以在独立的数据集上工作。 我尝试阅读并行库,如 R 中的 parallel、doParallel,但我无法找出适用于我的用例的最佳方法。 有这方面经验的人可以给我建议吗?

如果您不想在环境中创建变量而只想编写一些输出文件,则可以将循环替换为foreach

library(foreach)
cl <- parallel::makeCluster(parallel::detectCores() - 1) 
doParallel::registerDoParallel(cl)
foreach(i = seq_along(fileNames), .combine = 'c') %dopar% {

  ## PUT YOUR CODE HERE

  NULL
}
parallel::stopCluster(cl)

带有.combine = 'c'NULL只是为了让foreach返回任何内容(只是一个NULL ),因为foreach作用不仅仅是lapply不是 for 循环。 您可以通过本教程了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM