Рассчитать (приблизительно), если требуются расширения zip64, не полагаясь на исключения? - PullRequest
1 голос
/ 28 января 2012

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 28 января 2012

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

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

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

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

0 голосов
/ 28 января 2012

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

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

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

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

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

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

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

0 голосов
/ 28 января 2012

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

...