GNU 并行grep n 行查找 m 正则表达式示例说明如下:
如果 CPU 是限制因素,则应在正则表达式上进行并行化:
cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile
这将为每个 CPU 启动一个 grep 并为每个 CPU 读取一次大文件,但由于这是并行完成的,除了第一个读取之外的所有读取都将缓存在 RAM 中
因此,在本例中,GNU从并行的 grep 实例parallel
中轮循正则表达式,每个实例单独读取。正如上面的文档所述,磁盘缓存可能确保仅从磁盘读取一次。regex.txt
grep
bigfile
bigfile
我的问题是这样的 - 上面的方法似乎被认为比另一种方法在性能方面更好,另一种方法涉及从每个读取的并行实例中获取 GNUparallel
循环记录,例如bigfile
grep
regexp.txt
cat bigfile | parallel --pipe -L1000 --round-robin grep -f regexp.txt -
为什么会这样呢?正如我所看到的,假设磁盘缓存正在运行,bigfile
并且regexp.txt
在任何一种情况下都会从磁盘读取一次。我能想到的一个主要区别是第二种方法涉及通过管道传递更多的数据。
答案1
这是由于 GNU Parallel --pipe 速度慢。
cat bigfile | parallel --pipe -L1000 --round-robin grep -f regexp.txt -
最大速度约为 100 MB/s。
在手册页示例中,您还会发现:
parallel --pipepart --block 100M -a bigfile grep -f regexp.txt
其性能接近相同,但在 64 核系统上最高可达 20 GB/s。
parallel --pipepart --block 100M -a bigfile -k grep -f regexp.txt
应该给出完全相同的结果grep -f regexp.txt bigfile