Рассчитать (приблизительно), требуются ли расширения zip64, не полагаясь на исключения?

У меня есть следующие требования (от клиента) для архивирования ряда файлов.

Если созданный zip-файл меньше 2**31-1 ~2 ГБ, используйте сжатие для его создания (используйте zipfile.ZIP_DEFLATED), в противном случае не сжимайте его (используйте zipfile.ZIP_STORED).

Текущее решение состоит в том, чтобы сжать файл без zip64 и перехватить исключение zipfile.LargeZipFile, чтобы затем создать несжатую версию.

Мой вопрос заключается в том, стоит ли пытаться рассчитать (приблизительно), превысит ли zip-файл размер zip64 без фактической обработки всех файлов, и как лучше всего это сделать? Процесс архивирования таких больших объемов данных медленный, и сведение к минимуму обработки дублирующего сжатия может немного ускорить его.

Изменить: я бы поддержал оба решения, так как думаю, что могу создать полезную эвристику из комбинации максимального и минимального размеров файлов и коэффициентов сжатия. К сожалению, в настоящее время StackOverflow не позволяет мне голосовать за что-либо (пока у меня не будет репутации выше нуба). Спасибо за хорошие предложения.


person michaelhubbard.ca    schedule 28.01.2012    source источник
comment
Итак, вы говорите, что требование таково: если размер файла в заархивированном виде составляет › 2 ГБ, то не заархивируйте его? Звучит как странное требование. Наверняка его все же стоит заархивировать, так как он будет меньше и займет меньше времени на копирование/передачу?   -  person Mitch Wheat    schedule 28.01.2012
comment
Почему бы просто не оценить соотношение на лету? Произвольно выберите несколько фрагментов из файла/файлов, попробуйте заархивировать их и посмотрите, как выглядит степень сжатия. Пока ваши выборки намного меньше, чем G, и вы не всегда находитесь прямо на границе результирующего размера 2G, вы, вероятно, получите большую часть достижимых преимуществ без особых усилий.   -  person DSM    schedule 28.01.2012
comment
@MitchWheat, потому что тот, кто находится на принимающей стороне, не знает, как обращаться с zip64?   -  person MK.    schedule 28.01.2012
comment
@MitchWheat, да, я не уверен в специфике принимающей стороны, но подозреваю, что с этим конкретным клиентом существуют устаревшие проблемы (согласно требованиям).   -  person michaelhubbard.ca    schedule 28.01.2012


Ответы (3)


Единственный известный мне способ оценить размер zip-файла — посмотреть коэффициенты сжатия для ранее сжатых файлов аналогичного характера.

person Raymond Hettinger    schedule 28.01.2012
comment
Спасибо, я думаю, что это хорошая идея в сочетании с @Gus для создания эвристической наилучшей оценки размеров файлов, которую также можно использовать для решения этой проблемы. - person michaelhubbard.ca; 28.01.2012

Я могу придумать только два способа: один простой, но требующий ручной настройки, а другой может не дать достаточных преимуществ, чтобы оправдать его сложность.

  1. Определите размер файла, при котором вы просто пропустите попытку zip, и настройте его вручную.

  2. Ведите учет последних N файлов между самым маленьким сбоем при архивировании и самым большим удачным архивированием. Решите, какова приемлемая вероятность неправильного выбора, приводящего к тому, что файл, который должен быть заархивирован, не будет заархивирован (скажем, 5%). установите порог «не пытаться заархивировать» таким образом, чтобы это привело к тому проценту файлов, которые были бы ошибочно оставлены разархивированными.

Если вы абсолютно никогда не можете упустить возможность заархивировать файл, который должен был быть заархивирован, то у вас уже есть решение.

person Gus    schedule 28.01.2012
comment
Спасибо за ответ, в этом конкретном случае эвристика не должна быть идеальной, поэтому настройка чего-то, что пропускает в зависимости от размера файла, и проверка некоторых предыдущих коэффициентов сжатия, как предложил @Raymond Hettinger с записями, вероятно, создаст очень хорошее решение. . - person michaelhubbard.ca; 28.01.2012

Эвристический подход всегда будет включать некоторые ложноположительные и некоторые ложноотрицательные результаты.

Конечный размер заархивированного файла будет зависеть от ряда факторов, некоторые из которых невозможно узнать без запуска самого процесса сжатия.

Zip64 позволяет использовать множество различных форматов сжатия, таких как bzip2, LZMA и т. д. Даже формат сжатия может выполнять сжатие по-разному в зависимости от сжимаемых данных. Например, bzip2 может использовать Burrows-Wheeler, кодирование длин серий и Хаффмана среди других. Конечный размер файла будет зависеть от статистических свойств сжимаемых данных.

Возьмем, к примеру, Хаффмана; размер таблицы символов зависит от того, насколько случайно распределено содержимое файла.

Можно продолжить и попытаться профилировать различные типы данных, сериализованные двоичные файлы, текст, изображения и т. д., и каждый из них будет иметь другое нормальное распределение конечного размера заархивированного файла.

Если вам действительно нужно сэкономить время, выполнив процесс только один раз, помимо создания очень большой базы данных и использования экспертной системы, основанной на правилах или на основе теоремы Байеса, реального стопроцентного подхода к этой проблеме не существует.

Вы также можете попробовать сэмплировать блоки файла через случайные промежутки времени и сжимать этот сэмпл, а затем линейно интерполировать в зависимости от размера файла.

person ose    schedule 28.01.2012