2009-11-18 4 views

Respuesta

13

Así que hicieron un gran archivo zip al azar-ish:

$ ls -l *zip 
-rw-r--r-- 1 aleax 5000 115749854 Nov 18 19:16 large.zip 
$ unzip -l large.zip | wc 
    23396 93633 2254735 

es decir, 116 MB con archivos 23.4K en ella, y cosas cronometrados:

$ time unzip -d /tmp large.zip >/dev/null 

real 0m14.702s 
user 0m2.586s 
sys   0m5.408s 

esto es la línea de comandos suministrada por el sistema descomprime el binario, sin duda tan afinado y optimizado como puede ser un ejecutable C puro. A continuación (después de limpiar/tmp; -) ...:

$ time py26 -c'from zipfile import ZipFile; z=ZipFile("large.zip"); z.extractall("/tmp")' 

real 0m13.274s 
user 0m5.059s 
sys   0m5.166s 

... y esto es Python con su biblioteca estándar - un poco más exigente de tiempo de CPU, pero más de un 10% más rápido en el sector, que es, tiempo transcurrido.

Puede repetir estas medidas, por supuesto (en su plataforma específica, si es pobre en CPU, por ejemplo, un chip ARM lento, Python tiene más tiempo de CPU y puede hacerlo más lento). archivos zip específicos de interés, ya que cada archivo comprimido grande tendrá una mezcla muy diferente y muy posiblemente el rendimiento). Pero lo que esto me sugiere es que no hay mucho espacio para construir una extensión de Python mucho más rápido que el antiguo zipfile - ¡dado que Python lo usa supera al C puro, el sistema incluye descomprimir! -)

+1

Gracias por su análisis, ha sido de gran ayuda. – Duck

+0

@Duck, ¡de nada! –

+1

Sería bueno ver las mediciones de uso de memoria también. +1 de todos modos. –

4

Para el manejo de archivos de gran tamaño sin cargarlos en la memoria, utilizar los nuevos métodos basados ​​en flujo en versión de zipfile de Python 2.6, como ZipFile.open. No utiliceextract o extractall a menos que haya desinfectado fuertemente los nombres de archivo en la postal.

(Usted solía tener que read todos los bytes en la memoria o piratear su alrededor como zipstream;. Esto es ahora obsoleto)

Cuestiones relacionadas