file.xml
是一个大的74G文件,我必须尽快对它进行grep单个正则表达式。我正在尝试通过使用 GNUparallel
来做到这一点:
parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml
我如何使用
--pipepart
来实现这一点,因为它比--pipe
更快?它是否通过增加或减少块的大小而变得更快(例如 20M 而不是 10M,或 10M 而不是 20M(?
1.( 我拥有的最大 xml 文件是 11G 所以 YMMV,但使用parallel --pipepart LC_ALL=C grep -H -n 'searchterm' {} :::: file.xml
比parallel --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的建议和创建这样的踢屁股软件(