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の最初の記事、厳密に判断しないでください)



All Articles