在shell命令R中的并行计算

问题描述:

我有用例,我试图通过一堆文件运行我的Rscript调用。我写下下面的代码片段 -在shell命令R中的并行计算

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,但我无法弄清楚可以应用于我的用例的最佳方式。有人在这方面有经验能告诉我一个方法吗?

+0

你的脚本正在返回一些东西?写入全球环境?你想摆脱他们什么? –

+0

是的,它们在作为命令行参数传递的定义文件夹中生成输出。 –

+0

仅供参考,不是手动添加shell引号,而是使用'shQuote(str)';它是操作系统特定的,并负责某些字符的转义等。 – HenrikB

如果您不想在环境中创建变量,但只需编写一些输出文件,则可以用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比for循环更多。您可以通过this tutorial了解更多信息。

+0

我按照您的建议运行我的代码。让我评估表现。有没有办法检查并行运行多少个并行shell命令?本质上,我的代码在foreach中调用system()。 –

+0

@PrakharGupta打开您的系统监视器。你会为每个使用的内核调用一个叫做“R”的进程。 –

+0

谢谢。有效。你能否在R博客中推荐我一些很好的设计模式实现? –