2010-08-10 5 views
2

다소 큰 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 

은 내가 구글 AppEngine에 응용 프로그램이 파이썬 코드를 사용합니다.

감사합니다.

+0

컴파일러 오류와 같은 단어, 구 또는 펑키 한 구두 문자를 찾으십니까? 파일이 검색간에 변경됩니까? – sje397

+0

비 라틴 문자로 단어를 검색하고 있습니다. 형식 : "你好 [" 이것은 파일 형식화로 인해 2 줄의 공백이 필요하고 단어가 줄의 올바른 위치에 있는지 확인해야합니다. – user375348

답변

11
  1. 전체 텍스트를 RAM에 한 번에로드하십시오. 한 줄씩 읽지 마십시오.
  2. 블롭의 패턴을 검색합니다. 찾으면 행 번호를 얻기 위해 text.count('\n',0,pos)을 사용하십시오.
  3. 줄 번호가 필요하지 않으면 이전 및 다음 EOL을 찾아 텍스트에서 줄을 잘라냅니다.

파이썬의 루프가 느립니다. 문자열 검색은 매우 빠릅니다. 여러 문자열을 찾아야하는 경우 정규 표현식을 사용하십시오.

충분하지 않으면 grep과 같은 외부 프로그램을 사용하십시오.

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

같은 텍스트 파일을 계속해서 검색하는 경우 파일 색인 생성을 고려하십시오. 예를 들어, 단어가있는 단어를 매핑하는 사전을 만듭니다. 이 작업은 생성하는 데 시간이 걸리지 만 검색 O (1)을 수행합니다.

다른 텍스트 파일을 검색하거나 어떤 이유로 색인을 생성 할 수없는 경우 KMP algorithm보다 빨리 표시되지 않습니다.

편집 : 내가 설명한 색인은 여러 단어 검색이 아닌 한 단어 검색에서만 작동합니다. 여러 단어 (모든 문자열)를 검색하려면 색인을 생성 할 수 없습니다.

+0

좋은 제안은 한 단어 색인에서 여러 단어로 검색 할 수있는 알고리즘을 작성할 수 있다는 것입니다. 다중 단어 색인은 시간 낭비 일 가능성이 큽니다. 또한 단어 경계의 문자를 색인으로 저장할 수 있습니다. Regexes는 이것을 사소한 작업으로 만듭니다. – marr75

+0

좋은 지적.최소한 문장에있는 모든 단어가 한 줄에 포함되어 있는지 확인하는 것은 쉽습니다. 그러나 단어의 일부 (예 : "uick brown fo")에 대한 검색이 의미있는 방식으로 색인 가능하다고는 생각하지 않습니다. –

관련 문제