The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
сортировка файлов в директории, !*! andy, 02-Июн-08, 09:18  [смотреть все]
день добрый!
Появилась необходимость возвращать из процедуры список файлов в некоторой директории. Обязательное условие - файлы должны быть отсортированы по времени создания.
Пока пользуюсь таким вот конвейером, но почему-то есть подозрение, что это можно сделать проще/производительней.
Поделитесь идеей, кому не лень. Буду очень благодарен

sub get_new_messages($) {
    my( $dir, @files );
    $dir = shift;
    if( opendir(DIR, $dir) ) {
        @files = sort { (stat($a))[10] <=> (stat($b))[10] }
                 grep { -f }
                 map { "$dir/$_" }  
                 readdir(DIR);
        closedir(DIR);
    } else {
        logging( LOG_WARNING, "Can not open dir [%s]: %s", $dir, $! );
    }
    return @files;
}

  • сортировка файлов в директории, !*! Arpo, 10:04 , 02-Июн-08 (1)
    >[оверквотинг удален]
    >     map { "$dir/$_" }
    >            
    >     readdir(DIR);
    >        closedir(DIR);
    >    } else {
    >        logging( LOG_WARNING, "Can not
    >open dir [%s]: %s", $dir, $! );
    >    }
    >    return @files;
    >}

    а почему просто не написать shell скрипт с использованием хотябы ls -t ?
    А видимо это маленкий кусочек большого кода??

  • сортировка файлов в директории, !*! NuINu, 12:54 , 02-Июн-08 (3)

    >[оверквотинг удален]
    >     map { "$dir/$_" }
    >            
    >     readdir(DIR);
    >        closedir(DIR);
    >    } else {
    >        logging( LOG_WARNING, "Can not
    >open dir [%s]: %s", $dir, $! );
    >    }
    >    return @files;
    >}

    я думаю тормоза связаны с многочисленными вызовами команды stat в сортировке, поэтому смею предложить вариант такой:

    #!/usr/bin/perl -w

    use strict;
    use Data::Dumper;

    #my $debugit=1;

    sub SimpleReadDirSortByTime
    {
        my ($path) = shift;
        my @dir;
            
        opendir(Z, $path) or do{ print "can?t opendir $path: $!\n"; return [] };

        @dir =grep { -f } map { "$path/$_" } readdir(Z);
        my @ds;
        foreach my $i (@dir){
        push @ds, (stat($i))[10];
        }
        print Dumper(@ds);
        my @sdir = @dir[sort { $ds[$a] <=> $ds[$b] } 0..$#dir];
        closedir(Z);
        return @sdir;
    }

    my @D = SimpleReadDirSortByTime('./testdir');
    print Dumper(@D);

    • сортировка файлов в директории, !*! andy, 06:30 , 03-Июн-08 (4)
      >я думаю тормоза связаны с многочисленными вызовами команды stat в сортировке

      да, действительно, stat в сортировке выглядит совершенно не гут

      Давно не писал на перле, захотелось поизвращаться. После всяких ужимок и прыжков получилось вот это:

      sub get_new_messages($) {
          my( $dir, @files );
          $dir = shift;
          @files = map  { $_->[0] }
                   sort { $b->[1] <=> $a->[1] }
                   map  { [ $_, -C ] }
                   grep { -f }
                   <$dir/*>;
          return @files;
      }

      На скорость еще не проверял правда

      • сортировка файлов в директории, !*! NuINu, 09:29 , 03-Июн-08 (5)

        >[оверквотинг удален]
        >             sort { $b->[1] <=> $a->[1] }
        >            
        > map  { [ $_, -C ] }
        >            
        > grep { -f }
        >             <$dir/*>;
        >    return @files;
        >}
        >
        >На скорость еще не проверял правда

        да классно, думаю будет быстрее, тока сортировка у тебя почему то в обратном порядке стала.

        • сортировка файлов в директории, !*! andy, 10:50 , 03-Июн-08 (6)
          >да классно, думаю будет быстрее,

          неа, этот вариант полностью сливает твоему, в основном из-за <*>

          Лидеры:

          sub get_sorted_file_list11($) {
              my( $dir, @files, @ctime, @sorted );
              $dir = shift;
              if( opendir( DIR, $dir ) ) {
                  @files = grep { -f } map {"$dir/$_"} readdir(DIR);
                  closedir(DIR);
                  @ctime = map { (stat)[10] } @files;
                  @sorted = @files[ sort{ $ctime[$a] <=> $ctime[$b] } 0..$#files ];
              } else {
                  warn $!;
              }
              return @sorted;
          }


          sub get_sorted_file_list10($) {
              my( $dir, @files, @ctime, @sorted );
              $dir = shift;
              if( opendir( DIR, $dir ) ) {
                  @files = grep { -f } map {"$dir/$_"} readdir(DIR);
                  closedir(DIR);
                  @ctime = map { -C } @files;
                  @sorted = @files[ sort{ $ctime[$b] <=> $ctime[$a] } 0..$#files ];
              } else {
                  warn $!;
              }
              return @sorted;
          }

          sub get_sorted_file_list8($) {
              my( $dir, @files );
              $dir = shift;
              if( opendir(DIR, $dir) ) {
                  @files = map { $_->[0] }
                           sort { $b->[1] <=> $a->[1] }
                           grep { -f $_->[0] }
                           map  { [ "$dir/$_", -C "$dir/$_" ] }
                           readdir(DIR);
                  closedir(DIR);
              } else {
                  warn "Can not open dir [$dir]: $!\n";
              }
              return @files;
          }


          Benchmark: timing 10000 iterations of var10, var11, var8...
               var10: 53 wallclock secs (13.47 usr + 36.22 sys = 49.69 CPU) @ 201.26/s (n=10000)
               var11: 58 wallclock secs (17.66 usr + 37.02 sys = 54.68 CPU) @ 182.88/s (n=10000)
                var8: 55 wallclock secs (14.72 usr + 37.12 sys = 51.84 CPU) @ 192.92/s (n=10000)


          >тока сортировка у тебя почему то в
          >обратном порядке стала.

          -M -A и -С возвращают число дней, чем больше результат, тем старее файл. Вроде все правильно, результаты по крайней мере сходятся с ожидаемыми )))




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру