私はこのコードを書きました (動作します - MBOX ファイルの小さなバッチで試しました)。しかし、2.9GB の MBOX ファイルで約 50,000 通のメールを試してみると、メモリ消費量が急増し、コンピューターが使用できなくなりました。メモリ消費に関してこのコードの何が問題になっていますか?全体ではなく増分でコード処理を行うなど、それを修正する方法はありますか? このスクリプトの目的は、x を日付として、Y をその日付ごとに受信したメッセージの数として CSV ファイルを生成し、それらをプロットして電子メールの統計的表現を生成することです。 将来のために: 私はこれを拡張して、電子メールメッセージを読み、pdfで時系列に出力を生成することを計画しているので、ソートする必要があります(メモリ消費が急増する場所)
import mailbox
from email.utils import parsedate
from dateutil.parser import parse
import itertools
import plotly.plotly as py
from plotly.graph_objs import *
import plotly.tools as tls
import csv
from itertools import izip
path = 'mail.mbox'
mbox = mailbox.mbox(path)
def extract_date(email):
date = email.get('Date')
return parsedate(date)
#sort the email by a given date
sorted_mails = sorted(mbox, key=extract_date)
mbox.update(enumerate(sorted_mails))
mbox.flush()
#it finds all the dates within the MBOX and split
all_dates = []
mbox = mailbox.mbox(path)
for message in mbox:
all_dates.append( str( parse( message['date'] ) ).split(' ')[0] )
#counts the number of emails per given date
email_count = [(g[0], len(list(g[1]))) for g in itertools.groupby(all_dates)]
email_count[0]
#makes a list of (x,y)
x = []
y = []
for date, count in email_count:
x.append(date)
y.append(count)
#produce a CSV file of X and Y, for plotting
with open('data.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(izip(x, y))
"""
data = Data([x, y])
plot_url = py.iplot(Data, filename='line-scatter' )
"""
py.iplot( Data([ Scatter( x=x, y=y ) ]) )