2017-10-12 12 views
0

私はRscriptを複数のファイルに対して実行しようとしているユースケースがあります。シェルコマンドの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) 
} 

これは正常に動作しますが、それは通常、最終的には、現在のスクリプトを終了する約2時間かけて完了するために1つのループの周り3-4分かかる - 私は以下のスニペットを下に書かれています。私はそれを平行にすることでより良くできると思う。各反復では、独立したデータセットで作業できるR実行実行の独立したスニペットを作成しています。 並列のような並列ライブラリであるdoParallelをRで読み込もうとしましたが、usecaseに適用できる最適な方法を見つけることができません。これを経験した人は私に道を示唆することができますか?

+0

スクリプトは何かを返していますか?グローバルな環境への書き込み?あなたは何から逃げたいのですか? –

+0

はい、コマンドライン引数として渡された定義済みのフォルダに出力を生成します。 –

+0

FYIでは、シェルクォートを手動で追加するのではなく、 'shQuote(str)'を使用します。それはOS特有であり、特定の文字などのエスケープ処理を行います。 – HenrikB

答えて

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) 

foreach以上lapply forループよりも動作しますので、.combine = 'c'とここNULLは、ちょうどforeachリターンが何も(ちょうどNULL)となるようです。 this tutorialで詳細を知ることができます。

+0

私はあなたから提案されたように自分のコードを実行しました。パフォーマンスを評価しましょう。並行して実行されている並列シェルコマンドの数を確認する方法はありますか?本質的にforeach内の私のコードはsystem()を呼び出します。 –

+0

@PrakharGuptaシステムモニタを開きます。使用するコアごとに「R」と呼ばれるプロセスが1つあります。 –

+0

ありがとうございます。出来た。 Rブログでも良いデザインパターンの実装をお勧めしますか? –