我有一个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
需要这些东西。请帮我解决这个问题吧
答案 0 :(得分:2)
使用GNU Parallel:
parallel -j $nCores fextract -- `ls`
或者您可以将xargs
与-P键一起使用(对find
有用)。
这些命令将在多个线程中启动您的代码,这将允许它们在多个核心上执行。
答案 1 :(得分:0)
使用GNU Parallel:
cat filenames | parallel fextract {} {.}.fcc
由于花费了一些时间用于磁盘I / O,因此每个cpu核心运行一点点可能会更快:
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