搜索大量短字符串
Posted
技术标签:
【中文标题】搜索大量短字符串【英文标题】:Searching through a huge list of short strings 【发布时间】:2016-08-26 01:49:01 【问题描述】:我有一个包含 10 亿个字符串的巨大纯文本文件,其中平均字符串长度约为 10-12,可能存在重复,并且每个字符串位于不同的行上。我的任务是,当给定一个查询字符串时,如果该字符串存在于我的文件中,则查找第一个匹配的行,或者返回“未找到”。
一个自然的解决方案是每次运行grep -m1 -n '^querystring$'
,这大约需要 15-20 秒,这不需要额外的存储空间,也不会占用大量内存。这是一个好的解决方案,还是有更好的解决方案?
(注意,作为粗略的指南,我的存储要求:
【问题讨论】:
【参考方案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
并且每次都检查整个文件。
【讨论】:
以上是关于搜索大量短字符串的主要内容,如果未能解决你的问题,请参考以下文章
在给定列表中搜索将字符串转换为另一个字符串的最短方法,一次一个字符
采用短网址生成方法,生成一个唯一的短字符串。 然后保存到数据库中,与源数据一一对应,新的系统,从数据库中取到相应的数据 (转)