記事の個別表示(修正可)
タイトル  LogFileのバグ(1)
本文  
 LogFileで、早速にバグが見つかりました。プログラムの方では無くて、国名のデータの方です。今は、修正したので9日以前にダウンロードした人は、ファイルを交換するか、その場所を修正しないと、バグに遭遇します。

 国名に、Local Lan の項目が有るのですが、192.168.0.0/23とすべき所を、192.168.0.0/9としてしまいました。

 国名は、LogFileで一番時間が掛かった所です。IPアドレスから、そのIPアドレスが割り当てられている国名をデータベースに付加する処理ですが、何せログは、200万レコードを超える大きさ。また、国名のレコードは、13万レコードを超えます。2つを付き合わせると、まじめにやれば、数時間は、掛かりますね。

 で、それぞれをソートして、付き合わせに変える。劇的に処理時間は削減される。それでも数分は掛かります。LogFileは、云わば、ローカルパソコンです。操作、結果とその処理の速さを求めるプログラムにしています。数分では、まだ不十分です。目標は、私のパソコン(結構高性能)で1秒以内。

 国名などは、なまじソートしないで、出現頻度国順に並べると、驚く事に早くなります。でも、日本で使われるとは、限りません。となると、ソートは、絶対条件でしょう。ならば、事前にソートしたファイルを準備するのは、どうかとなりますね。でも、メンテナンスはユーザーがする事になる。となると、ソートは、外せない。そこで、ログファイルを読み込む初めの処理の段階で、この処理を済ませて置けば良いとなります。

 次は、ログのIPアドレスですね。そのソートも、Select処理で実行していますから、それを使えば良いとなります。つまり、リストにIPアドレスが載っている物を使う。それに国名を当てはめ、今度は、それをベースに200万レコードに国名を付ける。

 みごとに、1秒を切る処理が出来ました。めでたしめでたし。

 ついでに、IPアドレスの処理では、"/"が厄介ですよね。プログラムでは、下記の様にしました(一部抜粋)。

        m1 = n5 * 16777216L + n6 * 65536L + n7 * 256L
        If n1 <> 0 Then
            n8 = 32 - Val(Mid(x1, n1 + 1, Len(x1) - n1))
            m2 = 2 ^ n8 - 1
            m3 = 4294967295L - m2
            m4 = m1 And m3  'Min
            m5 = m1 Or m2   'Max
        Else
n1は、"/"以下の数字です。後は、想像が付くと思います。
...61626364656667686970...