并行化文件列表上的重复任务
如果你使用更多的计算机资源(即 CPU 和 RAM),则可以更有效地执行许多重复性作业。下面是并行运行多个作业的示例。
假设你有一个 < list of files >
,比如来自 ls
的输出。另外,让这些文件被 bz2 压缩,并且需要对它们执行以下任务顺序。
- 使用
bzcat
将 bz2 文件解压缩到 stdout - 使用
grep <some key word>
的特定关键字的 Grep(例如过滤器)行 - 使用
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