在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,但我无法弄清楚可以应用于我的用例的最佳方式。有人在这方面有经验能告诉我一个方法吗?
如果您不想在环境中创建变量,但只需编写一些输出文件,则可以用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了解更多信息。
我按照您的建议运行我的代码。让我评估表现。有没有办法检查并行运行多少个并行shell命令?本质上,我的代码在foreach中调用system()。 –
@PrakharGupta打开您的系统监视器。你会为每个使用的内核调用一个叫做“R”的进程。 –
谢谢。有效。你能否在R博客中推荐我一些很好的设计模式实现? –
你的脚本正在返回一些东西?写入全球环境?你想摆脱他们什么? –
是的,它们在作为命令行参数传递的定义文件夹中生成输出。 –
仅供参考,不是手动添加shell引号,而是使用'shQuote(str)';它是操作系统特定的,并负责某些字符的转义等。 – HenrikB