为非常大的文件处理单个正则表达式



file.xml是一个大的74G文件,我必须尽快对它进行grep单个正则表达式。我正在尝试通过使用 GNUparallel来做到这一点:

parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml
  1. 我如何使用--pipepart来实现这一点,因为它比--pipe更快?

  2. 它是否通过增加或减少块的大小而变得更快(例如 20M 而不是 10M,或 10M 而不是 20M(?

1.( 我拥有的最大 xml 文件是 11G 所以 YMMV,但使用parallel --pipepart LC_ALL=C grep -H -n 'searchterm' {} :::: file.xmlparallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml快,比grep "searchterm" file.xml快得多。

2.(我没有为上面的parallel --pipepart命令指定块大小,但您可以使用--block选项;您需要自己尝试不同的块大小,以查看它们是否会加快/减慢搜索速度。使用--block -1为这种方法提供了我的系统上最快的速度。

正如@tshiono评论中提到的,请尝试ripgrep - 这是我的测试xml文件中最快的(比grep/parallel grep/其他任何东西都快(,并且可能被证明是对您来说更好的解决方案。

编辑我测试了@Ole丹下建议的"并行 + ripgrep"方法(parallel --pipepart --block -1 LC_ALL=C rg 'Glu299SerfsTer21' {} :::: ClinVarFullRelease_00-latest.xml(,它与我的系统上rg 'Glu299SerfsTer21' ClinVarFullRelease_00-latest.xml相同~相同。差异可以忽略不计,因此"并行 + rg"方法可能最适合非常大的 XML 文件。我看不到预期的加速有很多潜在原因,例如@Gordon Davisson 在上面的评论中的建议,但您需要使用自己的系统进行全面的基准测试以找出最佳方法。

(感谢Ole Tange的建议和创建这样的踢屁股软件(

最新更新