2009-11-03 17 views

Respuesta

5

Si se ejecuta el binario unzip, el proceso se bifurcará/exec y

  1. una instancia de un nuevo proceso
  2. consumen más memoria (por la duración del proceso generado)

Usted También deberá configurar con la ruta correcta al unzip. Dado todo esto, preferiría mucho el enfoque de la biblioteca.

+3

Nunca entiendo este tipo de pensamiento. Un fork/exec es un proceso muy rápido, cualquiera que haya pasado algún tiempo leyendo o escribiendo scripts de shell es consciente de esto. La memoria consumida por el binario de descompresión en sí es trivial en comparación con los costos del algoritmo y (especialmente) los datos que contiene. Y/usr/bin/descomprime naves de forma predeterminada en cada distribución de Linux, y creo que BSD y Cygwin también. A menos que tenga un código de ejemplo tan trivial como: 'abrir mi $ input," descomprimir -cp $ ARCHIVE $ FILE | "', preferiría la opción simple. –

+1

Aunque estoy de acuerdo con lo anterior * en general *, si tiene un servidor muy cargado, su consumo de recursos aumentará con el modelo fork/exec. La asignación de pid, la asignación de flujo entre procesos, la asignación de memoria (que permite copiar con escritura). Para procesos independientes estoy contento con el modelo fork/exec. Para los modelos de servidor prefiero alejarme de esto hacia el modelo con la menor cantidad de asignación de recursos. –

+1

Si está bifurcando en un bucle, especialmente un bucle caliente, verá absolutamente problemas de rendimiento. Si no está en un bucle, o si está bifurcando a una velocidad de una vez por segundo o una vez cada pocos segundos, entonces no hay problema. Además, usar una biblioteca en lugar del comando 'unzip' del sistema puede ser un beneficio; la biblioteca puede ser más nueva y menos problemática. –

14

De acuerdo con la Archive::Zip documentation que sería mejor usar Archive::Extract:

Si sólo se va a ser cremalleras de extracción (y/u otros archivos) se le recomienda buscar en el uso Archivo :: Extracto en cambio, ya que es mucho más fácil de usar y excluye la funcionalidad específica del archivo.

Eso es interesante porque Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. Parece que Archive :: Zip es la opción preferida.

Archive :: Zip usa Compress::Raw::Zlib que es una interfaz de bajo nivel para la biblioteca del sistema zlib; por lo tanto, no es una implementación pura de Perl, lo que significa que tendrá un rendimiento similar al unzip. Entonces, en otras palabras, desde una perspectiva de rendimiento no hay razón para elegir unzip antes que Archive :: Zip.

+3

Si usa 'Archive :: Extract', entonces también funcionará para otros formatos de compresión. –

1

Una preocupación es con la memoria. Hemos encontrado la manera difícil (servidor web de producción se colgó) que Archive::Tar tenía una pérdida de memoria. Entonces, si bien utilizar un módulo en lugar de una llamada al sistema a un comando externo es una buena idea (ver otras respuestas para razonar), debe asegurarse de que el módulo no tenga errores.

Cuestiones relacionadas