3

ビルドスクリプトがありますが、これは特にSolarisで非常に遅く動作します。複数のジョブで実行してパフォーマンスを向上させたい。どうやってやるの?

4

2 に答える 2

6

GNU Parallelを試してみてください。使い方はとても簡単です。

GNU parallel は、1 台以上のコンピューターを使用して並列でジョブを実行するためのシェル ツールです。ジョブは、入力の各行に対して実行する必要がある単一のコマンドまたは小さなスクリプトです。典型的な入力は、ファイルのリスト、ホストのリスト、ユーザーのリスト、URL のリスト、またはテーブルのリストです。ジョブは、パイプから読み取るコマンドにすることもできます。次に、GNU parallel は入力を分割し、それをコマンドに並列にパイプできます。

現在 xargs と tee を使用している場合、GNU parallel は xargs と同じオプションを持つように記述されているため、GNU parallel が非常に使いやすいことがわかります。シェルでループを作成すると、GNU parallel がほとんどのループを置き換えて、いくつかのジョブを並行して実行することでそれらをより高速に実行できることがわかるでしょう。

GNU 並列は、コマンドからの出力が、コマンドを順番に実行した場合と同じ出力であることを確認します。これにより、GNU パラレルからの出力を他のプログラムの入力として使用することが可能になります。

入力の各行に対して、GNU parallel はその行を引数としてコマンドを実行します。コマンドが指定されていない場合は、入力行が実行されます。複数の路線が並行して運行されます。GNU parallel は、xargs または cat | の代わりによく使用できます。バッシュ。


あなたはそれがビルドスクリプトだと言いました。コマンド ライン ユーティリティを使用している場合は、 make のオプションmakeを使用してビルドを並列化できます。-j<N>

GNU make は、複数のレシピを一度に実行する方法を知っています。通常、make は一度に 1 つのレシピのみを実行し、その完了を待ってから次のレシピを実行します。ただし、「-j」または「--jobs」オプションは、多くのレシピを同時に実行するよう make に指示します。

また、コンパイルを複数のホストに分散するためdistccに使用できるものもあります。make

export DISTCC_POTENTIAL_HOSTS='localhost red green blue'
cd ~/work/myproject; 
make -j8 CC=distcc
于 2013-02-08T11:34:23.533 に答える
2

GNUパラレルはかなり良いです。@Maxim-良い提案+1。

1回限り、新しいソフトウェアをインストールできない場合は、複数回実行する必要がある低速コマンドに対してこれを試して、slowcommandを17回実行してください。ニーズに合わせて変更します。

#!/bin/bash
cnt=0

while [ $cnt -le 17  ]    # loop 17 times
do
   slow_command  &
   cnt=$(( $cnt + 1 ))
   [  $(( $cnt % 5 )) -eq  0 ] && wait  # 5 jobs at a time in parallel 
done
wait      # you will have 2 jobs you di not wait for in the loop 17 % 5 == 2
于 2013-02-08T13:06:26.977 に答える