python - 高效地在海量文件中搜索字符串

标签 python search optimization large-files

我找到了这个想法的变体,但没有一个能让我(对 python 非常陌生)到达我需要去的地方。

场景如下:

  1. 我有一个巨大的 27 gig hashfile.txt,由不同行上的唯一字符串组成。
  2. 我需要逐行解析此文件,在另一个不太大 (~800mb) addresses.txt 文件中搜索匹配项
  3. 找到匹配项后,需要将其写入outfile.txt

我目前的代码已经尽我所能进行了优化,但每秒只能达到 150 行左右。考虑到我的 hashfile.txt 中有超过 15 亿行,任何优化都会有所帮助。

fin = 'hashed.txt'
nonzeros = open('addrOnly.txt', 'r')
fout = open('hits.txt', 'w')
lines = nonzeros.read()
i = 0
count = 0

with open(fin, 'r') as f:
    for privkey in f:
            address = privkey.split(", ")[0]
            if address in lines:
                    fout.write(privkey)
            i = i+1
            if i%100 == 0:
                    count = count + 100
                    print "Passed: " + str(count)

最佳答案

您要实现的可能是 Rabin-Karp string search .当您在某个语料库中同时搜索多个字符串时,它非常高效。

有关 python 实现的更多信息,请参阅本文。 python efficient substring search

由于您一次搜索多个地址,您可能希望对 addresses.txt 中的条目进行散列处理,并在每次迭代时将它们与 Rabin-Karp 散列值同时进行比较。阅读有关 Rabin-Karp 中滚动哈希的更多信息,您将了解其工作原理。

由于 Rabin-Karp 要求所有模式的长度相同;实际上,所有地址的长度都可能是不可忽略的,您可以将它们全部截断为相同(不太短)的长度并使用前缀进行散列。此外,您可能希望将 Rabin-Karp 散列修改为对空白和地址格式化方式的微小差异不变,并且还可以类似地定义一个自定义字符串比较器来确认匹配。

关于python - 高效地在海量文件中搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400906/

相关文章:

javascript - 如何使用 Python 在字符串中的每个 ] 后面添加逗号?

python - 如何计算距特定日期还剩几个月?

python - 在 cv2 中使用 skimage 图像

api - REST 请求无法编码为 GET(URL 太长)

python - 在具有一些通配符的大型列表中进行成员资格测试

mysql - 我们可以优化这个 MySQL SELECT 查询(2 个嵌套 SELECT 和 2 个 INNER JOIN)

java - 维护拥有大量线程的 Java 应用程序时,我需要了解什么?

c - 预处理器定义 VS 局部变量,速度差异

Python 正则表达式 - (\w+) 与复杂表达式一起使用时会产生不同的输出

emacs - 使用 Emacs (windows) 和 GnuWin32 Grep 失败的 Grep