2013-09-17 1 views
0

Я пытаюсь найти разницу между двумя каталогами в Perl. Я хочу, чтобы оптимизировать его эффективно, а также не уверен, как игнорировать определенные файлы, запускаемые (скажем, с расширением .txt или .о)Оптимизируйте поиск разницы между двумя каталогами рекурсивно в perl

код у меня до сих пор:

use strict; 
use warnings; 
use Parallel::ForkManager; 
use File::Find; 
use List::MoreUtils qw(uniq); 

my $dir1 = "/path/to/dir/first"; 
my $dir2 = "/path/to/dir/second"; 
my @comps = ('abc'); 
my (%files1, %files2); 
my $workernum = 500; 
my $pm = new Parallel::ForkManager($workernum); 
my @common =(); 
my @differ =(); 
my @only_in_first =(); 
my @only_in_second =(); 

foreach my $comp (@comps) { 
    find(sub { -f ($files1{$_} = $File::Find::name) }, "$dir1"); 
    find(sub { -f ($files2{$_} = $File::Find::name) }, "$dir2"); 
    my @all = uniq(keys %files1, keys %files2); 
    for my $file (@all) { 
     my $pid = $pm->start and next; # do the fork 
     my $result; 
     if ($files1{$file} && $files2{$file}) { # file exists in both dirs 
      $result = qx(/usr/bin/diff -q $files1{$file} $files2{$file}); 
      if ($result =~m/^Common subdirectories/) { 
       push (@common, $result); 
      } else { 
       push (@differ, $result); 
      } 
     } elsif ($files1{$file}) { 
      push (@only_in_first, $file); 
     } else { 
      push (@only_in_second, $file); 
     } 
     $pm->finish; # do the exit in child process 
    } 
} 
+0

Я должен угадать актуальный вопрос. Если вы устанавливаете переменные в разветвленных процессах, эти изменения не отображаются в родительском процессе. Пожалуйста, посмотрите «СЛЕДУЮЩИЕ ДАТЫСТРУКТУРЫ из дочерних процессов» в man-странице Parallel :: ForkManager. –

ответ

0

разн подсобные hhas a -r swith, который позволяет работать в подкаталогах.

Этого недостаточно для вас?

0

Да, diff -r действительно делает то же, что и ваш код. Однако diff-r не делает этого с 500 рабочими процессами. Затем diff -r может быть достаточно быстрым, чтобы параллельно не требовалось 500 процессов.

Вещи примечания:

  1. «$ вар» редко требуется и лучше записать в виде $ Var
  2. , используя 2 хэши как дифф, но по-прежнему с использованием Uniq() с 2-х массивов ключей хеши - это отходы памяти и циклов процессора.
  3. Использование diff -q может легко упрощаться в perl или, по крайней мере, легко ускоряться с помощью первого файла stat() в обоих файлах и, по крайней мере, сравнивать размер перед выполнением вилки , Если файлы маленькие, можно использовать perl.
  4. если вы действительно хотите diff -q разветвить, по крайней мере, проверить $? поскольку могут возникнуть проблемы с, например, местоположение поиска или выполнение. На самом деле, проверив код выхода достаточно вместо того, чтобы делать Grep на стандартный вывод/STDERR
  5. для простоты, использовать поиск с PATH, а не абсолютный путь
Смежные вопросы