簡體   English   中英

用Python解析碩大的日志文件

[英]Parsing Gigantic Log File in Python

我正在嘗試解析一個巨大的日志文件(大約5 GB)。

我只想解析前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)

更換

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

這樣您才可以實際加載正在使用的文件的前綴。 (您當前的程序實際上將遍歷整個文件,而不管是否將其完全加載到內存中。)

無需使用if檢查的while循環即可解決此問題。

調用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

這是一種簡單的方法:

with open('logs.txt', 'r') as f:
    for line_number, line in enumerate(f, start=1):
        do_stuff(line)
        if line_number > 500000:
            break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM