1

私は、入力としてwavfileを受け取り、いくつかのfcc形式で出力を提供するCプログラムfextractを持っています。構文は次のようになります。'fextractfile.wavfile.fcc'。今私はfcc形式に変換する必要がある75000のwavファイルを持っています。手順をスピードアップするために、i7マシンのすべてのコアを使用することを計画しています。まず、すべての入力パスと出力パスを、scpファイルと呼ぶファイルに保存しました。例:/mnt/disk1/file1.wav /mnt/disk2/file1.fcc /mnt/disk1/file2.wav / mnt / disk2 /file2.fccなど

次のシェルスクリプトを使用して、scpファイルを8つのファイルに分割し、一時ディレクトリに保存しました。

mkdir $tmpDir
cd $tmpDir

nCores=`cat /proc/cpuinfo | grep processor | wc -l`
nLines=`cat $scpFile|wc -l`

split -l $((nLines/nCores + 1)) $scpFile

現在、私の一時ファイルには8つのサブファイルがあります。複数のコアを使用してプログラムfextractを実行するためにそれらを評価するにはどうすればよいですか?

for i in `ls`
do 

fextract &i

done

この種のものが必要です。私がこれを解決するのを手伝ってくださいその緊急

4

2 に答える 2

2

GNU 並列を使用します。

parallel -j $nCores fextract -- `ls`

xargsまたは、 -P キーを使用することもできます ( で便利ですfind)。

これらのコマンドは、コードを複数のスレッドで起動するため、複数のコアで実行できます。

于 2012-10-05T17:59:09.557 に答える
0

GNU パラレルの使用:

cat filenames | parallel fextract {} {.}.fcc

ディスク I/O に時間がかかるため、CPU コアごとに 1 つより少し多く実行する方が高速な場合があります。

cat filenames | parallel -j150% {} {.}.fcc

現在のディレクトリにすべてのファイルが必要な場合:

parallel -j150% {} {.}.fcc ::: *.wav

入力と出力の両方のファイル名をスペースで区切って 1 行で指定する場合は、次のようにします。

cat filenames_2_per_line | parallel --colsep ' ' -j150% {1} {2}

ファイル名が同じ行になく、連続している場合は、一度に 2 行ずつ読み取る必要があります。

cat filenames_interleaved | parallel -N2 -j150% {1} {2}

詳細については、紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-10-09T00:11:49.517 に答える