R命令中的并行计算

时间:2017-10-12 07:41:53

标签: r parallel-processing

我有一个用例,我试图在一堆文件上运行调用我的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中的doParallel,但是我无法找出可以应用于我的用例的最佳方法。有人在这方面有经验可以建议我吗?

1 个答案:

答案 0 :(得分:0)

如果您不想在环境中创建变量但只是编写一些输出文件,则可以用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)

NULL此处.combine = 'c'只是为了foreach不返回任何内容(仅NULL),因为foreach的工作量超过lapply 1}}比for循环。您可以使用this tutorial了解详情。