Pregunta ¿Por qué Perl's Archive :: Tar se queda sin memoria?


Estoy usando el código de Perl a continuación para listar los archivos en el archivo tar. El tamaño del archivo tar es siempre de unos 15 MB.

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

La ejecución de este código me da un error "Out of Memory". Tengo alrededor de 512 MB en mi sistema Linux y no quiero aumentar la memoria de mi sistema. ¿Puede alguien sugerirme si este código puede modificarse para obtener un mejor rendimiento u otro código para listar los archivos en el archivo tar?


5
2017-11-10 09:11


origen


Respuestas:


Intenté eso en un alquitrán grande y también me equivoqué. Probablemente un error en libs. Lo siguiente funcionó para mí:

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

3
2017-11-10 10:00



De Archive::Tar  Preguntas más frecuentes:

¿No es Archive :: Tar slow?   Sí lo es. Es puro Perl, por lo que es mucho más lento que tu / bin / tar. Sin embargo, es muy portátil. Si la velocidad es un problema, considere usar / bin / tar en su lugar.

¿No es Archive :: Tar más pesado en la memoria que / bin / tar?   Sí lo es, ver la respuesta anterior. Como Compress :: Zlib y, por lo tanto, IO :: Zlib no admiten la búsqueda en sus identificadores de archivos, no hay más remedio que leer el archivo en la memoria. Esto está bien si desea realizar una manipulación en memoria del archivo.

Si solo desea extraer, use el método de clase extract_archive en su lugar. Se optimizará y escribirá en el disco de inmediato.

Otra opción es usar el método de la clase iter para iterar sobre los archivos en el tarball sin leerlos todos en la memoria a la vez.

Entonces, basado en lo anterior, entonces esta debería ser la solución (no probada):

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

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

/ I3az /


6
2017-11-10 12:28



Si Perl no es un deber, use tar

$ tar tvf file.tar

0
2017-11-10 10:35