コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【シェルスクリプト】while を並列化する方法

概要

find . -name "*.wav" -type f -maxdepth 3 | while read -r waveFile
do
    oggFile=${waveFile%.wav}.ogg
    ffmpeg -nostdin -y -i "${waveFile}" -vn -ac 2 -ar 44100 -ab 128k -acodec libvorbis -f ogg "${oggFile}"
done

ffmpeg を使用して複数の音声ファイルを処理する while に時間がかかったため
並列化するために

brew install parallel

上記のコマンドで GNU Parallel をインストールして

find . -name "*.wav" -type f -maxdepth 3 | while read -r waveFile
do
    oggFile=${waveFile%.wav}.ogg
    ffmpeg -nostdin -y -i "${waveFile}" -vn -ac 2 -ar 44100 -ab 128k -acodec libvorbis -f ogg "${oggFile}" &
done | parallel -j4

ffmpeg の処理の末尾に & をつけて
donedone | parallel -j4 に変えて並列化した

並列化したところ 12 秒かかっていた処理が 1 秒で終わるようになった