2016-12-15 11 views
0

私は、指定したセクションで解析するログファイルが大(500,000行)です。セクションが見つかると、Textウィジェットに印刷されます。読んだ行を最後の5万行までカットしても、それを完了するまでには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

最初の例では、最後の行か最初の行が部分行かどうかを確認できます。そうであれば、完了するまで1行以上読むことができます。最初の例では、募集に部分的な行があってはなりません。 –

0

別の可能性は、ラインの多くをスキップするを求めを使用することです。しかし、これには、、最後の50K行の可能性があります。すべての初期の線を読むのではなく、最後に近づく:

with ... as f: 
    f.seek(-50000 * 80) 
    # insert your processing here 
関連する問題