Разбор гигантского лог-файла в Python - PullRequest
1 голос
/ 08 марта 2012

Я пытаюсь проанализировать гигантский файл журнала (около 5 ГБ).

Я хочу проанализировать только первые 500 000 строк и не хочу читать весь файл в память.

По сути, я хочу сделать то, что делает код ниже, но с циклом while вместо цикла for и условным условием if. Я также хочу быть уверенным, что не прочитал весь файл в память.

import re
from collections import defaultdict
FILE = open('logs.txt', 'r')
count_words=defaultdict(int)
import pickle
i=0
for line in FILE.readlines():
    if i < 500000:
        m = re.search('key=([^&]*)', line)
        count_words[m.group(1)]+=1
    i+=1

csv=[]
for k, v in count_words.iteritems():
    csv.append(k+","+str(v))
print "\n".join(csv)

Ответы [ 3 ]

12 голосов
/ 08 марта 2012

Заменить

for line in FILE.readlines():

с

for line in FILE:

чтобы не читать его в память целиком. Затем, чтобы обработать только первые 500000 строк, выполните

from itertools import islice

for line in islice(FILE, 500000):
    m = re.search('key=([^&]*)', line)
    count_words[m.group(1)] += 1

так что вы фактически загружаете только префикс файла, с которым работаете. (Ваша текущая программа будет фактически перебирать весь файл независимо от того, загружает ли он его в память полностью или нет).

Для решения этой проблемы не требуется цикл while с проверкой if.

5 голосов
/ 08 марта 2012

Вызов readlines() вызовет весь файл в память, поэтому вам придется читать построчно, пока вы не достигнете строки 500 000 или не достигнете EOF, в зависимости от того, что произойдет раньше.Вот что вы должны сделать вместо этого:

i = 0
while i < 500000:
    line = FILE.readline()
    if line == "": # Cuts off if end of file reached
        break
    m = re.search('key=([^&]*)', line)
    count_words[m.group(1)]+=1
    i += 1
3 голосов
/ 12 марта 2012

Вот простой способ сделать это:

with open('logs.txt', 'r') as f:
    for line_number, line in enumerate(f, start=1):
        do_stuff(line)
        if line_number > 500000:
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...