Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

find_target の高速化



うえの@ぶるーすかいと申します。


皆様の環境ではどうなのかはわかりませんが、
ウチの環境では (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/  -==