易于并行化

Chr*_*son 6 parallel-processing bash

我经常发现自己编写简单的for循环来对许多文件执行操作,例如:

for i in `find . | grep ".xml$"`; do bzip2 $i; done
Run Code Online (Sandbox Code Playgroud)

看起来有点令人沮丧的是,在我的4核机器上只有一个核心被使用..有一种简单的方法可以为我的shell脚本添加并行性吗?

编辑:为我的问题介绍更多的背景,对不起,我开始时并不是更清楚!

我经常想在合理大小的数据集(通常在100到10,000之间)上运行简单(ish)脚本,例如绘制图形,压缩或解压缩,或运行某些程序.我用来解决这些问题的脚本看起来像上面那样,但可能有不同的命令,甚至是一系列要执行的命令.

例如,刚才我正在运行:

for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
Run Code Online (Sandbox Code Playgroud)

所以我的问题绝不是特定于bzip的!(虽然并行bzip确实看起来很酷,但我打算将来使用它).

Joh*_*itb 14

解决方案:使用xargs并行运行(不要忘记-n选项!)

find -name \*.xml -print0 | xargs -0 -n 1 -P 3 bzip2
Run Code Online (Sandbox Code Playgroud)


Pet*_*ree 6

这个perl程序可以很好地满足您的需求,您只需这样做:

runN -n 4 bzip2 `find . | grep ".xml$"`
Run Code Online (Sandbox Code Playgroud)


Ole*_*nge 1

如果您今天必须解决这个问题,您可能会使用像 GNU Parallel 这样的工具(除非有专门的并行工具来完成您的任务,例如pbzip2):

find . | grep ".xml$" | parallel bzip2
Run Code Online (Sandbox Code Playgroud)

了解更多: