argius note

プログラミング関連

saryで高速locate

saryという全文検索用モジュールを使ってlocateを実現する例です。

これをCygwinでやってみました。なおCygwinでは不安だったので事前にUbuntu8.4でも試しました。

$ ./configure
$ make
$ make check
$ make install

最初は、makeの時に

checking for GLIB - version >= 2.0.0... no

でエラーになっていました。glib2はインストールしたはずだけど...よく見たら、glib2 (source) というのがインストールされていなかった。これをインストールしたらOKでした。
追記(2011-01-17): pkg-configも無いとダメでした。(Win7で確認)

$ make check
(中略)
====================
2 of 22 tests failed
====================

これは無視。たぶん失敗している箇所は今回のlocateでは使わない機能です。

あとは適当にスクリプトにするなりaliasを定義するなりします。

$ find / > locatedb && mksary locatedb # updatedbに相当, mksaryで*.aryファイルが作られる
$ sary $1 updatedb # locateに相当 locatedb.aryを使って高速全文検索


以前、grep+fruiでgflocというlocateもどきを作りましたが、これのgrepをsaryに差し替えたsflocを作って比較。
DBファイルのサイズは56MB、aryファイルは224MB、gflocとsflocのDBは同じものを使用。結果は省略しています。

$ time gfloc correspond -x F -u 5 -l
real    0m4.101s
user    0m3.592s
sys     0m0.185s
$ time sfloc correspond -x F -u 5 -l
real    0m0.456s
user    0m0.075s
sys     0m0.217s
$ time gfloc correspond -x F -u 5 -l
real    0m3.848s
user    0m3.669s
sys     0m0.092s
$ time sfloc correspond -x F -u 5 -l
real    0m0.458s
user    0m0.075s
sys     0m0.216s
$ 

これは劇的に早い。上記以外でも試しましたが、間違いなく早いです。