Какие форматы сжатия / архивирования поддерживают межфайловое сжатие? - PullRequest
3 голосов
/ 05 ноября 2008

Этот вопрос об архивировании PDF заставил меня задуматься - если я захочу сжать (для архивных целей) множество файлов, которые представляют собой небольшие изменения, внесенные поверх основного шаблона (бланка), Похоже, что при сжатии между файлами можно получить огромный выигрыш от сжатия.

Поддерживает ли это какой-либо из стандартных форматов сжатия / архивирования? AFAIK, все популярные форматы фокусируются на сжатии каждого отдельного файла.

Ответы [ 3 ]

5 голосов
/ 05 ноября 2008

Несколько форматов выполняют межфайловое сжатие.

Самый старый пример - .tar.gz; .tar не имеет сжатия, но объединяет все файлы вместе с заголовками перед каждым файлом, а .gz может сжимать только один файл. Оба применяются последовательно, и это традиционный формат в мире Unix. .tar.bz2 тоже самое, только с bzip2 вместо gzip.

Более свежими примерами являются форматы с необязательным «сплошным» сжатием (например, RAR и 7-Zip), которые могут внутренне объединять все файлы перед сжатием, если это разрешено флагом командной строки или параметром GUI.

3 голосов
/ 05 ноября 2008

Взгляните на google open-vcdiff.

http://code.google.com/p/open-vcdiff/

Предназначен для расчета небольших сжатых дельт и реализует RFC 3284.

http://www.ietf.org/rfc/rfc3284.txt

У Microsoft есть API для выполнения чего-то подобного, без какой-либо видимости стандарта.

В общем, вы ищете алгоритмы, основанные на Bentley / McIlroy:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.11.8470

В частности, эти алгоритмы будут выиграны, если размер шаблона больше размера окна (~ 32k), используемого gzip, или размера блока (100-900k), используемого bzip2.

Они используются Google внутри их реализации BIGTABLE для хранения сжатых веб-страниц по той же причине, по которой вы их ищете.

2 голосов
/ 05 ноября 2008

Поскольку сжатие LZW (которое в значительной степени используют все они) включает в себя создание таблицы повторяющихся символов по мере продвижения, например, схема, которую вы хотите, ограничивает необходимость распаковывать весь архив сразу.

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

...