2009-11-18 94 views

回答

13

所以我做了一個隨機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 

即116 MB與它23.4K的文件,並定時事情:

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

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

這是系統提供的命令行解壓縮二進制文件 - 毫無疑問,它可以像純C的可執行文件一樣進行精細調整和優化。然後,(清理/ tmp目錄後; - )...:

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

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

...這是用Python標準庫 - 多一點苛刻的CPU時間,但超過10%的速度實,即是,已經過去的時間。

歡迎您重複這樣的測量(在您的特定平臺上 - 如果CPU很差,例如一個慢速ARM芯片,那麼Python對CPU時間的額外要求可能最終導致速度變慢)特定的zip文件,因爲每個大的zip文件會有非常不同的組合,很可能是性能)。但是這對我而言意味着沒有太多的空間來構建Python擴展,比舊版本zipfile快得多 - 因爲使用它的Python擊敗純C,包含系統的解壓縮!)

+1

感謝您的分析,這是最有幫助的。 – Duck 2009-11-19 05:12:46

+0

@Duck,不客氣! – 2009-11-19 05:36:40

+1

也很高興看到內存使用量測量。無論如何。 – 2009-11-19 09:56:15

4

For處理大文件而不加載到內存中,請在Python 2.6的zipfile版本中使用新的基於流的方法,如ZipFile.open不要使用extractextractall除非你有強烈的消毒ZIP中的文件名。

(你曾經有read所有字節到內存中,或在其周圍砍像zipstream;這是現在已經過時)

相關問題