2009-11-18 3 views

Répondre

13

donc j'ai fait un grand aléatoire ish zipfile:

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

-à-dire, 116 Mo avec des fichiers 23.4K en elle, et les choses chronométrés:

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

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

c'est le binaire Unzip de la ligne de commande fourni par le système - sans aucun doute aussi bien réglé et optimisé qu'un pur C exécutable peut être. Ensuite (après le nettoyage/tmp; -) ...:

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

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

... et c'est Python avec sa bibliothèque standard - un peu plus exigeant du temps CPU, mais plus de 10% plus rapide en temps réel, que est, temps écoulé. Bien sûr, vous pouvez répéter de telles mesures (sur votre plate-forme spécifique - si elle est faible en termes de CPU, par exemple une puce ARM lente, les demandes supplémentaires de Python en termes de temps CPU peuvent ralentir - et votre des fichiers zip spécifiques d'intérêt, puisque chaque fichier zip volumineux aura un mix très différent et très probablement des performances). Mais ce que cela me suggère est qu'il n'y a pas beaucoup d'espace pour construire une extension Python beaucoup plus vite que le bon vieux zipfile - puisque Python l'utilisant bat le pur-C, système inclus unzip! -)

+1

Merci pour votre analyse, il a été le plus utile. – Duck

+0

@Duck, de rien! –

+1

Ce serait bien de voir des mesures d'utilisation de la mémoire aussi. +1 de toute façon. –

4

Pour manipuler des fichiers volumineux sans les charger en mémoire, utilisez les nouvelles méthodes basées sur les flux dans la version Python 2.6 de zipfile, telle que ZipFile.open. Ne pas utiliser extract ou extractall sauf si vous avez fortement assaini les noms de fichiers dans le ZIP.

(Vous avez l'habitude d'avoir à read tous les octets en mémoire, ou pirater autour d'elle comme zipstream;. C'est désormais obsolète)

Questions connexes