2009-11-18 39 views

Trả lời

13

Vì vậy, tôi đã ngẫu nhiên-ish zipfile lớn:

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

ví dụ, 116 MB với các file 23.4K trong nó, và những thứ theo thời gian:

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

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

đây là hệ thống cung cấp dòng lệnh giải nén nhị phân - không nghi ngờ gì là tinh chỉnh và tối ưu hóa như là một thực thi C thuần túy có thể được. Sau đó (sau khi dọn dẹp/tmp; -) ...:

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

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

... và đây là thư viện chuẩn của nó - đòi hỏi nhiều thời gian CPU hơn, nhưng thực tế hơn 10%, là, thời gian trôi qua. Bạn được hoan nghênh lặp lại các phép đo như vậy (trên nền tảng cụ thể của bạn - nếu nó là CPU yếu, ví dụ như chip ARM chậm, thì nhu cầu thêm của CPU về thời gian CPU của Python có thể sẽ làm chậm hơn - và zipfiles cụ thể quan tâm, vì mỗi zipfile lớn sẽ có một kết hợp rất khác nhau và hiệu suất khá có thể). Nhưng điều này gợi ý với tôi là không có nhiều không gian để xây dựng một phần mở rộng Python nhanh hơn nhiều so với số cũ zipfile - kể từ khi Python sử dụng nó đánh bại giải nén thuần túy-C, bao gồm hệ thống! -)

+1

Cảm ơn bạn đã phân tích, nó hữu ích nhất. – Duck

+0

@Duck, bạn được chào đón! –

+1

Thật tuyệt khi thấy các phép đo sử dụng bộ nhớ. +1 anyway. –

4

xử lý các tệp lớn mà không tải chúng vào bộ nhớ, sử dụng các phương pháp dựa trên luồng mới trong phiên bản zipfile của Python 2.6, chẳng hạn như ZipFile.open. Đừng sử dụng extract hoặc extractall trừ khi bạn đã khử trùng mạnh tên tệp trong ZIP.

(Bạn thường phải read tất cả các byte vào bộ nhớ, hoặc hack xung quanh nó như zipstream;. Này bây giờ đã lỗi thời)

Các vấn đề liên quan