[英]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.