代码之家  ›  专栏  ›  技术社区  ›  Richard Simões

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

  •  2
  • Richard Simões  · 技术社区  · 14 年前

    我试图通过以下方式设置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字节,total sbrk()为 313298944字节 /usr/lib/perl5/5.10/i686-cygwin/IO/Compress/Adapter/Deflate.pm第43行。

    触发此错误的tarball是22MB(59MB未压缩),因此上面的数字有点令人担忧。我是不是在和一只虫子打交道 IO::Compress ? 在这种情况下有什么解决办法吗?我将Perl5.10.1用于i686-cygwin-thread-multi-64int。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Sinan Ünür    14 年前

    这是暗中拍摄,但你能试试下面的剧本吗?

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