2016-11-30 5 views
1

私はPerlを初めて使用しています。 pdfファイルを複数のサブフォルダ、サブサブフォルダ、膨大な量のファイルを含む大きなディレクトリツリーで再帰的に検索したいとします。 私はこれを達成するためにFile::Find::Ruleを使用しています。しかし、パフォーマンスの影響は大きいです。 スクリプトの検索に膨大な時間がかかります。私のPerlスクリプトからPerl:大きなディレクトリ構造のpdfファイルrecursivleyを検索

スニペット:

@folders = File::Find::Rule -> file -> name('*.[pP][dD][fF]') -> in($folderPath); 

がパフォーマンスに影響を与えることなく、これを達成するための他の方法はありますか?

すべてのヘルプは高く評価されます。

+1

(非perl)コマンド 'find start_dir -name" * [pP] [dD] [fF] "'はどのように比較されますか?それはあなたのPerlスクリプトよりも速いですか? – PerlDuck

答えて

1

代わりagを使用して試みることができる:

my $cmd = 'ag -g "\.[pP][dD][fF]$" ' . $folderPath; 
chomp(my @files = qx/$cmd/); 
0

再帰的にサブディレクトリを検索するサブルーチンを試してみてください。下の例では、開始ディレクトリと配列(参照先:\ @name_of_array)を渡す必要があります。この配列はサブディレクトリで埋められます。私はそれがパフォーマンスが向上を願って、私はあなたの問題は単純であること

sub list_dirs 
{ 
    my ($dir, $dirs) = @_; 
    opendir(D, $dir) || die "cannot open directory $dir\n\n"; 
    my @tmp_dirs = readdir(D); 
    closedir(D); 
    foreach my $tmp_dir (@tmp_dirs) 
    { 
     if (-d "$dir/$tmp_dir") 
     { 
      next if ($tmp_dir eq ".."); 
      next if ($tmp_dir eq "."); 
      push @$dirs, "$dir/$tmp_dir"; 
      list_dirs("$dir/$tmp_dir", $dirs); 
     } 
    } 
    return $dirs; 
} 
2

わからないよ。その代わり、それが検出されたとして、各候補ファイルを見て、あなたがリストを作成し、それを返すためにFile::Find::Ruleを待っています君は。つまり、そのツリーの下にあるすべてのファイルを見るまで待つことになります。そして、コールドスタートから十分な数のファイルを使用すると、結果が表示されるまでに時間がかかることになります。

代わりに、基礎となるFile::Findを使用して、各ファイルが遭遇したときにチェックすることができます。また、Path::Tiny's iteratorが役に立つかもしれません。

ツリーの下のすべてのファイルにアクセスするのに必要な時間は変更しません。しかし、遭遇したときに各ファイルを処理することで、1)膨大なリストを構築する必要がないので、プログラムのメモリフットプリントを減らします。 2)結果をより速く見ることになります。このような

何かは、あなたが開始されます:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use File::HomeDir qw(my_documents); 
use Path::Tiny; 

my $it = path(my_documents)->iterator({ recurse => 1 }); 

while (my $path = $it->()) { 
    return $path->is_file and $path =~/[.] pdf \z/ix; 
    do_something_with_pdf($path); 
} 

sub do_something_with_pdf { 
    print $_[0]->canonpath, "\n"; 
} 

あなたがFile::Find::Ruleルール一部のように行う場合は、あなたがPath::Iterator::Ruleを好むかもしれません。重要なルールは、処理を開始する前に非常に大きなリストが構築されるのを待つのを避けることです。

ただし、すべてのPDFファイルのリストをすばやく取得する必要がある場合は、The Silver Searcherの使用を検討する必要があります。

関連する問題