大文本文件中最快的文本搜索方法

时间:2010-08-10 13:22:45

标签: python google-app-engine

我在一个相当大的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应用程序。

谢谢!

4 个答案:

答案 0 :(得分:13)

  1. 立即将整个文本加载到RAM中。不要逐行阅读。
  2. 在blob中搜索模式。如果找到,请使用text.count('\n',0,pos)获取行号。
  3. 如果您不需要行号,请查找上一个和下一个EOL以删除文本中的行。
  4. 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 Nonereturn line代替break。它应该更快地运行头发,但是当有多个返回时,稍微更难一点。

答案 3 :(得分:1)

10GB / s的搜索速度如何? https://www.codeproject.com/Articles/5282980/Fastest-Fulltext-Vector-Scalar-Exact-Searcher

最有效的方法是什么?

最有效的方法是使用向量,如果不可用,则可以得到最快的SCALAR memmem()函数,碰巧上面的文章展示了它们都在起作用,需要遍历巨大的文本文件,然后再使用memmem() 公共领域的开源是变通的方式。