对一个非常大的文件进行单条正则表达式的抓取。

问题描述 投票:5回答:1

file.xml 是一个74G的大文件,我必须尽可能快地对其进行单条正则表达式的grep。我试图用GNU的 "正则表达式 "来完成这个任务。parallel:

parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml
  1. 我如何通过使用 --pipepart 因为它比 --pipe?

  2. 是否通过增加或减少块的大小(例如20M代替10M,或10M代替20M)来提高速度?

regex xml bash gnu-parallel
1个回答
1
投票

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 感谢你的建议,感谢你创造了这样一个牛逼的软件)

© www.soinside.com 2019 - 2024. All rights reserved.