لماذا هو بيرل IO: ضغط :: محول :: نفاد نفاد الذاكرة؟
-
28-09-2019 - |
سؤال
أحاول تعيين أذونات الملفات الواردة في لعبة Tarball مع ما يلي:
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";
}
ولكن عندما write()
تسمى الطريقة ، يموت البرنامج النصي مع الخطأ التالي:
خارج الذاكرة أثناء طلب "كبير" ببايت 268439552 ، يبلغ إجمالي SBRK () 313298944 بايت في /usr/lib/perl5/5.10/i686-cygwin/io/compress/adapter/deflate.pm خط 43.
يبلغ هذا الخطأ الذي يثير هذا الخطأ 22 ميجابايت (59 ميجابايت غير مضغوط) ، وبالتالي فإن الأرقام المذكورة أعلاه مقلقة بعض الشيء. هل أتعامل مع خطأ في IO::Compress
؟ هل هناك نوع من الحل البديل في هذه الحالة؟ أنا أستخدم Perl 5.10.1 لـ i686-cygwin-thread-multi-64int.
المحلول
هذه لقطة في الظلام ، ولكن هل يمكنك تجربة البرنامج النصي التالي؟
#!/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);
}
لا تنتمي إلى StackOverflow