最新

val it : α → α = fun

<<  2005/09  >>

2005/09/23 scbayes on qdbm の野望

scbayes がどうも最近もっさりしてきたような気がするので、なんとかしたい。なんか dbm ファイルもデカいしね。で、どうしたものだか、と思っていたのだが、 qdbm を使うというのはどうだろうと思いついた。

qdbm は gdbm より遥かに高速で、DBのサイズも小さいという話だ。しかも、 hovel という API があり、これは gdbm と全く同じ API で qdbm (depot)を扱うことができるというモノ。 gauche-gdbm にコイツを噛ませてみたら面白いんじゃね?と思ったわけです。

あーちなみに qdbm の gauche binding も普通にあるけど、これを試すとなると scbayes の方の改変もそれなりにあるように思えて面倒くさそうだったので省略した。

で、インストール時にいろいろあったが、とりあえずやってみた。

# GDBM版
% time scbayes --learn-spam ~/Maildir/.trash/cur
learn:     100% |oooooooooooooooooooooooooooooooooooooooooooo| Time: 00:01:28
flush:     100% |............................................| Time: 00:01:37
summary:   1,325 spam mails are learned in 125.39 sec. (10.57 mails/sec.)
scbayes --learn-spam ~/Maildir/.trash/cur  105.66s user 6.30s system 88% cpu 2:06.29 total
# QDBM版
% time scbayes --learn-spam ~/Maildir/.trash/cur
learn:     100% |oooooooooooooooooooooooooooooooooooooooooooo| Time: 00:01:28
flush:     100% |............................................| Time: 00:01:38
summary:   1,325 spam mails are learned in 126.37 sec. (10.48 mails/sec.)
scbayes --learn-spam ~/Maildir/.trash/cur  107.30s user 4.83s system 88% cpu 2:07.27 total

……変わってねぇッ!

dbmのサイズはというと、

-rw-r--r--  1 mukai local   231744 2005-09-23 23:46 digest.dbm
-rw-r--r--  1 mukai local   128506 2005-09-23 23:38 digest.dbm.gdbm
-rw-r--r--  1 mukai local  3716718 2005-09-23 23:46 token-table.dbm
-rw-r--r--  1 mukai local  5818259 2005-09-23 23:38 token-table.dbm.gdbm

というように、 token-table の方は確かに小さくなっているが、 digest の方はむしろ大きくなっている。速度については、学習時にはdbmのアクセス速度があまり寄与しないという可能性もあるので留保するとして、これはどうだろう?

と思ったけどまぁきっと qdbm の方がよいし面倒だからこのまんまにしよう、と思ってさらに手元のスパムを学習させようと思ったのだが……今度は digest.dbm が開けなくなった。 dpmgr で調べるとデータが壊れているという。そういえば qdbm は、きちんと close しないと壊れるという話だ。それだろうなぁ。とほほ、思わぬところで dbm の閉じ忘れを発見してしまった。

で、ちょいとハックしたらなんとかなった。しかし、ドキュメントによるとガベコレ時にクローズされることになっているのだが、これがうまく効いていないってことだろうなあ。コードを見ると確かにファイナライザで close しているはずだが……何故だろう? qdbm を hovel で使ったモノを gauche から使うという怪しいことをしているからだろうか。

ちなみに、壊れていよーがいまいが digest.dbm のサイズは変わらなかった。ありゃりゃ。なぜだ? dbmの特性が変だからなのかな。 digest.dbm はたぶん、メッセージの digest を保持して既に学習したかどうかのチェックだけをやっているのだろうし。

速度についてはさておき(実際のチェック時のDBアクセスが高速化されるかもしれないじゃないか)、 dbm が肥大化する問題については、一度しか出てこないマイナーな単語を削るとか、両方にあまりにも頻繁に登場する単語を削るとか、そういうアドホックな方法しかないような気がする。てことで、そういうツールを開発して、月一とかのペースで定期的に走らせるようにするかね。