Perché di Perl Archive :: Tar a corto di memoria?
-
19-09-2019 - |
Domanda
io sto usando qui di seguito il codice Perl per elencare i file di archivio tar. La dimensione del archivio tar è sempre circa 15MB.
my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;
L'esecuzione di questo codice mi dà un errore "Memoria insufficiente". Ho circa 512 MB nel mio sistema Linux e io non voglio aumentare la memoria del mio sistema. Qualcuno può suggerire me, se questo codice può essere modificato per migliorare le prestazioni o di un altro codice per elencare i file in archivio tar.
Soluzione
ho provato che su una grande catrame e ottenuto un errore troppo. Probabilmente un bug in librerie. Di seguito ha lavorato per me:
@files = split/\n/, `tar tf $file`
Altri suggerimenti
Non è Archive :: Tar lento? Sì. E 'pura Perl, quindi è molto più lento allora il vostro / bin / tar Tuttavia, è molto portabile. Se la velocità è un problema, è possibile utilizzare / bin / tar invece.
Non è Archive :: Tar più pesante sulla memoria di / bin / tar? Si è, vedi risposta precedente. Dal momento che Compress :: Zlib e quindi IO :: Zlib non supporta cercano sui loro filehandle, c'è poca scelta ma per leggere l'archivio nella memoria. Questo è ok se si vuole fare la manipolazione in memoria dell'archivio.
Se si desidera solo per estrarre, utilizzare il metodo della classe extract_archive invece. Sarà ottimizzare e scrivere su disco immediatamente.
Un'altra opzione è quella di utilizzare il metodo di classe iter per scorrere i file nel tarball, senza leggerli tutti in memoria in una sola volta.
Quindi, sulla base sopra allora questo dovrebbe essere la soluzione (non testata):
my $next = Archive::Tar->iter( $file );
while ( my $f = $next->() ) {
say $f->name;
}
/ I3az /
se Perl non è un must, l'uso tar
$ tar tvf file.tar