我有一个巨大的纯文本文件,包含10亿个字符串,平均字符串长度大约为10-12,可能有重复,每个字符串都在不同的行上。我的任务是,当给定查询字符串时,如果我的文件中存在字符串,则找到第一个匹配的行,或者返回“未找到”。
一个自然的解决方案是每次运行grep -m1 -n '^querystring$'
,大约需要15-20秒,这不需要额外的存储空间,也不需要占用大量内存。这是一个很好的解决方案,还是有更好的东西?
(N.B。作为粗略指南,我的存储要求:&lt; 10GB,内存要求:<16GB)
答案 0 :(得分: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
并且每次都会遍历整个文件。
答案 1 :(得分:0)
这是一个Python解决方案:
当你foldl1 (++)
一个文件时,你得到一个迭代器,一次给你一行,这是非常有效的内存。我的建议是枚举文件并使第一行符合您的标准:
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'
通过使用生成器表达式构建生成器。生成器是迭代器,因此这部分也是内存有效的。