2009-11-10 10 views
5

Estoy usando el siguiente código Perl para listar los archivos en el archivo tar. El tamaño del archivo tar siempre es alrededor de 15 MB.¿Por qué Perl's Archive :: Tar se queda sin memoria?

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

Ejecutar este código me da un error "Sin memoria". Tengo alrededor de 512MB en mi sistema Linux y no quiero aumentar la memoria de mi sistema. ¿Puede alguien sugerirme si este código puede modificarse para un mejor rendimiento u otro código para enumerar los archivos en el archivo tar.

+0

Estado el idioma junto con el sistema de la operaci? Para que podamos comience con su problema –

+0

su perl y OS es Linux – Space

Respuesta

3

Intenté con un alquitrán grande y también obtuve un error. Probablemente un error en libs. Los siguientes trabajó para mí:

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

si Perl no es una necesidad, usar tar

$ tar tvf file.tar 
+0

Pero la pregunta es sobre Perl's Archive :: Tar – Celada

6

De Archive::TarFAQ:

No es Archive :: Tar lenta? 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 respuesta anterior. Dado que Compress :: Zlib y, por lo tanto, IO :: Zlib no es compatible con la búsqueda en sus manejadores de archivos, no queda más remedio que leer el archivo en la memoria. Esto está bien si quiere hacer 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 utilizar el método de la clase iter para iterar sobre los archivos en el archivo tar sin leerlos todos en la memoria a la vez.

 

Así base en lo anterior, esto debería ser la solución (no probado):

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

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

/I3az/

Cuestiones relacionadas