2009-11-18 6 views

Antwort

13

Also machte ich eine zufällige-ish große Zip-Datei:

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

dh 116 MB mit 23.4K-Dateien in das und zeitlich Dinge:

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

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

dies Die vom System zur Verfügung gestellte Kommandozeilen-Unzip-Binärdatei - ohne Zweifel so fein abgestimmt und optimiert wie eine reine C-Programmdatei sein kann. Dann (nach Reinigung/tmp; -) ...:

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

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

... und das ist Python mit seiner Standard-Bibliothek - einem wenig anspruchsvollen CPU-Zeit, aber mehr als 10% schneller in real, dass ist abgelaufene Zeit.

Natürlich können Sie solche Messungen natürlich wiederholen (auf Ihrer speziellen Plattform - wenn es CPU-arm ist, z. B. ein langsamer ARM-Chip, dann könnte Pythons zusätzliche CPU-Zeit dazu führen, dass es langsamer wird) spezifische ZIP-Dateien von Interesse, da jede große Zip-Datei eine sehr unterschiedliche Mischung und möglicherweise Leistung haben wird). Aber das schlägt mir vor, dass es nicht so viel Platz gibt, um eine Python-Erweiterung viel schneller zu bauen als das gute alte zipfile - da Python es mit dem pure-C, system-included entpackt! -)

+1

Vielen Dank für Ihre Analyse, es war sehr hilfreich. – Duck

+0

@Duck, gern geschehen! –

+1

Es wäre schön, auch Speicherverbrauchsmessungen zu sehen. +1 sowieso. –

4

Für Wenn Sie große Dateien verarbeiten, ohne sie in den Arbeitsspeicher zu laden, verwenden Sie die neuen strombasierten Methoden in Python 2.6s Version zipfile, z. B. ZipFile.open. Verwenden Sie nichtextract oder extractall, es sei denn, Sie haben die Dateinamen im ZIP stark bereinigt.

(Sie verwendet read alle Bytes in den Speicher zu haben oder hacken um ihn herum wie zipstream;. Dies ist mittlerweile veraltet)

Verwandte Themen