簡體   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