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.
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. –
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. –
Après avoir ajouté 'COMPRESS_GZIP', la même erreur est lancée sur' write() '. –