Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
sort @flist with extension in mknmz::find_target()
- From: Hajime BABA <baba@xxxxxxxxxxxxxxxxxxxxxx>
- Date: Sun, 21 Jan 2001 04:01:08 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 01239
ふと考え付いたんですが、フィルタアプリケーションの起動のオーバーヘッ
ドをある程度おさえるために、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;