为什么Perl的IO:Compress :: Adapter :: Deflate内存不足?

时间:2010-08-12 21:33:23

标签: perl archive-tar

我正在尝试使用以下命令设置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行。

触发此错误的tarball是22MB(59MB未压缩),因此上面的数字有点令人担忧。我在处理IO::Compress中的错误吗?在这种情况下是否有某种解决方法?我正在使用perl 5.10.1 for i686-cygwin-thread-multi-64int。

1 个答案:

答案 0 :(得分:4)

这是一个黑暗中的镜头,但你可以试试下面的剧本吗?

#!/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);
}