2009-11-10 7 views
5

Ich benutze unten den Perl-Code, um die Dateien im tar-Archiv aufzulisten. Die Größe des Tar-Archivs beträgt immer ca. 15 MB.Warum hat Perl's Archive :: Tar keinen Speicher mehr?

my $file = shift; 
my $tar = Archive::Tar->new("$file"); 
my @lists = $tar->list_files; 
$tar->error unless @lists; 

Die Ausführung dieses Codes gibt mir einen Fehler "Nicht genügend Arbeitsspeicher". Ich habe ungefähr 512MB in meinem Linux-System und ich möchte den Speicher meines Systems nicht vergrößern. Kann mir jemand bitte vorschlagen, ob dieser Code für eine bessere Leistung oder einen anderen Code geändert werden kann, um die Dateien im tar-Archiv aufzulisten.

+0

Staat die Sprache zusammen mit dem operting System, damit wir Beginnen Sie mit Ihrem Problem –

+0

seine Perl und OS ist Linux – Space

Antwort

3

Ich versuchte das auf einem großen Teer und bekam auch einen Fehler. Wahrscheinlich ein Fehler in libs. Die folgenden für mich gearbeitet:

@files = split/\n/, `tar tf $file` 
0

wenn Perl kein Muss ist, verwenden Sie tar

$ tar tvf file.tar 
+0

Aber die Frage ist über Perl's Archive :: Tar – Celada

6

Von Archive::TarFAQ:

Ist das nicht Archive :: Tar langsam? Ja ist es. Es ist reines Perl, also ist es viel langsamer als Ihr/bin/tar. Es ist jedoch sehr portabel. Wenn die Geschwindigkeit ein Problem darstellt, sollten Sie stattdessen/bin/tar verwenden.

Ist Archiv :: Tar nicht schwerer als/bin/tar? Ja ist es, siehe vorherige Antwort. Da Compress :: Zlib und damit IO :: Zlib die Suche auf ihren Dateihandles nicht unterstützt, gibt es kaum eine andere Wahl, als das Archiv in den Speicher einzulesen. Dies ist in Ordnung, wenn Sie eine In-Memory-Manipulation des Archivs vornehmen möchten.

Wenn Sie nur extrahieren möchten, verwenden Sie stattdessen die Methode extract_archive class. Es wird optimiert und sofort auf die Festplatte geschrieben.

Eine weitere Option besteht darin, die iter-Klassenmethode zu verwenden, um die Dateien im Tarball zu durchlaufen, ohne sie alle gleichzeitig im Speicher zu lesen.

 

auf oben So basiert dann sollte dies die Lösung (ungetestet) sein:

my $next = Archive::Tar->iter($file); 

while (my $f = $next->()) { 
    say $f->name; 
} 

/I3az/

Verwandte Themen