利用可能なすべてのリソースを使用して、できるだけ短時間で多数の同様のコマンドを実行する必要があります。
たとえば、私の場合は画像を処理しており、次のコマンドを使用すると、
for INPUT in *.jpg do; some_command; done
コマンドは 1 つずつ実行され、使用可能なすべてのリソースが使用されるわけではありません。
しかし、その一方で、実行するとfor INPUT in *.jpg do; some_command &; done
マシンのリソースが非常に短時間で不足することになります。
at
のコマンドについては知っていますbatch
が、自分の場合にそれを使用できるかどうかはわかりません。間違っていたら訂正してください。
そこで、コマンドを何らかのキューに入れて、その一部だけを一度に実行しようかと考えていました。それを素早く行う方法がわからず、それが問題です。以前にも同じような問題に遭遇した人がいるはずです。
お知らせ下さい。
答え1
GNU Parallel はまさにこのために作られています:
parallel some_command {} ::: *.jpg
デフォルトでは、CPU コアごとに 1 つのジョブになります。コア数よりも 1 つ多いジョブを実行したい場合があります。
parallel -j+1 some_command {} ::: *.jpg
GNU Parallel は汎用的な並列化ツールであり、同じマシン上または SSH アクセスできる複数のマシン上でジョブを並列に実行することを容易にします。
4 つの CPU で実行したい 32 個の異なるジョブがある場合、並列化するための最も簡単な方法は、各 CPU で 8 つのジョブを実行することです。
GNU Parallel は、代わりに、1 つのプロセスが終了すると新しいプロセスを生成します。これにより、CPU がアクティブな状態になり、時間が節約されます。
インストール
セキュリティ上の理由から、GNU Parallel はパッケージ マネージャーを使用してインストールする必要がありますが、GNU Parallel がディストリビューションにパッケージ化されていない場合は、ルート アクセスを必要としない個人用インストールを行うことができます。次の操作を実行すると、10 秒で完了します。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、http://git.savannah.gnu.org/cgit/parallel.git/tree/README
もっと詳しく知る
その他の例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオをご覧ください:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
チュートリアルを進めてください:http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メール リストに登録してください。https://lists.gnu.org/mailman/listinfo/parallel
答え2
GNU make では、--jobs
並列実行オプションを使用できますが、ジョブの数は指定された数に制限されます。マシンを破壊しない程度にジョブ数を調整できます。
以下は、ターゲット ah (これらは出力ファイルなど) を使用し、各ターゲットに対して (ダミーの) コマンド セットを実行する Makefile の例です。
all: a b c d e f g h
a b c d e f g h:
echo $@; sleep 10
注: コマンドのインデントしなければならないタブ文字でなければなりません。GNU make ドキュメントMakefile の構文の詳細については、 を参照してください。
次のように make を呼び出すとmake --jobs 4
、次の出力が得られます (time make --jobs 4
経過時間を表示するために以下を使用しました)。
echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h
real 0m20.009s
user 0m0.010s
sys 0m0.011s
最初の 4 つは並行して実行され、その後に次の 4 つが実行されたため、経過時間の合計は 20 秒になります。