并行化文件列表上的重复任务

如果你使用更多的计算机资源(即 CPU 和 RAM),则可以更有效地执行许多重复性作业。下面是并行运行多个作业的示例。

假设你有一个 < list of files >,比如来自 ls 的输出。另外,让这些文件被 bz2 压缩,并且需要对它们执行以下任务顺序。

  1. 使用 bzcat 将 bz2 文件解压缩到 stdout
  2. 使用 grep <some key word> 的特定关键字的 Grep(例如过滤器)行
  3. 使用 gzip 将输出连接到一个单个 gzip 压缩文件中

使用 while 循环运行它可能看起来像这样

filenames="file_list.txt"
while read -r line
do
name="$line"
     ## grab lines with puppies in them
     bzcat $line | grep puppies | gzip >> output.gz
done < "$filenames"

使用 GNU Parallel,我们可以简单地一次运行 3 个并行作业

parallel -j 3 "bzcat {} | grep puppies" ::: $( cat filelist.txt ) | gzip > output.gz

当文件数量和文件大小很大时,此命令简单,简洁,高效。工作由 parallel 启动,选项 -j 3 启动 3 个并行作业,并且输入到并行作业由:::接收。输出最终输送到 gzip > output.gz