So, I have th is function called lookat(). It basically puts selected
stat data of files into a hash of hashes (%dirs) as you can see.

Is there any better way to gather a bunch of files' stat data than
looping and calling lstat?

Recent profiling of my code (props to Jeff Pinyan for some awesome
optimisations) shows, of course, that the endless stating of 120,000+
files with an average of 5,000+ files in a dir can be time consuming.

BTW, using XFS is really great. Reiser is probably way better on a 1GHz,
but on my 350 XFS rox.

Vital statistics:
        perl 5.7.1
        Mandrake 8.0
        glibc-2.2.2-4mdk
        gcc version 2.96 20000731 (Linux-Mandrake 8.0 2.96-0.48mdk)

sub lookat {
  my ($entry) = @_;
  my $name = "lookat";
  my (@files);

  return if exists($dirs{$entry});

  print "\t$name -> traversing $entry\n" if DEBUG & TRAVERSE;
  $dirs{$entry} = {};

  opendir DIR, $entry or die "can't open $entry: $!\n";
  for (grep !/^\.\.?$/, readdir DIR) {
    next if exists($ignore{$_});

    my $file = "$entry/$_";
    $file =~ s!//!/!g;
    
    my @stats = ( '0', (lstat $file)[0,1,7,9] );

    if (-r _ && -f _) {
      print "\t\t$name -> F $file\n" if DEBUG & REPORT;
      $dirs{$entry}{$_} = \@stats;
    }
    elsif (-r _ && -d _ && -x _) {
      print "\t\t$name -> D $file\n" if DEBUG & REPORT;
      lookat($file) unless exists($opts{norecurse});
    } 
  }
  closedir(DIR);

  if ($opts{'moresync'}) {
    loadix($entry);
    for (keys %{ $dirs{$entry} }) {
      gonkulate($entry,$_) if $dirs{$entry}{$_}[0] eq '0';
    }
    rend_thee($entry) if exists($meta{$entry}{nuptdate});
  }
}

--
Hob Goblin
[EMAIL PROTECTED]

"Pinky, you've left the lens cap of your mind on again." - The Brain
Summary of my perl5 (revision 5.0 version 7 subversion 1) configuration:
  Platform:
    osname=linux, osvers=2.4.4-ac5.xfs, archname=i686-linux
    uname='linux ahkbarr.dynip.com 2.4.4-ac5.xfs #1 tue may 8 13:38:10 cdt 2001 i686 
unknown '
    config_args='-de'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
  Compiler:
    cc='cc', ccflags ='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE 
-D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-fno-strict-aliasing -I/usr/local/include'
    ccversion='', gccversion='2.96 20000731 (Linux-Mandrake 8.0 2.96-0.48mdk)', 
gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -lgdbm -ldb -ldl -lm -lc -lcrypt -lutil
    perllibs=-lnsl -ldl -lm -lc -lcrypt -lutil
    libc=/lib/libc-2.2.2.so, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
    cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options: USE_LARGE_FILES
  Built under linux
  Compiled at May 10 2001 14:50:49
  @INC:
    /usr/local/lib/perl5/5.7.1/i686-linux
    /usr/local/lib/perl5/5.7.1
    /usr/local/lib/perl5/site_perl/5.7.1/i686-linux
    /usr/local/lib/perl5/site_perl/5.7.1
    /usr/local/lib/perl5/site_perl
    .

Reply via email to