
私の 12 コア マシンには、ファイルで実行する 150 個の CLI コマンドのコレクションがあります。150 個のタスクすべてをバックグラウンドで実行すると、システムが遅くなるため、経験上、12 ~ 18 個のタスクを実行するのが最適であることがわかりました。
以前は、split コマンドを使用して 150 個のコマンドを 12 個または 13 個のバッチ ファイルに分割し、それぞれを実行していました。しかし、一部のバッチ ファイルは他のバッチ ファイルよりも早く終了し、最終的には 3 個または 4 個のバッチ ファイルが他のバッチ ファイルよりも完了までにかなり長い時間がかかり、残りの 9 個または 8 個のコアはアイドル状態になります。
私の目標は、150 個の CLI コマンドがすべて実行されるまで、12 個のコアすべてを実行し続けることです。
各プロセッサが 150 個の CLI コマンド リストから 1 つのタスクを取得し、そのコマンドを実行中としてマークし、他の 11 個のプロセッサが各自の項目を取得し、プロセッサが互いに衝突して同じ CLI コマンドを取得することなく、150 個すべての処理が完了するまで実行することは可能ですか? ファイルへの書き込みは一意である必要があります。
これを簡単に行う方法はありますか?
答え1
GNU Parallel を使用すると次のようになります。
cat 150commands.txt | parallel
コアごとに 1 つのジョブが実行されます。
GNU Parallel は汎用の並列化ツールであり、同じマシンまたは SSH アクセスできる複数のマシンでジョブを並列に実行することを容易にします。多くの場合、for
ループを置き換えることができます。
4 つの CPU で実行したい 32 個の異なるジョブがある場合、並列化するための最も簡単な方法は、各 CPU で 8 つのジョブを実行することです。
GNU Parallel は、代わりに、1 つのプロセスが終了すると新しいプロセスを生成します。これにより、CPU がアクティブな状態になり、時間が節約されます。
インストール
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