2010-08-12 2 views
2

내가 가진 타르에 포함 된 파일의 파일 권한을 설정하기 위해 노력하고있어 다음왜 Perl의 IO : Compress :: Adapter :: Deflate의 메모리가 부족합니까?

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() 메서드를 호출 할 때, 스크립트는 다음과 같은 오류와 함께 사망 :

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.

이 오류를 일으키는 타르볼은 22MB (59MB 압축되지 않음)이므로 위의 수치는 약간 놀랍습니다. IO::Compress의 버그를 처리하고 있습니까? 이 경우 어떤 종류의 해결 방법이 있습니까? i686-cygwin-thread-multi-64int에 perl 5.10.1을 사용하고 있습니다.

답변

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); 
} 
+0

코드가 내 큰 파일에서 오류를 유발하지 않습니다. 나는 그때 gzip에 타르 바이너리를 사용할 수 있고 따라서 Deflate.pm을 피할 수 있다고 생각한다. –

+0

음, 필자는'write' 호출에서'COMPRESS_GZIP'을 지정하려고했습니다. 내 교화를 위해서도 그렇게 해 보시 겠어요. –

+0

'COMPRESS_GZIP'을 추가 한 후에'write()'에서 같은 오류가 발생합니다. –

관련 문제