Какой лучший Zip-модуль Python для обработки больших файлов?

РЕДАКТИРОВАТЬ: В частности, скорости сжатия и извлечения.

Какие-либо предложения?

Спасибо


person Duck    schedule 18.11.2009    source источник
comment
Вы сравнивали производительность zipfile с производительностью zip/unzip непосредственно в оболочке?   -  person John La Rooy    schedule 19.11.2009


Ответы (2)


Итак, я сделал случайный большой zip-файл:

$ 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 МБ с 23,4 КБ файлов в нем и временными вещами:

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

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

это поставляемый системой двоичный файл командной строки unzip - без сомнения, настолько тонко настроенный и оптимизированный, насколько может быть исполняемый файл на чистом 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 с его стандартной библиотекой - чуть более требовательный к процессорному времени, но более чем на 10% быстрее реального, то есть истекшего времени.

Конечно, вы можете повторить такие измерения (на вашей конкретной платформе — если у нее мало процессорного времени, например, медленный чип ARM, то дополнительные требования Python к процессорному времени могут в конечном итоге сделать его медленнее — и ваши конкретные интересующие zip-файлы , так как каждый большой zip-файл будет иметь разный состав и, вполне возможно, производительность). Но это говорит мне о том, что не так много места для создания расширения Python намного быстрее, чем старый добрый zipfile, поскольку Python, использующий его, превосходит распаковку на чистом C, включенную в систему!-)

person Alex Martelli    schedule 19.11.2009
comment
Спасибо за ваш анализ, это было очень полезно. - person Duck; 19.11.2009
comment
Было бы неплохо увидеть измерения использования памяти. +1 в любом случае. - person Denis Otkidach; 19.11.2009
comment
По-видимому, ваш пробег может отличаться... dmarkey.com/ wordpress/2011/10/15/python-zipfile-speedup-tips - person MarioVilas; 10.10.2013

Для обработки больших файлов без их загрузки в память используйте новые потоковые методы в версии zipfile Python 2.6, такие как ZipFile.open. Не используйте символы extract или extractall, если только вы не сильно исправили имена файлов в ZIP-архиве.

(Раньше приходилось read помещать все байты в память или обходить ее, как zipstream; теперь это устарело.)

person bobince    schedule 19.11.2009
comment
Я обнаружил, что открытие сжатого содержимого на лету с помощью zipfile.open() на самом деле немного быстрее, чем открытие такого же количества файлов из файловой системы (т. е. ранее извлеченных из архива .zip). Вероятно, это связано с тем, что zipfile.open() использует уже открытый .zip и не требует накладных расходов на каталог файловой системы и операции открытия файлов. Отказ от ответственности: мне пришлось обработать много маленьких файлов со слабой степенью сжатия. YMMV с большими файлами или когда в архиве не так много файлов. Я использовал Python 3.5.3. - person Adrian W; 08.06.2018