単純なBASHスクリプトがマルチプロセス/「スレッド」BASHスクリプトに変わりましたか?

単純なBASHスクリプトがマルチプロセス/「スレッド」BASHスクリプトに変わりましたか?

Mac Pro 2010/Mojarve OS で実行する次の BASH スクリプトが動作します。

#!/bin/bash

c=0
cnt=0

# count up wav files
cnt=$(find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav" | wc -l)
echo "there are $cnt .wav voice samples."

# go through and run rhubarb on them
for f in $(find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav")
do
    c=$((c+1))
    echo "$c of $cnt";
    f=$(basename "$f" .wav)
    /hummdinger/LoCI/LoCI_orig/TSV/rhubarb-lip-sync-1.10.0-osx/rhubarb /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/"$f".wav -o /hummdinger/LoCI/LoCI_orig/LOCI_GAME_FILES/Compiled/Windows/sync/"$f".tsv
done;

WAVファイルのリストを取得し、各ファイルを繰り返し、ファイルをスキャンして出力を生成し、結果のTSVファイルを別の場所に保存します。 「rhubarb」の目的は、録音(WAVファイル)からリップシンク情報を生成することです。たぶん、あまりにも、あまりにも。

このスクリプトの1つの問題は、約3,000個のwavファイルを実行するのに約10〜12時間かかることです。私の不都合なECC RAMではなく、Mac Mini 2018で一度に故障したので、もう一度使用しないことを約束しましたが、約10分かかります。サム時間。

しかし、これはMac Proです。つまり、古い製品(2010年)でも非常に安定しており、12個のXeonを搭載しているという意味です。これは強度がかなり低い作業なので、シングルプロセッサに設定すると追加の利点がありません。私はこのスクリプトを10-15-30スレッドで動作させようとしています。これが作業をスピードアップし、一日の大半ではない1時間で完了することを願っています。

私の考えは、WAVディレクトリを(total_files / 15)グループに分割し、そのリストをfile1-15.txtに入れてから、各リストを再読み込みして15の個々のスレッドで処理することです。しかし、私が知っている限り、それはすべてです:P

誰でもこれをマルチプロセススクリプトにするのに役立ちますか?私は趣味の生活者であり、Redditの助けを借りてこのスクリプトを作成しました。

ベストアンサー1

GNU Parallelでは、次のことができます。

rhubarb=/hummdinger/LoCI/LoCI_orig/TSV/rhubarb-lip-sync-1.10.0-osx/rhubarb 

find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav" |
  parallel $rhubarb {} -o {.}.tsv

または(他のディレクトリに出力が本当に必要な場合):

find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav" |
  parallel $rhubarb {} -o /hummdinger/LoCI/LoCI_orig/LOCI_GAME_FILES/Compiled/Windows/sync/{/.}.tsv

おすすめ記事