y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

メール送受信の可視化〜DB書き込み

前回、maillogを読み取り、IDの照合によりFromとToの対応一覧を作成、ファイルに書き出すところまでできた。
今回は、このFrom、To一覧からメールアドレスレコードとノードレコードをDBに書き込む。
ノードは、From→Toのパターンしかないのだが、メーリングリストに当てられたメッセージの場合は、Fromが1アドレスに対して、Toが複数になるので、この複数のToをさらに配列に分解し、1対多のノードを生成しなければいけないのが面倒。
単語ネットワークの場合は、単語出現頻度=単語の出現頻度の方が意味があったが、メール送受信ネットワークの場合は、ノードのカウント値の方がより意味を持つ。(誰から誰へのメッセージ本数が一番多いかが大事であるから)
メールアドレスのカウント値は、fromでもToでもカウントアップしている。
さて、DB書き込み処理についての難関は、やはりパフォーマンス面。さすがにローカルファイルに書き出すよりも、かなりのスピードダウン。

ローカルファイルへの書き出しは、シンプルな文字列検索処理だったので、2600行を抽出するのに9秒。
対して、DB書き込みは280秒かかる。これは、From,Toを分解して複数レコードにするのと、すでに登録されているかどうかを検索しているため。ノードについても、To,Fromのそれぞれのつながりを興してから、検索、書き込みしているのだから、SQLトランザクション数は相当なものだ。
アドレスレコード:2168レコード、ノードレコード:1436レコードのSQL発行数はざっと1万7200回
これはすごい。
1回20msの計算になる。悪くないかも。
これ、リモートDBならえらい事になっちゃうんだろうなぁ。
今回はODBC経由でアクセスしているが、ADOにしたらもっと速いんだろうか。→早速実験してみよう。


■結果:
3日分のmaillog:12MBの処理で、From-To一覧表行数:14251行、ユニークなメールアドレス数:3469、ノード数:1234、処理時間:3155秒となった。

出来上がったDBを見てみると、メールマガジンを精力的に受信している社員や、我が開発チームのメールトラフィックが突出している。その他社員の数十倍なのである。これが総量の把握じゃなくって、「誰とつながっているのか?」を可視化できるところに、今回の一人プロジェクトの面白さがある。

■この次は
今度は、今回の処理で出来上がったmdbIISディレクトリにコピー。wordnet.aspmdbバージョンに書き換えて、とうとう可視化!どんなネットワーク図が見えてくるんだろう・・・楽しみだぁぁ。

※やる前から分かってるのは、エロスパムやら、メーリングリストトラフィックが、業務メールよりも遥かに多いだろうなぁということ。あと、自分の開発チームが受け取っているネット/サーバ監視メール。毎日数百通だもんなぁ。(汗)