我有很多固定字符串(约500万),我想在很多文件中搜索。
我看到使用有限模式进行字符串搜索的两种最常用的算法是: Aho-Corasick 和 Commentz-Walter 。
我的目标是找到完全匹配而不是模式(这意味着字符串列表不是正则表达式)。
经过一番研究后,我发现很多文章都指出,在现实世界的场景中,Commentz-Walter往往比Aho-Corasick更快(Article1,Article2),它也是算法在 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
---更新---
根据一些评论,我试图测试不同的Aho-Corasick c \ c ++实现(Komodia,Cjgdev,chasan)非他们可以管理500万个模式设置示例(所有这些都有内存问题(分段错误/堆栈溢出)) - 它们适用于小型集合。 示例文件由以下代码生成:
with open(r"C:\very_large_pattern", 'w') as out:
for _ in range(0, 5000000):
out.write(str(uuid.uuid4()) + '\n')
是否有人建议可以处理这些数字的实现?
答案 0 :(得分:0)
一种解决方案是从5M固定字符串构建一个词法分析器,然后使用该词法分析器在文件集中找到固定的字符串。您可以使用Lex为词法分析器生成C源代码,然后编写C代码以使用C词法分析器扫描所有文件。