Frage

Ich verwende unter Perl-Code die Dateien im tar-Archiv aufzulisten. Die Größe des tar-Archiv ist immer etwa 15 MB.

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

Ausführen dieses Codes gibt mir eine Fehlermeldung „Out of Memory“. Ich habe etwa 512 MB in meinem Linux-System und ich möchte nicht die Erinnerung an meinem System zu erhöhen. Kann mir jemand bitte vorschlagen, wenn der Code kann für eine bessere Leistung oder einen anderen Code geändert werden, um die Dateien in tar-Archiv aufzulisten.

War es hilfreich?

Lösung

Ich habe versucht, das auf einem großen Teer und bekam auch einen Fehler. Wahrscheinlich ein Fehler in Libs. Folgende arbeitet für mich:

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

Andere Tipps

Archive::Tar FAQ :

  

Ist das nicht Archive :: Tar langsam?   Ja ist es. Es ist reines Perl, so ist es jedoch viel langsamer dann / bin / tar ist, ist es sehr tragbar. Wenn Geschwindigkeit ein Problem ist, sollten Sie mit / bin / tar statt.

     

Ist das nicht Archive :: Tar schwerer auf das Gedächtnis als / bin / tar?   Ja, es ist, siehe vorherige Antwort. Da Compress :: Zlib und damit IO :: Zlib nicht auf ihren Dateihandies sucht nicht unterstützt, gibt es wenig anderes übrig, als das Archiv in dem Speicher zu lesen. Das ist in Ordnung, wenn Sie im Speicher Manipulation des Archivs machen wollen.

     

Wenn Sie nur extrahieren möchten, verwenden Sie die extract_archive Klassenmethode statt. Es wird optimieren und sofort auf die Festplatte schreiben.

     

Eine andere Möglichkeit ist es, die iter Klassenmethode zu verwenden, über die Dateien im Tarball zu wiederholen, ohne sie sofort alle im Speicher zu lesen.

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

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

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

/ I3az /

Wenn Perl ist kein Muss, Verwendung tar

$ tar tvf file.tar
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top