[Mew-dist 08456] Re: im-111 で急に遅くなった imls

SAKAI Kiyotaka ksakai at example.com
1999年 4月 2日 (金) 19:54:40 JST


>> In article <19990402181006C.kazu at example.com>, Kazu Yamamoto (山本和彦) <kazu at example.com> writes:

>> いつディレクトリかどうかのチェックをするにしても、必ず一つずつするので
>> したら、総所要時間の面で改善されない気がしますが、勘違いでしょうか?

> ああ、sort などのように内容を表示しないコマンドですね。

やっとこの意味が分かりました。

imls だと、update 等のレンジを指定した使われ方が主なので、フォルダ内を
チェックした時点ではファイルかどうかを調べる必要はなく、実際に scan の
内容を表示する時点で scan 対象のファイルだけを調べてば充分だということ
ですね。

imsort 等はどのみちファイル操作を行うのだから誤差の範囲内だろうし、も
しリンクカウントをチェックした方が明かに速いのであれば imsort 等でやれ
ばいいという気がしてきました。

>> In article <19990402173406K.kazu at example.com>, Kazu Yamamoto (山本和彦) <kazu at example.com> writes:

>> ただ、考えてみたら immv, imsort, impack にも同じようにソート等を行う間
>> 際にファイルかどうかチェックを行うコードを追加するという方法はありまし
>> たね。

> そのように変更して下さい。

この方針で作ったパッチを送ります。

UseNumericFolder のパッチは破棄し、immv 関連のパッチを当ててから当たる
ようになっているはずです。
-- 
酒井 清隆 (E-mail: ksakai at example.com)


-------------- next part --------------
Index: IM/Folder.pm
===================================================================
RCS file: /home/ksakai/cvsroot/im-113/IM/Folder.pm,v
retrieving revision 1.1
diff -u -r1.1 Folder.pm
--- Folder.pm	1999/04/02 01:11:40	1.1
+++ Folder.pm	1999/04/02 08:58:38
@@ -140,7 +140,7 @@
     my @filesinfolder;
 
     opendir(DIR, $folder_dir) || im_die("can't open $folder_dir.\n");
-    @filesinfolder = sort {$a <=> $b} grep(/^\d+$/ && -f "$folder_dir/$_", readdir(DIR));
+    @filesinfolder = sort {$a <=> $b} grep(/^\d+$/, readdir(DIR));
     closedir(DIR);
 
     return @filesinfolder;
Index: impack.in
===================================================================
RCS file: /home/ksakai/cvsroot/im-113/impack.in,v
retrieving revision 1.1
diff -u -r1.1 impack.in
--- impack.in	1999/04/02 01:11:40	1.1
+++ impack.in	1999/04/02 08:57:48
@@ -85,9 +85,13 @@
 
     foreach (@paths) {
 	$dst = $_;
-	$dst =~ s|[^/]+$|$msg++|e;
-	if ($_ ne $dst){
-	    im_rename($_, $dst) || die $@;   # XXX
+	if (-f $dst) {
+	    do {
+		$dst =~ s|[^/]+$|$msg++|e;
+	    } while ($_ ne $dst && -e $dst);
+	    if ($_ ne $dst){
+		im_rename($_, $dst) || die $@;   # XXX
+	    }
 	}
     }
 
Index: imsort.in
===================================================================
RCS file: /home/ksakai/cvsroot/im-113/imsort.in,v
retrieving revision 1.1
diff -u -r1.1 imsort.in
--- imsort.in	1999/04/02 01:11:40	1.1
+++ imsort.in	1999/04/02 08:57:48
@@ -108,17 +108,18 @@
 
 sub imsort ($$$$) {
     my ($src, $msgs, $mode, $field) = @_;
-    my ($i, $path, $from, $to, $tmp, @msg_paths, @sorted_index);
+    my ($i, $path, $from, $to, $tmp, @msg_all, @msg_paths, @sorted_index);
     my @param = ();
 
     my $HOLE_PATH = get_impath($src, 'new');
 
-    @msg_paths = get_impath($src, @{$msgs});
+    @msg_all = get_impath($src, @{$msgs});
 
-    foreach $path (@msg_paths){
-	im_die "No file $path in $src. (Nothing was done.)\n"
-	    if (!-f $path);
-	push(@param, get_field_value($path, $field, $mode));
+    foreach $path (@msg_all) {
+	if (-f $path) {
+	    push(@msg_paths, $path);
+	    push(@param, get_field_value($path, $field, $mode));
+	}
     }
     if (($mode eq 'text') || ($mode eq 'ml')) {
 	@sorted_index = sort { $param[$a] cmp $param[$b] } 0 .. $#msg_paths;
Index: immv.in
===================================================================
RCS file: /home/ksakai/cvsroot/im-113/immv.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- immv.in	1999/04/02 08:54:01	1.3
+++ immv.in	1999/04/02 08:57:23	1.4
@@ -124,10 +124,6 @@
     $opt_link = 1 if (grep($src eq $_, @{$dsts}));
     @{$dsts} = grep($src ne $_, @{$dsts});
 
-    if ($src =~ /^[+=]/) {
-	chk_msg_existance($src, @{$msgs});
-    }
-
     if (($imap_src && imap_open_folders(0, $src) < 0) ||
 	($imap_dst && imap_open_folders(1, @imap_dsts) < 0))
     {
@@ -156,7 +152,7 @@
 
     my @msg_paths = get_impath($src, @$msgs);
     foreach (@msg_paths) {
-	refile_one($src, $dsts, $_);
+	refile_one($src, $dsts, $_) if (-f $_);
     }
 }
 
@@ -217,7 +213,7 @@
 
     foreach $msg (@$msgs) {
 	my $src_path = get_impath($src, ($msg));
-	imap_put_file($src, $dsts, $src_path);
+	imap_put_file($src, $dsts, $src_path) if (-f $src_path);
     }
 }
 
Index: imrm.in
===================================================================
RCS file: /home/ksakai/cvsroot/im-113/imrm.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- imrm.in	1999/04/02 08:54:02	1.3
+++ imrm.in	1999/04/02 08:57:23	1.4
@@ -119,10 +119,6 @@
 
     chk_folder_existance($src, @{$dsts});
 
-    if ($src =~ /^[+=]/) {
-	chk_msg_existance($src, @{$msgs});
-    }
-
     if (($imap_src && imap_open_folders(0, $src) < 0) ||
 	($imap_dst && imap_open_folders(1, @imap_dsts) < 0))
     {
@@ -151,7 +147,7 @@
 
     my @msg_paths = get_impath($src, @$msgs);
     foreach (@msg_paths) {
-	refile_one($src, $dsts, $_);
+	refile_one($src, $dsts, $_) if (-f $_);
     }
 }
 
@@ -210,7 +206,7 @@
 
     foreach $msg (@$msgs) {
 	my $src_path = get_impath($src, ($msg));
-	imap_put_file($src, $dsts, $src_path);
+	imap_put_file($src, $dsts, $src_path) if -f ($src_path);
     }
 }
 


Mew-dist メーリングリストの案内