0

私はこのコードを書きました (動作します - 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 ) ]) )
4

1 に答える 1

0

私はこれらのライブラリにあまり詳しくありませんが、主な問題は、次の行ですべてのメッセージをメモリに読み込んでいることだと思います。

sorted_mails = sorted(mbox, key=extract_date)

このスクリプトの目的は何ですか? あなたは本当に何かを並べ替える必要がありますか?日付ごとのカウントを含む CSV を生成する必要がある場合は、次のようにしてください。

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)

# map date to number of emails seen on that date
date_counts = {}

for message in mbox:
    date = str( parse( message['date'] ) ).split(' ')[0]
    try:
        date_counts[date] += 1
    except KeyError:
        date_counts[date] = 1

with open('data.csv', 'wb') as f:
    writer = csv.writer(f)
    for date in date_counts:
        writer.writerow([date, date_counts[date]])
于 2016-02-11T15:19:40.010 に答える