Linuxタスクの並列化

多くのビデオファイルをトランスコードするのに時間がかかりました。 このため、次のスクリプトを作成しました。

#!/bin/bash

recode() {
mencoder -o $2 $1 -ovc x264 -x264encopts bitrate=22000:keyint=50 -oac mp3lame -lameopts vbr=3:br=320 -fps 50
}
recode input/00108.mts 00108.avi
recode input/00109.mts 00109.avi
...
...


すべての準備が整っているように見えますが、2つのうち1つのプロセッサしかロードされていないことに気付きました。つまり、このプロセスを2回加速できます。


最初の方法:メンコーダーによる並列化



メンコーダーオプションを設定できます。 x264コーデックの場合、スレッドの数を指定できます。
  • スレッド= <0-16>
    複数のプロセッサで同時にエンコードにストリームを使用します(デフォルト:1)。 これにより、エンコードの品質がわずかに低下します。 0または 'auto'-プロセッサの数を自動的に決定し、適切な数のスレッドを使用します。

この方法は優れていますが、一般的ではなく、結果の品質が低下する可能性があります。

2番目の方法:Bashを使用した並列化


この方法は単純で、たとえば次のようにプロセスを並行して開始します。

(recode input/00108.mts 00108.avi
recode input/00109.mts 00109.avi
...
...) &
(recode input/00108.mts 00110.avi
recode input/00109.mts 00111.avi
...
...)

この方法の欠点は、ファイルのサイズが異なるため、ファイルの処理時間が大幅に異なる可能性があり、その結果、一方のプロセッサが他方よりもはるかに早くアンロードされる可能性があることです。

3番目の方法:GNU makeとの並列化


2つのタスクが常に並行して機能し、完了したときに新しいタスクが開始されるように、シナリオを何らかの形で改善したかったのです。 これを行う方法を考えて、必要なことを正確に実行できるすばらしいビルドユーティリティがあることを思い出しました。 次のことが判明しました。

メイクファイル:
all: 00108.avi 00109.avi 00110.avi 00111.avi 00118.avi 00119.avi 00120.avi 00123.avi

VPATH = input:.
%.avi: %.mts
mencoder -o $@ $< -ovc x264 -x264encopts bitrate=22000:keyint=50 -oac mp3lame -lameopts vbr=3:br=320 -fps 50

驚くほどシンプルで短いことがわかりました。 最初に、受信したいすべてのファイルのリストがリストされています。 その後にソースファイルへのパスとビルドルールが続きます。 コマンド「make -j 2」を使用して実行し、2つのプロセスが同時に機能するようにします。

(habrの最初の記事、厳密に判断しないでください)

Source: https://habr.com/ru/post/J66903/


All Articles