我发现了这个想法的变种,但没有一个可以让我(对python来说很新)到我需要的地方.
这是场景:
>我有一个巨大的27 gig hashfile.txt,它由独立的字符串组成.
>我需要逐行解析这个文件,搜索另一个不那么大(~800mb)的addresses.txt文件中的匹配项
>找到匹配项时,需要将其写入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.当您在某些语料库中同时搜索多个字符串时,它非常高效.
由于您一次搜索多个地址,因此您可能希望对addresses.txt中的条目进行哈希处理,并在每次迭代时将它们与Rabin-Karp哈希进行一次性比较.阅读有关Rabin-Karp中滚动哈希的更多信息,您将看到它是如何工作的.
因为Rabin-Karp要求所有图案长度相同;在实践中,所有地址都可能具有一些不可忽略的长度,您可以将它们全部截断为相同(不太短)的长度并使用前缀进行散列.此外,您可能希望将Rabin-Karp哈希修改为对空白不变,并且在地址格式方面存在细微差别,并且还要定义一个类似于确认匹配的自定义字符串比较器.
标签:python,optimization,search,large-files
来源: https://codeday.me/bug/20190529/1179199.html