Namazu-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
find_target の高速化
- From: Katsuhiro Ueno <unnie@xxxxxxxxxxxxxx>
- Date: Tue, 21 Mar 2000 20:35:45 +0900
- X-ml-name: namazu-users-ja
- X-mail-count: 00124
うえの@ぶるーすかいと申します。
皆様の環境ではどうなのかはわかりませんが、
ウチの環境では (Linux 2.2, Pentium 166MHz, 80MB memory, perl-5.005_51)
大量のファイルに対して mknmz すると
コマンド実行から実際にインデックスを作成し始めるまで
結構時間がかかり、精神衛生上あまり好ましくありません (^^;
% mknmz -ahU -V /doko/soko >& mknmz-log
...
@@ 対象ファイル数: 55157 (走査性能: 経過秒: 2213, ファイル/秒: 24.9)
@@ 潜在: 55157, 不許可: 0, 拒絶: 0, 除外: 0
@@ MTIME 古すぎ: 0, MTIME 新しすぎ: 0
55157個のファイルがインデックス作成の対象として見つかりました
どうやら find_target の最後の sort でひっかかっているようですので、
uniq & sort しながらターゲットを追加するように改造してみました。
これによって、ウチでは待ち時間が劇的に短くなりました \(^-^)/
@@ 対象ファイル数: 55157 (走査性能: 経過秒: 476, ファイル/秒: 115.9)
@@ 潜在: 55157, 不許可: 0, 拒絶: 0, 除外: 0
@@ MTIME 古すぎ: 0, MTIME 新しすぎ: 0
55157個のファイルがインデックス作成の対象として見つかりました
もし同じような症状にお悩みの方がいらっしゃいましたら、
お試し下さいませ。
--- namazu-2.0.2/scripts/mknmz.in.orig Tue Mar 21 16:33:16 2000
+++ namazu-2.0.2/scripts/mknmz.in Tue Mar 21 16:42:14 2000
@@ -1252,13 +1252,6 @@
}
}
- # uniq @flist
- my %mark = ();
- @flist = grep {$mark{$_}++; $mark{$_} == 1} @flist;
-
- # Sort file names with consideration for numbers.
- @flist = sort fncmp @flist;
-
my $elapsed = time() - $start ;
$elapsed += 1 ; # to round up and avoid 0
@@ -1349,11 +1342,36 @@
return;
} else{
util::vprint(sprintf(_("Targeted: %s"), $target));
- push @$flists_ref, $target;
+ add_target_to_flist($flists_ref, $target);
}
}
+sub add_target_to_flist (\@$) {
+ my ($flists_ref, $target) = @_;
+
+ my $cmp = fncmp(@$flists_ref[-1] || "", $target);
+ if ($cmp == -1) {
+ push @$flists_ref, $target;
+ }
+ elsif ($cmp == 1) {
+ my $s = 0;
+ my $e = $#{@$flists_ref};
+ my $p;
+
+ do {
+ $p = ($s + $e) >> 1;
+ $cmp = fncmp(@$flists_ref[$p], $target);
+ if ($cmp == -1) { $s = $p + 1; }
+ elsif ($cmp == 1) { $e = $p; }
+ else { return; } # already exist
+ } while ($s < $e);
+
+ $p++ if $cmp == -1;
+ splice @$flists_ref, $p, 0, $target;
+ }
+}
+
sub report_find_target ($$%) {
my ($elapsed, $num_targeted, %counts) = @_;
@@ -1372,8 +1390,8 @@
}
# Original of this code was contributed by <furukawa@xxxxxxxxxxxx>.
-sub fncmp {
- my ($x, $y) = ($a, $b);
+sub fncmp ($$) {
+ my ($x, $y) = @_;
$x =~ s/(\d+)/sprintf("%08d", $1)/ge;
$y =~ s/(\d+)/sprintf("%08d", $1)/ge;
# ところで、こういう話は namazu-devel-ja のほうが
# 適切でしょうか…
-=====--===-
うえの かつひろ @ BLUE-SKYNET <unnie@xxxxxxxxxxxxxx> --=
---=----===- http://www.blue.sky.or.jp/ -==