在大量文件中搜索固定字符串的静态列表

时间:2018-05-09 14:54:34

标签: algorithm grep string-search

我有很多固定字符串(约500万),我想在很多文件中搜索。

我看到使用有限模式进行字符串搜索的两种最常用的算法是: Aho-Corasick Commentz-Walter

我的目标是找到完全匹配而不是模式(这意味着字符串列表不是正则表达式)。

经过一番研究后,我发现很多文章都指出,在现实世界的场景中,Commentz-Walter往往比Aho-Corasick更快(Article1Article2),它也是算法在 GNU-grep 之后。

我也试图以并行方式使用grep -F(取自here):

free=$(awk '/^((Swap)?Cached|MemFree|Buffers):/ { sum += $2 }
          END { print sum }' /proc/meminfo)
percpu=$((free / 200 / $(parallel --number-of-cores)))k
parallel --pipepart -a regexps.txt --block $percpu --compress \
grep -F -f - -n bigfile

似乎问题太大了。我收到这个错误:

grep: memory exhausted
  1. 我想过尝试将模式列表拆分成多个文件并为同一个文件运行grep次数 - 但它看起来很笨拙。还有其他解决方案吗?或者我没有以正确的方式运行grep?
  2. 通过运行Commentz-Walter算法,grep应该做一些预处理工作。我假设在两个不同的文件上使用相同的模式文件运行grep将导致grep执行两次相同的预处理阶段。有没有办法在文件列表上运行grep并使其仅运行模式预处理一次?
  3. 在c \ c ++中有没有很好的Commentz-Walter实现?我只在python中找到了代码(here)?
  4. ---更新---

    根据一些评论,我试图测试不同的Aho-Corasick c \ c ++实现(KomodiaCjgdevchasan)非他们可以管理500万个模式设置示例(所有这些都有内存问题(分段错误/堆栈溢出)) - 它们适用于小型集合。 示例文件由以下代码生成:

    with open(r"C:\very_large_pattern", 'w') as out:
    for _ in range(0, 5000000):
        out.write(str(uuid.uuid4()) + '\n')
    

    是否有人建议可以处理这些数字的实现?

1 个答案:

答案 0 :(得分:0)

一种解决方案是从5M固定字符串构建一个词法分析器,然后使用该词法分析器在文件集中找到固定的字符串。您可以使用Lex为词法分析器生成C源代码,然后编写C代码以使用C词法分析器扫描所有文件。

相关问题