2007年2月19日

[Namazu-devel-ja 1491] mknmz の add_key(), make_phrase_hash() の負荷軽減

臼田です

かなり前に
mknmz の KeyIndex を伸ばしていく際のガベージコレクションに
ついて
議論をしました。
http://www.namazu.org/pipermail/namazu-devel-ja/2004-September/
000139.html

http://www.namazu.org/pipermail/namazu-devel-ja/2004-September/
000150.html

このとき考えた文字列をつなぎ伸ばす部分を、配列への登録にするという
方法ではかえって処理が遅くなりました。
今回、適度な長さの文字列になった段階で配列にすれば、規模の大きい
文字列領域の移動によるガベージコレクション回数が減るのではと考え、
下記のスクリプトを作成して試してみました。

メモリ量、OSの種類、Perlのバージョン等で違うと思われ
ますが
(同じ環境でも複数回試すと結果に大きくばらつきがでます)
テスト用スクリプトでは
1.2〜3倍程度の処理時間の違いが出ました。
WindowsXP の ActivePerl で動作させつつタスクマネージャ
で見ていたところメモリ使用量も若干少なくなっているようです。

実際の mknmz に入れた場合では、文書数が多く
同じ単語がかなりの頻度で現れる場合にしか効果が出ないとは思えます。
他の環境等で試してみても悪くなることがないようでしたら
cvs に
入れてみようと思います。

sub sub2 {
$n = 0;
for $word (@words){
$n++;
$keyindex{$word} .= "[$n]";
}
for $word (sort keys %keyindex){
print OUT2 $word, ":", $keyindex{$word}, "\n";
}
}

sub sub3 {
$n = 0;
for $word (@words){
$n++;
$keyindex{$word} .= "[$n]";
if (length($keyindex{$word}) > 1000){
push(@{$keyindexarray{$word}}, $keyindex{$word});
$keyindex{$word} = '';
}
}
for $word (sort keys %keyindex){
$ids = join("", @{$keyindexarray{$word}});
print OUT3 $word, ":", $ids, $keyindex{$word}, "\n";
}
}

for ( $i = 1; $i <= 3000000; $i++ ) {
$word = sprintf("%c", rand(25)+65) . sprintf("%c", rand(25)+65);
push(@words, $word);
}

open(OUT2, ">2.txt");
open(OUT3, ">3.txt");

%keyindexarray = ();
%keyindex = ();
$etime = time();
sub3;
print "sub3:", time - $etime, "\n";

%keyindex = ();
$etime = time();
sub2;
print "sub2:", time - $etime, "\n";


臼田幸生

_______________________________________________
Namazu-devel-ja mailing list
Namazu-devel-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja

投稿者 xml-rpc : 2007年2月19日 23:15
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/54501
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。