Pergunta

Eu estou usando o código abaixo Perl para listar os arquivos no arquivo tar. O tamanho do arquivo tar é sempre sobre 15MB.

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

Ao executar este código me dá um erro "Out of Memory". Tenho cerca de 512MB no meu sistema Linux e eu não quero para aumentar a memória do meu sistema. Alguém pode por favor me sugerir se este código pode ser modificado para melhor desempenho ou outro código para listar os arquivos no arquivo tar.

Foi útil?

Solução

Tentei fazer isso em grande alcatrão e tenho um erro também. Provavelmente um bug no libs. A seguir trabalhou para mim:

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

Outras dicas

A partir Archive::Tar FAQ :

Não é Archive :: Tar lento? Sim, ele é. É pura perl, por isso é muito mais lento, em seguida, o seu / bin / tar No entanto, é muito portátil. Se a velocidade é um problema, considere usar / bin / tar vez.

Não é Archive :: Tar mais pesado na memória do que / bin / tar? Sim, é, ver a resposta anterior. Desde Compress :: Zlib e, portanto, IO :: Zlib não suporta buscar em seus filehandles, há pouca escolha, mas para ler o arquivo na memória. Este é ok se você quer fazer a manipulação na memória do arquivo.

Se você quiser apenas para o extrato, use o método de classe extract_archive vez. Ele vai otimizar e gravação para o disco imediatamente.

Outra opção é usar o método de classe iter para iterar sobre os arquivos no tarball sem lê-los todos em memória de uma vez.

Assim, com base no acima, então esta deve ser a solução (não testado):

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

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

/ I3az /

Se o Perl não é uma obrigação, use tar

$ tar tvf file.tar
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top