2012-10-05 21 views
1

我有一个C程序fextract,它以wavfile作为输入并以某种fcc格式输出。语法如下所示:'fextract file.wav文件。 FCC”。现在我有75000个wav文件需要转换成fcc格式。加快我计划使用我的i7机器的所有核心的程序。首先我将所有输入和输出路径保存在一个文件中,我称之为scp文件 例如:/mnt/disk1/file1.wav /mnt/disk2/file1.fcc /mnt/disk1/file2.wav/mnt /disk2/file2.fcc 等如何在shell脚本中使用多核(i7机器)运行ac程序

现在用下面的shell脚本我有devided的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 

需要这些类型的东西。请帮我解决这个迫切的

回答

2

使用GNU并行:

parallel -j $nCores fextract -- `ls` 

或者你可以使用xargs与-P键(与find有用)。

这些命令将在多个线程中启动您的代码,这将允许它们在多个内核上执行。

+0

提示:在Ubuntu上,您需要'sudo apt-get install moreutils'才能使用此程序。 – bohney

+0

你可以更具体地请,因为我的LS会给我8个文件,并在文件中的每一行包含输入和输出路径。所以我如何使用并行命令实现该功能 – user1540393

+0

http://tinyogg.com/watch/TORaR/ – Pablo

0

使用GNU并行:

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

正如一些时间花费在磁盘I/O可能会更快的运行速度比1多一点每个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

相关问题