ローカルで使える高速検索機能はないものか

フォントデータを読んでビットパタンに変換するスクリプトを書いてみている。
TTからvflibで変換すると、組み込み環境ではフットプリントなどを含めたオーバーヘッドが大きかった場合のための保険的な作業。
なーんか、マトモ(ってほどでもないけど...)なプログラミングというのは1年ぶりくらいで、基本的な構文もすっかり忘れる始末で、100行未満なのに脳が筋肉痛... orz
メモリアクセスとディスクアクセスが異様に遅い環境での試験。GLANTANKEtchで2.6.18-7の上。このくらいのオーバーヘッドでちゃんと動けば、本番でもちょうどいいだろうという判断。


はじめに、ナメてかかって、BDF形式を生で逐次解析してたら、使い物にならないくらい遅かった。
おーーーーーーーい、どこいったーーーーーーーぁ、という感じ。


必要なデータだけ事前抽出して、辞書に入れてpickle化しても、応答時間は7,8秒。
辞書を作るには40秒前後。
待ち時間はpickle化したデータを読みに行っているようだ。
BDFにくらべて、データサイズは60%くらいになったけど、これでも使い物にならない。


同じデータをgdbmに突っ込んで2秒弱。
ただし、こっちは軽い16進->2進のビットパタン変換処理が追加で入っている。
辞書を作るのは1分以上かかる。
まだ遅いな... 秒未満くらいでなんとかならないもんだろうか。
データサイズはBDFの2割増し。さすがにインデックスがでかいのだろうね。


レコード数は7k弱くらいあるし、外にRDBMSを持つような贅沢はできない。
フォントデータは固定なので、一度生成すればROMでいい。
中身はBDFから抽出した文字コードと文字のビットパタンだけ。


もうこれ以上高速化する方法はないかな...
SQLiteって効くんだろうか? でも、できれば標準以外のモジュールは避けたいところ。
ファイルとディレクトリに展開して、それを呼ぶだけにするかね?
なんかいい手はないっすかね?
# 2GとかいうCPU/RAM環境ならほとんど差がないんだろうにね...
# 未Gだとつらいよ。


いまんとここんな感じ。

kinneko@ETCHING:~$ time ./convdb.py 242D 2473 244D 2433

     M                             M
     M MM            M             M               MMMMMM
 MMMMMM              M             M
      MMMM          M            MMM  MMM
 MMMMMM             M              M M   M
       M           M MM            MM     M
   MMMM M          MM  M           M      M        M
  M    MM         M    M          MM   MM M       M
  M               M    M  M      M M  M  MM       M      M
   M             M     M  M        M  M  M         MMMMMM
    MMMM         M      MM         M   MM M


real    0m1.476s
user    0m0.350s
sys     0m1.060s