1

我有一个 C 程序 fextract,它以 wavfile 作为输入并以某种 fcc 格式提供输出。语法类似于“fextract file.wav file.fcc”。现在我有 75000 个 wav 文件需要转换成 fcc 格式。为了加快这个过程,我打算使用我 i7 机器的所有内核。首先,我将所有输入和输出路径保存在一个文件中,我将其称为 scp 文件,例如:/mnt/disk1/file1.wav /mnt/disk2/file1.fcc /mnt/disk1/file2.wav /mnt/disk2 /file2.fcc 等等

现在使用以下 shell 脚本,我将 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

现在我的临时文件有八个子文件。我如何评估它们以使用多个内核运行程序 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

如果您想在以空格分隔的单行上同时给出输入和输出文件名,您可以使用:

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 回答