我在一个相当大的txt文件中进行文本搜索(100k行,7mo) 文字不是那么大,但我需要大量的搜索。 我想查找目标字符串并返回它出现的行。 我的文本文件已格式化,因此目标只能出现在一行中。
最有效的方法是什么?我做了很多搜索,所以我想提高速度。 现在是mycode:
def lookup_line(target):
#returns line of the target, or None if doesnt exist
line=None
dir=os.path.dirname(__file__)
path=dir+'/file.txt'
file=open(path,'r')
while line==None:
l=file.readline()
l=unicode(l,'utf-8')
if target in l:
break
if l=='': break #happens at end of file, then stop loop
line=l
if line=='':line=None #end of file, nothing has been found
file.close()
return line
我将这个python代码用于google Appengine应用程序。
谢谢!
答案 0 :(得分:13)
text.count('\n',0,pos)
获取行号。Python中的循环很慢。字符串搜索非常快。如果您需要查找多个字符串,请使用正则表达式。
如果速度不够快,请使用grep
等外部程序。
答案 1 :(得分:3)
如果要反复搜索同一文本文件,请考虑索引文件。例如,创建一个字典,将每个单词映射到它所在的行。创建需要一段时间,但会进行搜索O(1)。
如果您正在搜索不同的文本文件,或因某些原因无法索引文件,则可能不会比KMP algorithm更快。
编辑:我描述的索引仅适用于单字搜索,而不适用于多字搜索。如果你想搜索多个单词(任何字符串),那么你可能无法将其编入索引。
答案 2 :(得分:1)
首先,不要显式解码字节。
from io import open
其次,考虑这样的事情。
with open(path,'r',encoding='UTF-8') as src:
found= None
for line in src:
if len(line) == 0: break #happens at end of file, then stop loop
if target in line:
found= line
break
return found
可以稍微简化一下,使用return None
或return line
代替break
。它应该更快地运行头发,但是当有多个返回时,稍微更难一点。
答案 3 :(得分:1)
10GB / s的搜索速度如何? https://www.codeproject.com/Articles/5282980/Fastest-Fulltext-Vector-Scalar-Exact-Searcher
最有效的方法是什么?
最有效的方法是使用向量,如果不可用,则可以得到最快的SCALAR memmem()函数,碰巧上面的文章展示了它们都在起作用,需要遍历巨大的文本文件,然后再使用memmem() 公共领域的开源是变通的方式。