2013-04-22 3 views
10

Есть ли более быстрая альтернатива Zipfile-модулю Python 2.7.4 (с ZIP_DEFLATED) для zipping большого количества файлов в один ZIP-файл? Я посмотрел на czipfile https://pypi.python.org/pypi/czipfile/1.0.0, но это похоже на ускорение дешифрования (без сжатия).Более быстрая альтернатива Zipfile-модулю Python?

Мне обычно приходится обрабатывать большое количество файлов изображений (~ 12 000 файлов из файлов .exr и .tiff) с каждым файлом размером от ~ 1 МБ до 6 МБ (и ~ 9 ГБ для всех файлов) в один ZIP-файл для отправки. Этот процесс zip занимает около 90 минут для обработки (работает на Windows 7 64 бит).

Если кто-то может порекомендовать другой модуль python (или, альтернативно, библиотеку C/C++ или даже автономный инструмент), который сможет сжать большое количество файлов в один .zip-файл за меньшее время, чем модуль zipfile , что было бы очень полезно (что-то близкое к ~ 5-10% быстрее (или более) было бы очень полезно).

+2

Худший случай, вы всегда можете вызвать оболочку и выполнить что-то вроде 7zip из python – Patashu

+1

Делают ли файлы изображений, которые вы используете, уже используют версии сжатия их соответствующих форматов файлов? Если это так, вы, вероятно, тратите много времени на обработку, пытаясь сжать их снова с небольшим усилением, используя ZIP_DEFLATED вместо ZIP_STORED. Кроме того, документы для Python 2 и 3 говорят, что модуль ['zipfile'] (http://docs.python.org/2/library/zipfile.html#module-zipfile) поддерживает только дешифрование зашифрованных файлов в ZIP-архивы, не создавая их - так как именно вы это делаете? – martineau

+0

@Patashu благодарит за предложение, я дам ему попробовать и проверить производительность. Файлы должны быть .zip-файлами, иначе я бы больше экспериментировал с другими форматами упаковки. –

ответ

4

Как упоминает Паташу, аутсорсинг на 7-zip может быть лучшей идеей.

Вот некоторые примеры кода, чтобы вы начали:

import os 
import subprocess 

path_7zip = r"C:\Program Files\7-Zip\7z.exe" 
path_working = r"C:\temp" 
outfile_name = "compressed.zip" 
os.chdir(path_working) 

ret = subprocess.check_output([path_7zip, "a", "-tzip", outfile_name, "*.txt", "*.py", "-pSECRET"]) 

Как Мартино упоминалось вы можете экспериментировать с методами сжатия. This page дает несколько примеров того, как изменить параметры командной строки.

+1

Спасибо за помощь всем. Аутсорсинг для 7-zip (на подмножестве 1 Гбайт файлов .exr) ускорил время сжатия почти на 52% по сравнению с сжатием zipfile, которое действительно велико. Я по-прежнему тестировал несжатую версию, предложенную @martineau по сравнению с измененными настройками 7zip, но похоже, что решение 7zip, безусловно, будет улучшением. –

+1

@ michaelhubbard.ca: Использование 7-Zip - хороший выбор, это отличная утилита для такого рода вещей. Обратите внимание, что существует только версия командной строки, называемая '7za.exe', это всего лишь 574 КБ и все, что вам, вероятно, нужно. Кроме того, пожалуйста, добавьте комментарий где-нибудь и сообщите нам, какая разница только для хранения и сжатия. – martineau

+0

@ michaelhubbard.ca: Я забыл упомянуть, что 7-Zip также имеет очень хорошие варианты шифрования, так как вы сказали, что вас интересует этот вариант. – martineau

Смежные вопросы