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。我正试图通过使用GNU
parallel
来实现这一点:

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
    更快

  • 是否通过增加或减少块的大小(例如20M而不是10M,或者10M而不是20M)来加快速度

  • 1.)我拥有的最大的xml文件是11G so YMMV,但是使用
    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线程一个。