検索速度の改善他2006年09月20日 02時33分49秒

以下の修正を行いました。

1. 様々な箇所で、nmz_free_hlist() によるメモリ解放を行いました。
2. nmzchkw.pl を contrib に入れました。
3. nmz/hlist.c(nmz_do_date_processing) パフォーマンスの向上をはかりました。

3 については、過去において gcnmz をあまり実行していない場合に、検索の速度が落ちる事例が何件が報告されていました。

調べてみると、nmz_do_date_processing ではヒットした文書の date をチェックし、削除文書の場合はヒットリストの配列を詰める(コピー)という処理がありました。この処理が二重ループとなっており、最悪のケースでは(n - 1)! 回コピーします。
これを最悪のケースでも n - 1 回のコピーとなるよう一重ループで処理するようにしました。

デフォルトでは MaxHit が 10000 ですから、n の最大値は 10000 であり、条件がそろえばかなりの回数コピーを行うことなっていました。

gcnmz を実行しないで mknmz を繰り返していると、文書の更新率が高い場合には、削除文書が全体を占める割合が高くなります。
その場合にはかなりの回数コピーを行う可能性がありました。

今回の修正で、「gcnmz をあまり実行していない場合に、検索の速度が落ちる」という症状が全て改善するかどうかはわかりませんが、かなり有効だろうと思います。
興味のある方は試してみてください。