2016-05-01 63 views
1

我有一个巨大的纯文本文件,10亿字符串,其中平均字符串长度大约10-12,有潜在的重复,并且每个字符串是在不同的行上。我的任务是,当给定查询字符串时,如果字符串存在于我的文件中,找到第一个匹配的行,或返回“未找到”。通过一个巨大的短字符串搜索

一个自然的解决方案是每次运行grep -m1 -n '^querystring$',这需要大约15-20秒,并且这不需要额外的存储并且不占用内存。这是一个好的解决方案,还是有更好的?

(NB作为一个粗略的指导,我的存储要求:< 10GB和内存要求:< 16GB)

回答

0

你可以使用一个简单的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,并且每次都检查整个文件。

0

下面是一个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 = (...)通过使用生成器表达式来构建生成器。生成器是迭代器,所以这部分也是高效的。