2016-12-15 3 views
0

У меня есть большие (500 000 строк) файлы журнала, которые я просматриваю для определенных разделов. Когда найденные разделы будут напечатаны в виде текстового виджета. Даже если я вырезал строки для чтения до последних 50 000 строк, это занимает больше минуты или дольше, чтобы закончить.Как сделать лог-анализ более быстрым для больших текстовых файлов

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

Нужно ли быть текстовым виджетами? Для чего вы используете '' 'hidden'''? – 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 
Смежные вопросы