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

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2007年 2月 19日 (月) 23:15:56 JST


臼田です

かなり前に
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 メーリングリストの案内