コマンドを実行しています(正確に言うとpngQuant:https://github.com/pornel/pngクエント)ターミナルウィンドウで。 4つの端末ウィンドウを開き、各ウィンドウでpngQuantコマンドを実行すると、同時に4倍速く、効果的に4倍の画像を圧縮できることがわかりました。
そのため、このアプローチを使用して圧縮したい画像の部分を各pngqunatプロセスに割り当てることで、複数のスレッドで複数のプロセスを効果的に作成しました。
私が行ったこれらのトリックを実行せずに複数のスレッドでコマンドを実行できますか?私が言いたいのは、「これらすべての画像に対してpngQuant圧縮を実行し、利用可能なすべてのスレッドを使用する」ということです。
答え1
moreutilsparallelとGNUparallelの両方がこれを行います。 moreutilsと並行して次のようになります。
parallel -j "$(nproc)" pngquant [pngquant-options] -- *.png
nproc
available-processors() pngQuants をすぐに実行するために使用可能なプロセッサ (スレッド) の数を-j "$(nproc)"
各単一の PNG ファイルを渡して出力します。開始オーバーヘッドが高すぎる場合は、次の-n
オプションを使用してPNGファイルを各実行に同時に渡すことができます。-n 2
2つのPNGが各pngQuantに渡されます。
答え2
GNUの使用xargs
:
find . -type f -name '*.png' -print0 | xargs -r0 -n10 -P "$(nproc)" pngquant
(pngquant
呼び出しごとに最大10個のファイルを圧縮して"$(nproc)"
最大(システム内のプロセッサ数)だけ同時に実行)
答え3
GNU Parallelを使用すると、次のようになります。
parallel pngquant --my-options ::: *.png
または:
ls | grep \\.png | parallel pngquant --my-options
デフォルトでは、各CPUコアは1つのジョブを実行します。あなたの場合は、コアのタスクよりも1つ以上のタスクを実行したい場合があります。
ls | grep \\.png | parallel -j+1 pngquant --my-options
pngquant
データの読み書きに時間がかかるからです。この間、ディスクを待機してCPUをほとんど使用しないため、アイドルCPU時間がある可能性があります。確かに知っている唯一の方法は、どちらが速いかを測定して確認することです。
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
セキュリティ上の理由から、パッケージマネージャを使用してGNU Parallelをインストールする必要がありますが、GNU Parallelが展開用にパッケージ化されていない場合は、rootアクセスを必要としないプライベートインストールを実行できます。これは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