2016-12-15 2 views
0

지정된 섹션에 대해 구문 분석 할 수있는 큰 (500,000 행) 로그 파일이 있습니다. 발견되면 섹션이 Text 위젯에 인쇄됩니다. readlines를 지난 50,000 줄까지 줄 였지만, 끝내려면 1 분 이상 걸립니다.큰 텍스트 파일의 로그 구문 분석을 더 빠르게 수행하는 방법

with open(i, "r") as f: 
    r = f.readlines() 
    r = r[-50000:] 
    start = 0 
    for line in r: 
     if 'Start section' in line: 
      if start == 1: 
       cpfotxt.insert('end', line + "\n", 'hidden') 
      start = 1 
     if 'End section' in line: 
      start = 0 
      cpfotxt.insert('end', line + "\n") 
     if start == 1: 
      cpfotxt.insert('end', line + "\n") 
f.close() 

이 작업을 더 빠르게 수행 할 수있는 방법은 무엇입니까?

+0

텍스트 위젯 일 필요가 있습니까? ''숨겨진''을''무엇을 사용합니까? – wwii

+0

목록의 모든 줄을 모아서 한꺼번에 쓸 수 있습니다. 또는 [ListView 위젯] (http://effbot.org/zone/wck-4.htm)을 구현하십시오 – wwii

+0

@wwii 태그, 글꼴 등을 사용하여 글을 쓸 수있는 뭔가가 필요했습니다. 텍스트 위젯이 적합 해 보였습니다. 필요. – sidnical

답변

0

청크로 읽어야합니다. 당신을 위해 적용 할 수

with open(...) as f: 
    for line in f: 
     <do something with line> 

더 명확한 방법은 :

def readInChunks(fileObj, chunkSize=2048): 
    """ 
    Lazy function to read a file piece by piece. 
    Default chunk size: 2kB. 
    """ 
    while True: 
     data = fileObj.read(chunkSize) 
     if not data: 
      break 
     yield data 

f = open('bigFile') 
for chuck in readInChunks(f): 
    do_something(chunk) 
+0

청크에 부분 행이 포함되어있는 경우 처음부터 끝까지 처리하는 방법은 무엇입니까? – wwii

+0

글쎄, 첫 번째 예에서는 마지막 줄 또는 첫 줄이 부분 줄인지 확인할 수 있습니다. 그렇다면 완료 될 때까지 한 줄 더 읽을 수 있습니다. 첫 번째 예에서는 구걸시 부분 선이 있어서는 안됩니다. –

0

또 다른 가능성은 라인을 많이 건너 뛸을 추구 을 사용하는 것입니다. 그러나 이것은 당신이 일부 마지막 50K 라인이 얼마나 큰지에 대한 아이디어가 필요합니다. 초기 선을 모두 읽지 말고 끝까지 뛰어 오십시오.

with ... as f: 
    f.seek(-50000 * 80) 
    # insert your processing here 
관련 문제