воскресенье, 6 февраля 2011 г.

Архиваторы в Linux. Сравнительное тестирование

Перевод. Оригинал на 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

При сжатии большого тестового файла, размером 41 Мб, результаты следующие:
41Mб big2.txt
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

Далее я использовал флаг -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

И получил следующие результаты:
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


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

Кроме того, для получения более полной картины я включил результаты тестирования, полученные с другого сайта. В данном случае набор файлов для теста включал:
- бинарные файлы из директории /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.

Комментариев нет:

Отправить комментарий