[Namazu-devel-ja 140] Re: Win98 での pltest Re: utf8index-branch

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2004年 9月 9日 (木) 22:43:47 JST


臼田です

knok @ daionet.gr.jp wrote:
> 
>   内部的には単語をキーにしたhashに値を保持しているだけで、それを雪だる
> ま式に追加、追加としてゆくのが今の実装です。ただ、処理が進むにつれ新し
> い単語が出現する確立はどんどん下がってゆくはずなので、実際にはそんなに
> リニアに性能が低下するわけでもないです。
> 
キーの検索自体は perl のハッシュを使っているので改善の余地はなさそうですね。

なにか改善するところはないだろうかと mknmz を見ていて気になりました

mknmz の add_key() や make_phrase_hash() では
下記のように単語をキーにした hash に文書ID を追加して伸ばしているのですが

    for my $word (keys(%$keyref)) {
	next if ($word eq "" || length($word) > $conf::WORD_LENG_MAX);
	$KeyIndexLast{$word} = 0 unless defined $KeyIndexLast{$word};
	$KeyIndex{$word} .= pack("w2", 
				 $docid - $KeyIndexLast{$word}, 
				 $keyref->{$word});
	$KeyIndexLast{$word} = $docid;
    }

文字列が長くなる際にメモリ内で文字列の位置が再配置されるのではないで
しょうか。
また、その際にもハッシュそのものは生存しているのでガベージコレクション
が起きるのかどうか疑問です。

もし、そうであれば同じ単語が現れ文字列が長くなるにしたがいメモリが
虫食いになって必要以上に消費される原因となっていると思います。

文字列のハッシュで持つのをやめ、処理中は配列のハッシュに入力して
push (@{$KeyIndex{$word}}, pack("w2", $docid - $KeyIndexLast{$word}, 
					 $keyref->{$word});

最後の write_index_sub() での書き出し時に配列をつなげるように
my $record = join("", @{$KeyIndex{$words[$cnt]}});

としたらよくならないかなと思っています。

(Perl が内部で何をしているのかよく知らないので、問題ではないのかも
しれません。)

臼田幸生




Namazu-devel-ja メーリングリストの案内