2

jpegファイルとpngファイルを可逆圧縮するbashスクリプトを作成しているので、Ubuntuでjpegoptimoptipngという名前の2つのパッケージを使用します。Aは、 2つまたは4つのコアプロセッサでスクリプトを使用します。CPUの全容量を使いたいのですが。

問題は、optipngがデフォルトでマルチスレッドをサポートしていないことです(1つのCPUコアのみを使用します)。そのため、画像をより高速に圧縮するために2つまたは4つの並列プロセスを起動することにしました。私はすでに画像ファイルを(ピクセル数に基づいて)4つのほぼ等しい配列にソートしました。次に、並列化されたプロセスを実行する必要があります。

コマンドの最後にある文字を使用してプロセスを並列化しようとしていますが、並列処理&が実行されません。

optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_1[@]} &)
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_2[@]} &)
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_3[@]} &)
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_4[@]} &)

コマンドの出力をキャッチする必要があるので、問題は$()構造にあると思います。

4

2 に答える 2

3

Gnu parallelを見てください。既存のスクリプトを少し変更するだけで、必要なことを実行できます。

于 2013-03-22T10:08:34.667 に答える
2

taskset&コマンドで問題を解決しました。@jedwardsに感謝

最終的なコードは次のようになります。

outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_1[@]}) &
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_2[@]}) &
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_3[@]}) &
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_4[@]}) &
于 2013-03-22T12:00:17.563 に答える