Введение

Программа для сжатия данных rzip — это программа для сжатия данных большого масштаба, разработанная на основе первоначального поиска строк в стиле LZ77 с использованием словаря размером 900 МБ, за которым следует преобразование Бэрроуза-Уиллера и энтропийное кодирование (Хаффмана) на основе bzip2, применяемые к выходным блокам размером 900 кБ.

Референтная реализация

Для поиска потенциальных совпадений в таком большом наборе данных используется алгоритм вычисления скользящей контрольной суммы, основанный на алгоритме, применяемом в rsync. По мере заполнения хэш-корзин предыдущие хэши ("теги") отбрасываются в два раза реже, чем новые. Теги отбрасываются таким образом, чтобы обеспечить достаточно хорошее покрытие, при этом гранулярность поиска совпадений постепенно уменьшается с увеличением расстояния. В данной реализации не производится поиск совпадений длиной менее 31 последовательного байта.

Преимущества

Ключевое различие между rzip и другими известными алгоритмами сжатия заключается в его способности использовать избыточность на очень больших расстояниях. Хорошо известный алгоритм deflate, используемый в gzip, использует максимальный буфер истории размером 32 КиБ. Алгоритм блочной сортировки преобразования Бёрроуза — Уилера, используемый в bzip2, ограничен историей в 900 КиБ. Буфер истории в rzip может достигать 900 МиБ, что на несколько порядков больше, чем в gzip или bzip2. Rzip часто значительно быстрее, чем bzip2, несмотря на то, что использует библиотеку bzip2 в качестве бэкэнда. Это происходит потому, что rzip передает bzip2 сжатые данные, благодаря чему bzip2 требуется меньше вычислительных ресурсов. Были проведены предварительные сравнения (хотя они слишком малы, чтобы служить надежным эталоном).

Недостатки

rzip не подходит для всех задач. Два основных недостатка rzip заключаются в том, что он не поддерживает конвейерную обработку (поэтому не может читать из стандартного ввода или записывать в стандартный вывод), и в том, что он потребляет много памяти: типичное сжатие большого файла может потребовать сотни мегабайт оперативной памяти. Если имеется достаточный объем свободной оперативной памяти и требуется очень высокая степень сжатия, следует использовать rzip, но если эти условия не выполняются, вместо rzip лучше использовать альтернативные методы сжатия, такие как gzip и bzip2, которые менее требовательны к памяти. Существует как минимум один патч для включения конвейерной обработки.

История

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

rzip64

rzip64 — это расширение rzip для работы с очень большими файлами, которое позволяет использовать несколько ядер процессора параллельно. Имеются результаты тестирования производительности. Однако, наиболее важной особенностью rzip64 является возможность прерывания процесса в любой момент времени. Таким образом, запущенная задача сжатия (которая может занимать несколько часов для больших файлов) переживет даже перезагрузку системы для обслуживания, не теряя уже выполненную работу, и её можно будет возобновить позже. Формат файла rzip64 полностью совместим с оригинальным rzip.

Рекомендации

REP — альтернативная реализация алгоритма rzip, разработанная Булатом Зиганшиным и используемая в его архиваторе FreeArc в качестве предварительного процессора для алгоритмов сжатия LZMA/Tornado. В FreeArc REP обнаруживает большие совпадения на больших расстояниях, после чего LZMA сжимает оставшиеся данные. Например, на компьютере с 2 ГБ оперативной памяти REP находит совпадения длиной не менее 512 байт на расстояниях до 1 ГБ, а затем LZMA находит любые оставшиеся совпадения на расстояниях до 128 МБ. Таким образом, работая совместно, они обеспечивают наилучшее возможное сжатие при ограничении в 2 ГБ оперативной памяти. Благодаря оптимизации для потоковой декомпрессии и совместной работы с LZMA, REP имеет некоторые отличия от оригинальной реализации RZIP. Во-первых, по умолчанию он ищет только совпадения длиной 512 байт и более, поскольку тестирование показало, что это оптимальная настройка для общего сжатия REP+LZMA. Во-вторых, он использует скользящий словарь, размер которого составляет примерно половину объема оперативной памяти, что позволяет избежать повторного чтения данных из распакованного файла при декомпрессии. Преимуществом REP является его мультипликативный роллинг-хэш, который быстро вычисляется и обладает почти идеальным распределением. Увеличенная минимальная длина совпадения (512 байт против 32 байт в rzip) позволила дополнительно оптимизировать скорость, благодаря чему REP обеспечивает очень быстрое сжатие (около 200 МБ/с на Intel i3 2100).

СРЭП

SREP (SuperREP) – это реализация идеи Триджелла о LZ-компрессоре, который не хранит свой словарь в оперативной памяти, а вместо этого использует SHA1-хэши обработанных блоков для сравнения их содержимого. Это позволяет программе сжимать файлы, размер которых примерно в 10 раз превышает объем доступной оперативной памяти. Декомпрессия выполняется либо путем чтения данных из распакованной части файла, либо путем хранения в памяти будущих совпадений (алгоритм LZ-компрессии с предсказанием). Разумеется, компрессия с предсказанием LZ требует двух проходов по входному файлу, но для декомпрессии требуется незначительный объем памяти. В одном эксперименте файл размером 22 ГБ, сжатый с минимальной длиной совпадения 512 байт и полным словарем в 22 ГБ, потребовал всего 2 ГБ оперативной памяти для декомпрессии.