Перевод. Оригинал на linuxaria.
Как известно, в Linux можно использовать большое количество программ для сжатия данных. В связи с этим представляет интерес вопрос выбора наилучшего среди них. В данной статье читатель познакомится с наиболее популярными архиваторами, используемыми в GNU/Linux, а также ознакомится с результатами их сравнительного тестирования. Программы, участвующие в эксперименте - zip, gzip, bzip2 и xv. Безусловно, выбор именно этого набора является отражением субъективного мнения автора.
ZIP формат сжатия данных и архивации файлов. Архив ZIP может хранить один или несколько файлов, как в сжатом, так и в несжатом виде. Формат ZIP допускает использование нескольких алгоритмов компрессии.
Первоначально формат ZIP был разработан Филом Кацем (Phil Katz) в 1989 году и использовался в архиваторе PKZIP фирмы PKWARE. Он был создан для замены формата ARC, разработанного Томом Хендерсоном (Thom Henderson). В настоящее время формат ZIP поддерживается множеством программ для сжатия данных. Microsoft c 1998 включил в свои операционные системы встроенную поддержку ZIP (под названием "сжатые папки"). Начиная с версии 10.3 встроенную поддержку ZIP имеет и Mac OS X.
GNU GZIP - популярная программа для сжатия файлов для систем UNIX. Была создана Жан-лу Галли(Jean-loup Gailly) и Марком Адлером (Mark Adler) для проекта GNU с как бесплатная альтернатива ранее применявшимся в Unix-системах архиваторам. Версия 0.1 была впервые выпущена 31 октября 1992 года, а версия 1.0 — в феврале 1993 года.
gzip использует алгоритм DEFLATE, представляющий собой комбинацию алгоритма LZ77 и алгоритма Хаффмана. DEFLATE позиционировался как замена LZW и других алгоритмов сжатия, защищенных патентами.
В соответствии с традициями UNIX-программирования, gzip выполняет только одну функцию: сжатие и распаковка одного файла, он не умеет упаковывать несколько файлов в один архив. При сжатии к оригинальному расширению файла добавляется суффикс .gz. Для упаковки нескольких файлов обычно их сначала архивируют в один файл утилитой tar, а потом этот файл сжимают gzip. Таким образом, сжатые архивы обычно имеют двойное расширение .tar.gz или сокращённое .tgz.
BZIP2 - бесплатная свободная программа и алгоритм с открытым исходным кодом для сжатия данных. Разработана и впервые опубликована Джулианом Сьюардом (Julian Seward) в июле 1996 (версия 0.15). Стабильность и популярность компрессора росли в течение нескольких лет, и версия 1.0 была опубликована в конце 2000 года.
Сжатие с помощью bzip2 как правило более эффективно, чем с помощью более старых алгоритмов, таких как LZW (.Z) или Deflate (.zip и .gz), но требует больших затрат времени. Алгоритм LZMA в целом более эффективен, чем bzip2, обеспечивая намного большую скорость распаковки.
bzip2 сжимает данные в блоки размером от 100 до 900 кб и использует преобразование Барроуза-Уилера (Burrows-Wheeler transform) для превращения последовательностей многократно чередующихся символов в строки одинаковых символов. Затем применяется преобразование MTF (move-to-front), и в конце кодирование Хаффмана. В предшественнике bzip2, программе bzip, использовалось арифметическое кодирование, однако от него отказались из‑за патентных ограничений.
Чтобы ускорить работу программы, в 2003 году была разработана ее модифицированная версия - pbzip2, поддерживающее многопоточное сжатие, в результате чего удалось добиться практически линейного увеличения скорости упаковки при работе на многопроцессорных и многоядерных системах.
XZ Utils - это набор свободных программ для архивации данных с высокой степенью сжатия. Изначально XZ Utils были предназначены для POSIX совместимых систем, но работают и на некоторых других. Предшественником XZ Utils были LZMA Utils.
Ядро кода для сжатия данных XZ Utils базировалось на LZMA SDK, но позже было значительно модифицировано. В настоящее время первичная компрессия данных осуществляется с помощью алгоритма LZMA2, после чего сжатые данные помещаются в контейнер .xz. При работе с типичными файлами XZ Utils позволяет получить размер архива на 30% меньше, чем gzip и на 15% меньше, чем bzip2.
XZ Utils включают несколько компонент:
* liblzma - библиотека компрессии данных с API, похожим на zlib;
* xv - утилита командной строки с синтаксисом, аналогичным gzip;
* xzdec - утилита, предназначенная только для распаковки и за счет этого меньшая по размеру, чем xv;
* набор скриптов оболочки (xzgrep, xzdiff и т.д.), адаптированных из gzip и предназначенных для упрощения просмотра и сравнения упакованных файлов.
* эмуляция инструментов командной строки LZMA Utils облегчает переход с LZMA Utils на XZ Utils
Сравнительное тестирование
При проведении тестов я всегда использовал базовую команду для сжатия без всяких опций. То есть, если я архивировал файл "filename", команды выглядели так:
zip filename.zip filename
gzip filename
bzip2 filename
xz filename
1. Текст
Первоначально в тестировании использовался файл библии на английском языке (bbe), размер которого в несжатом виде составлял 4467663 байт (4 Мб).
Результаты архивации:
4467663 bbe
1282842 bbe.zip
1282708 bbe.gz
938552 bbe.xz
879807 bbe.bz2
1282842 bbe.zip
1282708 bbe.gz
938552 bbe.xz
879807 bbe.bz2
При сжатии большого тестового файла, размером 41 Мб, результаты следующие:
41Mб big2.txt
15Mб big2.txt.zip
15Mб big2.txt.gz
11Mб big2.txt.bz2
3.6Mб big2.txt.xz
15Mб big2.txt.zip
15Mб big2.txt.gz
11Mб big2.txt.bz2
3.6Mб big2.txt.xz
Другой большой текстовый файл (64 Мб):
64M 65427K big3.txt
26M 25763K big3.txt.zip
26M 25763K big3.txt.gz
24M 23816K big3.txt.bz2
2.2M 2237K big3.txt.xz
26M 25763K big3.txt.zip
26M 25763K big3.txt.gz
24M 23816K big3.txt.bz2
2.2M 2237K big3.txt.xz
Далее я использовал флаг -9 (максимальная степень сжатия):
zip -9 big3.txt.zip big3.txt
gzip -9 -c big3.txt >> big3.txt.gz
bzip2 -9 -c big3.txt >> big3.txt.bz2
xz -e -9 -c big3.txt >> big3.txt.xz
gzip -9 -c big3.txt >> big3.txt.gz
bzip2 -9 -c big3.txt >> big3.txt.bz2
xz -e -9 -c big3.txt >> big3.txt.xz
И получил следующие результаты:
64M 65427K big3.txt
25M 25590K big3.txt.zip
25M 25590K big3.txt.gz
24M 23816K big3.txt.bz2
2.2M 2218K big3.txt.xz
25M 25590K big3.txt.zip
25M 25590K big3.txt.gz
24M 23816K big3.txt.bz2
2.2M 2218K big3.txt.xz
2. Видео
Для теста я взял файл в формате AVI размером 700 Мб, кодированный с помощью XviD. Степень сжатия получилась (как и ожидалось) низкой:
700 MB file.avi
694 MB file.avi.zip
694 MB file.avi.gz
694 MB file.avi.xz
693 MB file.avi.bz2
694 MB file.avi.zip
694 MB file.avi.gz
694 MB file.avi.xz
693 MB file.avi.bz2
Кроме того, для получения более полной картины я включил результаты тестирования, полученные с другого сайта. В данном случае набор файлов для теста включал:
- бинарные файлы из директории /usr/bin общим объемом 6092800 байт;
- тестовые файлы, позаимствованные из исходных текстов ядра /usr/src/linux-headers-2.6.28-15;
- случайная выборка MP3-файлов общим объемом 191283200 байт;
- случайная выборка фотографий в формате JPEG объемом 266803200 байт;
- видео в формате MPEG объемом 432240640 байт;
- видео в формате AVI объемом 734627840 байт.
Файлы каждой категории перед сжатием были помещены в архив tar. Каждый тест запускался из скрипта 10 раз и в качестве конечного результата бралось среднее значение.
Результаты тестов:
Выводы
Основываясь на результатах вышеприведенных тестов, я бы мог порекомендовать использовать LZMA (aka XZ), который, хотя и работает немного медленнее, и потребляет больше ресурсов, но зато обеспечивает наилучшее сжатие при работе с текстовыми файлами, которые и являются основными объектами для архиваторов.
Кроме того, он полностью интегрирован с tar (опция J) и может быть легко интегрирован с logrotate. С другой стороны, если решающее значение имеет время или процессорные ресурсы, можно спокойно использовать gzip.
Комментариев нет:
Отправить комментарий