搜索大量短字符串

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 并且每次都检查整个文件。

【讨论】:

以上是关于搜索大量短字符串的主要内容,如果未能解决你的问题,请参考以下文章

在给定列表中搜索将字符串转换为另一个字符串的最短方法,一次一个字符

如何在分组时通过最短字符串获取MySQL搜索结果?

正则表达式将字符串限制为最短匹配与最长匹配(非贪婪组)?

LightOJ 1013 LCS+记忆化搜索

Groovy:RegEx用于匹配字母数字和下划线和短划线

采用短网址生成方法,生成一个唯一的短字符串。 然后保存到数据库中,与源数据一一对应,新的系统,从数据库中取到相应的数据 (转)