【问题标题】:Searching through a huge list of short strings搜索大量短字符串
【发布时间】:2016-08-26 01:49:01
【问题描述】:
我有一个包含 10 亿个字符串的巨大纯文本文件,其中平均字符串长度约为 10-12,可能存在重复,并且每个字符串位于不同的行上。我的任务是,当给定一个查询字符串时,如果该字符串存在于我的文件中,则查找第一个匹配的行,或者返回“未找到”。
一个自然的解决方案是每次运行grep -m1 -n '^querystring$',这大约需要 15-20 秒,这不需要额外的存储空间,也不会占用大量内存。这是一个好的解决方案,还是有更好的解决方案?
(注意,作为粗略的指南,我的存储要求:
【问题讨论】:
标签:
string
search
text
indexing
【解决方案1】:
这是一个 Python 解决方案:
当你open 一个文件时,你会得到一个迭代器,一次只给你一行,这非常节省内存。我的建议是枚举文件并让第一行符合您的标准,如下所示:
def first_occurrence(filename, query):
with open(filename) as f:
filtered = (i for i, line in enumerate(f, 1) if query in line)
return next(filtered, 'not found')
如果没有该行,则返回默认值'not found'。 filtered = (...) 通过使用生成器表达式来构建生成器。生成器是迭代器,因此这部分内存效率也很高。
【解决方案2】:
你可以使用一个简单的python代码:
file = 'file.txt'
queryLine = 0
with open(file, 'r') as f:
for line in f:
if <YOUR QUERY> in line: return queryLine
else: queryLine += 1
这样,您在找到匹配项时会中断,而是使用 grep 并且每次都检查整个文件。