前回、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を見てみると、メールマガジンを精力的に受信している社員や、我が開発チームのメールトラフィックが突出している。その他社員の数十倍なのである。これが総量の把握じゃなくって、「誰とつながっているのか?」を可視化できるところに、今回の一人プロジェクトの面白さがある。
■この次は
今度は、今回の処理で出来上がったmdbをIISのディレクトリにコピー。wordnet.aspをmdbバージョンに書き換えて、とうとう可視化!どんなネットワーク図が見えてくるんだろう・・・楽しみだぁぁ。
※やる前から分かってるのは、エロスパムやら、メーリングリストのトラフィックが、業務メールよりも遥かに多いだろうなぁということ。あと、自分の開発チームが受け取っているネット/サーバ監視メール。毎日数百通だもんなぁ。(汗)