Bash 連続および並列ループ/コマンド

Bash 連続および並列ループ/コマンド

私が作成したPythonツールを使用していくつかのシミュレーションを実行したいと思います。問題は、他の引数/パラメータとすべての項目を使用して複数回呼び出す必要があることです。

現在、次のタスクを実行するために複数のループを使用していますfor

for simSeed in 1 2 3 4 5
do
    for launchPower in 17.76 20.01 21.510 23.76
    do
        python sim -a $simSeed -p $launchPower
    done
done

シミュレーションを同時に実行するために&シミュレータを呼び出す行の末尾にを追加しました。

python sim -a $simSeed -p $launchPower &

この方法では、これらの急流を複数実行できます。しかし、私のコンピュータのメモリは限られているので、上記のスクリプトを書き換えて内部forループを並列に開始し、外部ループを順次起動したいと思いますfor

simSeed = 1たとえば、5つの異なるプロセスを同じように実行したいとします。この部分が完了したら、5つの異なる並列プロセスを使用してスクリプトを再実行したいと思います。launchPower17.76 20.01 21.510 23.76simSeed = 2launchPower17.76 20.01 21.510 23.76

これをどのように実行できますか?

要約:

外側のループは順次実行され、内側のループは並列に実行され、内側のループの最後の並列プロセスが完了したら、外側のループが次の反復に移動することを望みます。

ベストアンサー1

GNU Parallelには、タスクを並列に開始するときにリソースの使用を制限するいくつかのオプションがあります。

2つのネストされたループの基本的な使用法は次のとおりです。

parallel python sim -a {1} -p {2} ::: 1 2 3 4 5 ::: 17.76 20.01 21.510 23.76

たとえば、最大5つのタスクを同時に開始するには、次のように言うことができます。

parallel -j5 python <etc.>

--memfreeまたは、使用可能なメモリが十分な場合(たとえば、少なくとも256 MB)、新しいタスクを開始するオプションを使用できます。

parallel --memfree 256M python <etc.>

この最後のオプションは、メモリが指定された「予約」値の50%未満に低下すると、最後に開始されたジョブを終了します(ただし、追いつくために自動的にキューに戻されます)。

おすすめ記事