0

さて、フォルダに650万枚の画像があり、できるだけ早く移動する必要があります。それらを独自のフォルダー構造に移動しますが、最初にこれらをこのサーバーから移動する必要があります。

rsyncやcp、その他のあらゆる種類のツールを試しましたが、常にエラーが発生します。そこで、より直接的な方法で情報を取得するためのperlスクリプトを作成しました。opendirを使用して、すべてのファイルをカウントさせると、完璧に機能します。それは約10秒でそれらすべてを数えることができます。ここで、スクリプトをもう1ノッチ上げて、実際にファイルを移動させようとすると、「ファイルが大きすぎます」というエラーが表示されます。ファイル自体はすべてかなり小さいので、これはある種の誤ったエラーであるに違いありません。

#!/usr/bin/perl
#############################################
# CopyFilesLite
# Russell Perkins
# 7/12/2010
#
# Tool is used to copy millions of files
# while using as little memory as possible. 
#############################################

use strict;
use warnings;
use File::Copy;

#dir1, dir2 passed from command line
my $dir1 = shift;
my $dir2 = shift;
#Varibles to keep count of things
my $count = 0;
my $cnt_FileExsists = 0;
my $cnt_FileCopied = 0;

#simple error checking and validation
die "Usage: $0 directory1 directory2\n" unless defined $dir2;
die "Not a directory: $dir1\n" unless -d $dir1;
die "Not a directory: $dir2\n" unless -d $dir2;

opendir DIR, "$dir1" or die "Could not open $dir1: $!\n";
while (my $file = readdir DIR){
  if (-e $dir2 .'/' . $file){
   #print $file . " exsists in " . $dir2 . "\n"; #debuging 
   $cnt_FileExsists++;
  }else{
   copy($dir1 . '/' . $file,$dir2 . '/' . $file) or die "Copy failed: $!";
   $cnt_FileCopied++;
   #print $file . " does not exsists in " . $dir2 . "\n"; #debuging 
  }
  $count++;
}
closedir DIR;

#ToDo: Clean up output. 
print "Total files: $count\nFiles not copied: $cnt_FileExsists\nFiles Copied: $cnt_FileCopied\n\n";

それで、あなたの誰かが以前にこれに遭遇したことがありますか?これは何が原因で、どのように修正できますか?

4

5 に答える 5

1

エラー処理コードで、 「」に変更or die "Copy failed: $!";するか、「コピーに失敗しました:」「$ dir1 /$file」を「$dir2/ $ file」:$!」に変更してください。?

次に、エラーが発生した場所を示します。

次に、2つのことを確認します-

1)同じファイルで毎回失敗しますか?

2)そのファイルはどういうわけか特別ですか?変な名前?異常なサイズ?通常のファイルではありませんか?(他の回答が理論化したように)ファイルではありませんか?

于 2010-07-12T20:49:02.050 に答える
0

これが問題に関連しているかどうかはわかりませんが、readdirは、サブディレクトリ(存在する場合)、および多くのオペレーティングシステムの現在のディレクトリ(。)と親ディレクトリ(..)を含むすべてのディレクトリコンテンツのリストを返します。ファイルだけでなくディレクトリもコピーしようとしている可能性があります。以下は、ディレクトリのコピーを試みません。

while (my $file = readdir DIR){
    next if -d "$dir1/$file";
于 2010-07-12T19:19:52.033 に答える
0

これは、マウント先のサーバーのnfsマウントのいずれかに問題があるようです。私はそれにusbドライブを接続しました、そしてファイルは極端な速度でコピーしています...あなたがusb2を極端として数えるならば。

于 2010-07-12T21:02:28.873 に答える
0

1つのフォルダにある650万の画像は非常に極端であり、ディレクトリがシェルであろうとPerlであろうと、ディレクトリを読み取るためだけにマシンに負荷をかけます。これは1つの大きなフォルダ構造です。

あなたが今Perlで解決策を追いかけていることは知っていますが、シェルからその数のファイルを処理するときは、xargsコマンドを利用したいと思うでしょう。ファイルを管理可能なチャンクにグループ化することで、非常に役立ちます。http://en.wikipedia.org/wiki/Xargs

于 2010-07-13T03:23:10.827 に答える
0

多分あなたがデータを送るパーティションのファイルシステムは非常に大きなデータをサポートしていません。

于 2010-07-13T03:54:55.863 に答える