РЕДАКТИРОВАТЬ: В частности, скорости сжатия и извлечения.
Какие-либо предложения?
Спасибо
РЕДАКТИРОВАТЬ: В частности, скорости сжатия и извлечения.
Какие-либо предложения?
Спасибо
Итак, я сделал случайный большой 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, включенную в систему!-)
Для обработки больших файлов без их загрузки в память используйте новые потоковые методы в версии zipfile
Python 2.6, такие как ZipFile.open
. Не используйте символы extract
или extractall
, если только вы не сильно исправили имена файлов в ZIP-архиве.
(Раньше приходилось read
помещать все байты в память или обходить ее, как zipstream; теперь это устарело.)
zipfile.open()
на самом деле немного быстрее, чем открытие такого же количества файлов из файловой системы (т. е. ранее извлеченных из архива .zip). Вероятно, это связано с тем, что zipfile.open()
использует уже открытый .zip и не требует накладных расходов на каталог файловой системы и операции открытия файлов. Отказ от ответственности: мне пришлось обработать много маленьких файлов со слабой степенью сжатия. YMMV с большими файлами или когда в архиве не так много файлов. Я использовал Python 3.5.3.
- person Adrian W; 08.06.2018