Namazu-devel-ja(旧)


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

sort @flist with extension in mknmz::find_target()



ふと考え付いたんですが、フィルタアプリケーションの起動のオーバーヘッ
ドをある程度おさえるために、mknmz::find_target() の後の方で @flist 
をあらかじめ拡張子でソートしてみるのはどうでしょうか。つまり、

@flist = ("/home/baba/a.doc",
          "/home/baba/a.xls",
          "/home/baba/b.doc",
          "/home/baba/b.xls",
          "/home/baba/c.doc",
          "/home/baba/c.xls",);
を、

"/home/baba/a.doc",
"/home/baba/b.doc",
"/home/baba/c.doc",
"/home/baba/a.xls",
"/home/baba/b.xls",
"/home/baba/c.xls",

とソートしてからインデックスさせるってことなんですが。

この@flistソート自体による速度低下はインデックス作業全体からすれば
ほとんど無視できるだろうし、一般的には $#flist に対して拡張子の数
の方が少ないはずなんで、あらかじめ並べかえておけば起動のオーバーヘッ
ドは多少は減らせそうな気はします。逆に遅くなる要因はあまりおもいつ
かないんですけど、あんまし自信もないんで、肯定、否定、たぶんかわん
ないから意味ないよ、などのご意見をいただければありがたいです。
--
馬場  肇 ( Hajime BABA )            E-mail: baba@xxxxxxxxxxxxxxxxxxxxxx
京都大学理学部宇宙物理学教室 博士後期課程
--


以下サンプル。ちょっと中間変数が多くて美しくないですが(正規表現に
も自信がないし)、まあこんな感じにいじってみるのはどうかってことで。


#!/usr/bin/perl
# @flist を拡張子でソートして出力

# てすと
@flist = (
	  "/home/baba/a.doc",
	  "/home/baba/a.pdf",
	  "/home/baba/a.ppt",
	  "/home/baba/a.txt",
	  "/home/baba/b.doc",
	  "/home/baba/b.ppt",
	  "/home/baba/b.txt",
	  "/home/baba/b/c/d.pdf",
	  "/home/baba/c.doc",
	  "/home/baba/c.pdf",
	  "/home/baba/c.ppt",
	  "/home/baba/c.txt",
	  "/home/baba/dir.2/e.doc",
	  "/home/baba/dir.2/e.ppt",
	  "/home/baba/dir.2/e.txt",
	  "/home/baba/dir/d.doc",
	  "/home/baba/dir/d.ppt",
	  "/home/baba/dir/d.txt",
	  "/home/baba/foo.tar.gz",
	  "/home/baba/bar.tar.gz",
	  "/home/baba/baz.tar.gz",
	  "/home/baba/msg00001.html",
	  "/home/baba/msg00002.html",
	  "/home/baba/msg00011.html",
	  "/home/baba/msg00123.html",
	  "/home/baba/Mail/inbox/1",
	  "/home/baba/Mail/inbox/10",
	  "/home/baba/Mail/inbox/11",
	  "/home/baba/Mail/inbox/2",
	  "/home/baba/Mail/inbox/3",
	  "/home/baba/Mail/inbox.0/1",
	  "/home/baba/Mail/inbox.0/10",
	  "/home/baba/Mail/inbox.0/11",
	  "/home/baba/Mail/inbox.0/2",
	  "/home/baba/Mail/inbox.0/3",
	  "/home/baba/Mail/ml/199912/1",
	  "/home/baba/Mail/ml/199912/12",
	  "/home/baba/Mail/ml/200101/3",
	  "/home/baba/Mail/ml/200101/45",
	  "/home/baba/i.j.k.l.m.n",
	  "/home/baba/o.p.q.r.s.n",
	  "/home/baba/x",
	  "/home/baba/y",
	  "/home/baba/z",
	  );

#foreach $f (@flist) {
#    print "@@@ $f\n";
#}

$start=time();

# Splits a path into directory and filename portions.
sub splitpath($) {
    my ($path) = @_;
    my ($dir, $file) = ('', '');

    $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs;
    $dir  = $1;
    $file = $2;
#    print "dir=$dir, file=$file\n";
    return ($dir, $file);
}

# Splits a filename into basename and extension portions.
sub splitext($) {
    my ($file) = @_;
    my ($base, $ext) = ('', '');
    $file =~ m|^ ( (?: .* \. (?: \.\.?\z )? )? ) ([^\.]*) |xs;
    if ($1 eq "") {
	$base = $2;
    } else {
	$base = $1;
	$ext  = $2;
    }
#    print "base=$base, ext=$ext\n";
    return ($base, $ext);
}

# sort @flist with file extensions.
@tmp1 = @tmp2 = ();
@flist_noext = @flist_withext = ();
foreach $f (@flist) {
    my ($dir, $file) = splitpath($f);
    my ($base, $ext) = splitext($file);
    if ($ext eq "") {
	push(@flist_noext, "$dir$base");
    } else {
	push(@flist_withext, $f);
	push(@tmp1, "$dir$base");
	push(@tmp2, $ext);
    }
}

# Sort file names with consideration for numbers.
@flist_noext = map  { $_->[0] }
               sort { $a->[1] cmp $b->[1] } 
               map  { my $tmp = $_; $tmp =~ s/(\d+)/sprintf("%08d", $1)/ge; 
                      [ $_, $tmp ] } @flist_noext;

# Sort file names with extension, and basename.
@flist_withext = @flist_withext[sort {$tmp2[$a] cmp $tmp2[$b] or
			$tmp1[$a] cmp $tmp1[$b]} 0 .. $#tmp2];

foreach $f (@flist_noext) {
    print "[noext]   $f\n";
}
foreach $f (@flist_withext) {
    print "[withext] $f\n";
}

@flist = ();
push(@flist, @flist_noext, @flist_withext);

# return @flist;