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