3

私の目的は、毎回異なるパラメーター セットを使用して、R スクリプトを繰り返し実行することです。

そのために、私は bash スクリプトを使用して、入力ファイルをループ処理することでコマンドライン パラメーターを R スクリプトに渡しています。このファイルでは、各行に 7 つのパラメーターの異なる組み合わせが含まれています。

入力ファイルは次のようになります。

10 food 0.00005 0.002 1 OBSERVED 0
10 food 0.00005 0.002 1 OBSERVED 240
10 food 0.00005 0.002 1 OBSERVED 480
10 food 0.00005 0.002 1 OBSERVED 720
10 food 0.00005 0.002 1 OBSERVED 960
10 food 0.00005 0.002 1 OBSERVED 1200

コマンド ライン パラメーターが渡される R スクリプトは、次のように始まります。

commandArgs(trailingOnly=FALSE)
A <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -6 )]) 
B <-             commandArgs()[as.numeric(length(commandArgs()) -5 )]  
C <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -4 )]) 
D <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -3 )]) 
E <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -2 )])
F <-             commandArgs()[as.numeric(length(commandArgs()) -1 )]  
G <- as.numeric (commandArgs()[as.numeric(length(commandArgs())    )]) 

これらを読み取り、R スクリプトをディスパッチする bash ループは次のとおりです。

#!/bin/bash
N=0
cat Input.txt | while read LINE ; do
N=$((N+1))
echo "R --no-save < /home/trichard/Script.R" "$LINE" |  bsub  -N -q priority -R "select[model==Xeon5450]"  
done

ただし、問題は、Input.txt に何百万行もあるということです。そのため、このアプローチは遅すぎます (他の LSF ユーザーが自分のジョブを送信するのを妨げます)。

問題は、LSF 配列を使用して上記を行う方法です。

4

3 に答える 3

3

主なトリックはn、入力ファイルから th 行を抽出することです。Unix ライクなシステムを使用していると仮定すると、「sed」コマンドを使用してそれを行うことができます。次に例を示します。

N=$(wc -l < input.txt)
echo 'R --no-save -f Script.R --args $(sed "${LSB_JOBINDEX}q;d" input.txt)' |
  bsub -J "R_Job[1-$N]" -N -q priority -R "select[model==Xeon5450]"

この例では、正しい引数の引用は少し難しく、非常に重要です。

これはRの「--args」オプションを使用して、認識されない引数に関する警告メッセージを回避することに注意してください。commandArgs(trailingOnly=TRUE)関心のある引数のみが表示されるように、R スクリプトで使用することもお勧めします。

于 2015-12-23T19:14:37.710 に答える
0

おそらく、すべてを R に入れ、「doMPI」のような適切な並列化フレームワークで「foreach」ループ構成を使用することを検討する必要があります (または、本当にやる気がある場合は純粋な Rmpi​​ ;-))。したがって、クラスター上のジョブ管理システムは完全に制御され、基本的に単一のジョブを送信します

特定の問題に対する解決策ではなく、ヒントです。

于 2015-12-23T20:15:47.533 に答える
0

Steve Westson の答えはうまくいきます。ありがとう!

ただし、LSF システムでは、1 つのアレイ内の最大 N ジョブは最大 1000 に制限されています。つまり、1000 を超えるジョブがある場合、次のように複数のジョブ配列を送信する必要があります。

#!/bin/bash
increment=1000
startvalue=1
stopvalue=$(wc -l < Col_Treat_BETA_MU_RAND_METHOD_part1.txt)                           
stopvalue=$((  ($increment*((stopvalue+999)/$increment))+$increment ))                 
end=$increment

for ((s=$startvalue,e=$end ; e<$stopvalue; s+=$increment,e+=$increment)); do
  echo $s "-" $e
 echo 'R --no-save -f script.R --args $(sed "${LSB_JOBINDEX}q;d" input.txt)' |  bsub -J "R_Job[$s-$e]"  -N -q normal
done

したがって、これにより、他のユーザーを本質的にブロックし、システム管理者を悩ませる元のジョブごとのループがなくても、すべてのジョブが即座に正常に送信されます。再度、感謝します!

コメントの最大長を超えているため、これを回答として投稿しています。

于 2015-12-26T00:45:06.097 に答える