http://lists.gnu.org/archive/html/parallel/2014-07/msg00009.html
例子:在n行文本中搜索m个正则表达式。
在大文件中搜索多个正则表达式的最简单解决方案是:
grep -f regexps.txt bigfile
或者如果正则表达式是固定字符串:
grep -F -f regexps.txt bigfile
有两个限制因素:CPU和磁盘I/O。 CPU很容易衡量:如果grep使用了超过90%的CPU(例如在运行top时),则CPU是限制性因素,并且并行化将加速此过程。如果不是,则磁盘I/O是限制性因素,根据磁盘系统的不同,可能更快或更慢地并行化。唯一确定的方法是测量。
如果CPU是限制性因素,则应对regexps进行并行化:
cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile
这将会为每个CPU启动一个grep进程,并且每个CPU只读取bigfile一次,但由于这是并行执行的,除了第一次外,所有读取都将缓存在RAM中。根据regexp.txt的大小,使用--block 10m而不是-L1000可能更快。如果regexp.txt太大而无法适应RAM,请删除--round-robin并调整-L1000。这将导致bigfile被读取多次。
某些存储系统在并行读取多个块时表现更好。对于某些RAID系统和某些网络文件系统来说是正确的。为了并行读取bigfile:
parallel --pipepart --block 100M -a bigfile grep -f regexp.txt
这将把 bigfile 分成 100MB 的块,并在每个块上运行 grep。为了并行化 bigfile 的读取和 regexp.txt 的正则匹配,可以使用 --fifo 参数将两者组合起来:
parallel --pipepart --block 100M -a bigfile --fifo cat regexp.txt \| parallel --pipe -L1000 --round-robin grep -f - {}
grep -o 'xmltag' file.xml | wc -l
它的作用是在文件file.xml中查找所有的'xmltag'字符串,并计算出现次数。 - Avinash Rajcat
。这会使程序变得更加复杂并减慢其运行速度。 - Jotne