2009-11-03 8 views

risposta

5

Se si esegue il binario unzip, il processo di fork/exec e

  1. un'istanza di un nuovo processo di
  2. consumano più memoria (per tutta la durata del processo generato)

È Dovrò anche configurare con il percorso corretto a unzip. Considerato tutto ciò, preferirei decisamente l'approccio alla biblioteca.

+3

Non ho mai capito questo tipo di pensiero. Un fork/exec è un processo molto veloce, chiunque abbia passato un po 'di tempo a leggere o scrivere script di shell ne è consapevole. La memoria consumata dallo stesso unzip binario è banale rispetto ai costi dell'algoritmo e (soprattutto) dei dati in esso contenuti. E/usr/bin/decomprimere le navi di default su ogni distribuzione Linux, e credo che anche BSD e Cygwin. A meno che non si disponga di codice di esempio banale come: 'apri il mio $ input, 'decomprimi -cp $ ARCHIVE $ FILE |", preferirei decisamente l'opzione semplice. –

+1

Anche se sono d'accordo con quanto sopra * generalmente *, se si dispone di un server molto carico, il consumo di risorse aumenterà con il modello fork/exec. L'allocazione del pid, l'allocazione del flusso tra processi, l'allocazione della memoria (consentendo la copia su scrittura). Per i processi stand-alone sono soddisfatto del modello fork/exec. Per i modelli di server preferisco allontanarmi da questo verso il modello con la minor quantità di allocazione delle risorse. –

+1

Se si sta biforcandosi in un ciclo, in particolare un ciclo caldo, si vedranno assolutamente problemi di prestazioni. Se non sei in un ciclo, o se stai biforcando ad una velocità di una volta al secondo o una volta ogni pochi secondi, quindi nessun problema. Inoltre, usare una libreria invece del comando di sistema 'unzip' può essere un vantaggio; la libreria potrebbe essere più recente e meno buggata. –

14

Secondo il Archive::Zip documentation si sarebbe meglio utilizzare Archive::Extract:

Se sono solo intenzione di essere cerniere estrazione (e/o altri archivi) si raccomanda di guardare con Archive :: Extract al contrario, poiché è molto più facile da usare e determina la funzionalità specifica dell'archivio.

Questo è interessante perché Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. Quindi sembra che Archive :: Zip sia l'opzione preferita.

Archive :: Zip utilizza Compress::Raw::Zlib che è un'interfaccia di basso livello per la libreria di sistema zlib; quindi non è una pura implementazione Perl, il che significa che sarà simile a prestazioni a unzip. Quindi, in altre parole, dal punto di vista delle prestazioni non c'è motivo di scegliere unzip prima di Archive :: Zip.

+3

Se si utilizza 'Archive :: Extract', allora funzionerà anche con altri formati di compressione. –

1

Una preoccupazione è con la memoria. Abbiamo trovato la strada difficile (il server web di produzione si è bloccato) che Archive::Tar ha avuto una perdita di memoria. Quindi, mentre nel complesso l'uso di un modulo invece di una chiamata di sistema a un comando esterno è una buona idea (vedere altre risposte per il ragionamento), è necessario assicurarsi che il modulo non abbia trucchi.