file.xml
是一个74G的大文件,我必须尽可能快地对其进行单条正则表达式的grep。我试图用GNU的 "正则表达式 "来完成这个任务。parallel
:
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文件上是最快的(比grepparallel grepanything其他的快),可能会证明对你来说是一个更好的解决方案。
编辑我测试了 @Ole Tange的建议的 "平行+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 感谢你的建议,感谢你创造了这样一个牛逼的软件)