Regex 为非常大的文件调整单个正则表达式
Regex 为非常大的文件调整单个正则表达式,regex,xml,bash,gnu-parallel,Regex,Xml,Bash,Gnu Parallel,file.xml是一个很大的74G文件,我必须尽快用一个正则表达式对它进行grep。我正试图通过使用GNUparallel来实现这一点: parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml parallel--pipe--block 10M--ungroup LC_ALL=C grep-iF“test.*pattern”与 RIPGRIP >。代码>--block-1将文件拆
file.xml
是一个很大的74G文件,我必须尽快用一个正则表达式对它进行grep。我正试图通过使用GNUparallel
来实现这一点:
parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml
parallel--pipe--block 10M--ungroup LC_ALL=C grep-iF“test.*pattern”
--pipepart
实现这一点,因为它比--pipe
更快parallel-pipepart LC_ALL=C grep-H-n'searchterm'{}::::::file.xml
比parallel-pipe-block 10M-ungroup LC_ALL=C grep-iF“test.*pattern”
要快得多
2.)我没有为上面的parallel--pipepart
命令指定块大小,但是您可以使用--block
选项;您需要自己尝试不同的块大小,以查看它们是否加快/减慢搜索速度。使用--block-1
在我的系统中为这种方法提供了最快的速度
正如在评论中提到的,try-这在我的测试xml文件中是最快的(比grep/parallel grep/任何其他文件都快),并且可能证明是一个更好的解决方案
编辑
我测试了建议的“并行+ripgrep”方法(parallel--pipepart--block-1lc_ALL=C rg'Glu299SerfsTer21'{}:::ClinVarFullRelease_00-latest.xml
),它与我的系统上的rg'Glu299SerfsTer21'ClinVarFullRelease_00-latest.xml
相同。差异可以忽略不计,因此“parallel+rg”方法可能最适合于非常大的XML文件。有许多潜在的原因我没有看到预期的加速,例如他在上面的评论中提出的建议,但您需要对自己的系统进行全面的基准测试,以找出最佳方法
(感谢您的建议和创建这样的优秀软件)您必须进行测试才能确定,但我的期望是,像这样尝试并行化是行不通的——我期望使用
parallel
read、split、,并将文件内容通过管道传输到grep
将使其比单个grep
进程直接读取文件更慢。@Gordondavison我的命令是一个派生命令,这不完全是我的主意。在该命令中,parallel
不处理批量数据,它只是将文件名分发给grep
命令,并让它们直接读取文件。在这种情况下,并行化是有意义的。一个74GB的XML文件是一个令人毛骨悚然的组合。开始时打开的标签需要读取整个74G才能找到其关闭位置。XML本质上是一种串行数据格式,并添加了嵌套结构。我真的很想知道是什么原因促使我们选择XML来搜索如此大的数据集。一般来说,磁盘I/O将是瓶颈,不能用并行来加速。请考虑引入<代码> ReReGPP<代码>(<代码> RG</代码>),它的性能比<代码> GRP好得多。我认为您能走得最快的是代码> PiPube——块-1 < /代码>与<代码> RIPGRIP >。代码>--block-1
将文件拆分为大小大致相同的块—每个CPU线程一个。