2013-07-08 137 views
3

考虑一行150万行,每行大约50-100个单词的文本文件。在非索引文本文件中搜索单词的最快方法 - Python

要查找包含字线,采用os.popen('grep -w word infile')似乎快于

for line in infile: 
    if word in line: 
    print line 

一个要不然怎么可以搜索在Python中的文本文件一个字?搜索这个大型的unindex文本文件的最快方法是什么?

+0

我认为使用正则表达式可能会非常快。但是由于你的文件非常大,无法将其加载到RAM中进行正则表达式分析。但是,可以通过大块来读取文件,并使用正则表达式逐个块地进行分析。这样做可能会导致研究的字符串可能会在两个区块上重叠,然后不会被检测到。因此,块的分析必须以某种方式完成。我已经编写了这样的代码,并将其发布到stackoverflow.com上。让我搜索它。 – eyquem

+1

我发现了我的以下文章(http://stackoverflow.com/questions/16583591/read-a-very-big-single-line-txt-file-and-split-it),其中代码旨在检测字符串ROW_DEL放在一个大文件中,并用较短的字符串替换它们。你的问题只是检测一个模式,它更简单。我想你可以在我引用的帖子中看看,看看我分析文本块后的方式,并将其原理适应于更有限的需求。 – eyquem

回答

2

有几种快速搜索算法(见wikipedia)。他们要求你将这个词编译成某种结构。 Grep正在使用Aho-Corasick algorithm

我还没有看到

  1. word编译为每一个需要时间行Python的in的源代码,但无论是(我怀疑in编译任何东西,这显然可以对其进行编译,缓存结果,等)或
  2. 搜索效率低下。考虑在“worword”中搜索“word”,首先检查“worw”并检查失败,然后检查“o”,然后选择“r”并失败等。但是,如果没有理由重新检查“o”或“r”if你很聪明。例如,Knuth–Morris–Pratt algorithm根据搜索到的单词创建一个表,告诉它发生故障时可以跳过多少个字符。
相关问题