2013-07-08 90 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根據搜索到的單詞創建一個表,告訴它發生故障時可以跳過多少個字符。
相關問題