2010-08-12 4 views
2

Je suis en train de définir les autorisations de fichier des fichiers contenus dans une archive avec les éléments suivants:Pourquoi les E/S de Perl: Compress :: Adapter :: Deflate sont-elles à court de mémoire?

print "Checking $tgz_file... "; 
my $edited = 0; 
my $tarball = Archive::Tar->new($tgz_file); 
my @items = $tarball->get_files(); 
foreach (@items) { 
    if ($_->is_dir && $_->mode != 0755) { 
     $_->mode(0755); 
     $edited = 1; 
    } elsif ($_->is_file && $_->mode != 0644) { 
     $_->mode(0644); 
     $edited = 1; 
    } 
} 
if ($edited) { 
    $tarball->write($tgz_file, COMPRESS_GZIP); 
    print "edited!\n"; 
} else { 
    print "no changes.\n"; 
} 

Mais quand la méthode write() est appelée, le script meurt avec l'erreur suivante:

Out of memory during "large" request for 268439552 bytes, total sbrk() is 313298944 bytes at /usr/lib/perl5/5.10/i686-cygwin/IO/Compress/Adapter/Deflate.pm line 43.

Le tarball déclenchant cette erreur est de 22 Mo (59 Mo non compressé), donc les chiffres ci-dessus sont un peu alarmants. Est-ce que je fais face à un bug dans IO::Compress? Y at-il une sorte de solution de contournement dans ce cas? J'utilise perl 5.10.1 pour i686-cygwin-thread-multi-64int.

Répondre

4

Ceci est une photo dans le noir, mais pouvez-vous essayer le script suivant?

#!/usr/bin/perl 

use strict; use warnings; 
use Archive::Tar; 

my $in = '...'; 
my $out = "edited-$in"; 

print "Checking $in ...\n"; 

my $out_archive = Archive::Tar->new; 

my $edited; 
my $next = Archive::Tar->iter($in); 

while (my $item = $next->()) { 
    if ($item->is_dir and $item->mode != 0755) { 
     $item->mode(0755); 
     $edited = 1; 
    } elsif ($item->is_file and $item->mode != 0644) { 
     $item->mode(0644); 
     $edited = 1; 
    } 
    $out_archive->add_files($item); 
} 

if ($edited) { 
    print "Writing $out ...\n"; 
    $out_archive->write($out); 
} 
+0

Votre code ne déclenche pas l'erreur avec mon fichier volumineux. Je suppose que je peux alors utiliser le binaire tar pour le gzip et ainsi éviter complètement Deflate.pm. –

+0

Eh bien, j'avais l'intention de spécifier 'COMPRESS_GZIP' dans l'appel' write'. Cela vous dérangerait-il de l'essayer ainsi, pour mon édification. –

+0

Après avoir ajouté 'COMPRESS_GZIP', la même erreur est lancée sur' write() '. –

Questions connexes