file = 1〜50など、複数のファイルを実行するRスクリプトがあります。私は通常、Rスクリプトの数を変更して繰り返し操作を送信します(例:10個のファイルを毎回5回)。それでは、課題を5回提出せずに一度に5つの課題を提出するにはどうすればよいですか?また更新したいです。基本出力そしてエラーファイルすべての職業について。
Bashコードの例:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -o default.out
#PBS -e errorfile
module load R/4.0
Rscript ~/r_script1.R
答え1
スクリプトのコメントqsub
ではなく、コマンドラインでこれらのオプションの一部または全部を指定できます。#PBS ...
たとえば、バッチスクリプトを次のように書き換えることができます。
qsub -l nodes=1:ppn=20,walltime=05:00:00 -m e -o default.out -e errorfile script.sh
qsubコマンドラインですべてのオプションを使用し、script.sh
以下を含めます。
#!/bin/bash
module load R/4.0
Rscript ~/r_script1.R
これら2つの方法を組み合わせてqsubにオプションを提供できます。たとえば、コマンドラインに-o
オプションを提供し、-e
スクリプトの残りの部分をコメントアウトする#PBS
ことができます。
$ qsub -o default.out -e errorfile script2.sh
Script2.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script1.R
for
その後、これをbashループと組み合わせることができます。
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" script2.sh
done
ループ変数の値をスクリプトに渡す必要がある場合は$i
可能です。ただし、使用するクラスタ管理ソフトウェア(slurm、Torqueなど)に応じて、いくつかの異なる方法があります。qsub
使用しているバージョンに関係なく動作する最も簡単な方法の1つは、-v
qsubオプションを使用することです。
たとえば、各タスク(r_script1.R、r_script2.Rなど)で異なるRスクリプトを実行する必要がある場合は、環境で利用可能なスクリプトを使用できます-v i
。$i
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" -v i script3.sh
done
Script3.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script"$i".R
qsubの一部の実装では、コマンドラインから引数をスクリプトに直接渡すことができ、これをスクリプト内の一般的な位置引数($ 1、$ 2、$ 3など)として使用できます。
ほとんどの(すべて?)実装は、タスク配列を指定するオプションもqsub
サポートしています。-t
PBS_ARRAYID環境変数を使用してジョブスクリプトからアクセスできます。例えば
qsub script4.sh
-o
script4.sh(qsubとオプションの代わりに出力ファイルとエラーファイルのシェルリダイレクトを使用します-e
):
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -t 1-5
module load R/4.0
Rscript ~/r_script"$PBS_ARRAYID".R > "default.$PBS_ARRAYID.out" 2> "errorfile.$PBS_ARRAYID"
Sys.getenv("PBS_ARRAYID")
ただし、PBS_ARRAYIDはエクスポートされた環境変数なので、必要に応じてRスクリプトからアクセスできます。たとえば、これを使用して入出力ファイル名を構成し、Rスクリプトの操作を制御するためのif/then/else決定を下すことができます。これは、同じRスクリプトのいくつかの異なるバージョンを複数持つよりも優れています。
注:Torqueとslurmの両方を実行しているHPCクラスターを管理しましたが、管理してから約8年になりました。上記の例はすべてメモリから作成され(qsub
インターネットからのマニュアルページの検索)、実際のクラスタでテストされていません。 (おそらく)機能するには、いくつかの変更が必要な場合があります。具体的には、$ PBS_ARRAYIDを使用した最後の例は、目的の操作を実行する方法のおおよその例として提供されています。