Библиотека сайта rus-linux.net
Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
Новые возможности в мире сжатия файлов
Оригинал: New Options in the World of File CompressionАвтор: Брайан Линдхольм (Brian Lindholm)
Дата: май 2009 г.
Перевод: Сергей Супрунов
Дата перевода: 05 июня 2009 г.
Вначале был compress. Люди использовали его для своих файлов, и это было хорошо. Их файлы становились меньше, и на пластину диска можно было втолкать больше данных, чем когда-либо. И многие испытывали восторг от LZW-сжатия.
В 1992 году появилось кое-что получше: gzip. Он использовал иной алгоритм сжатия (LZ77 плюс кодирование Хаффмана), который выдавал ещё меньшие файлы. В качестве бонуса, он был свободен от алгоритмов, отягощённых какими-либо патентами. Народные массы стали ещё счастливее, поскольку они могли затолкать в свою систему ещё больше данных, и при этом не нужно было делать никаких отчислений по патентам.
В 1996 году Джулиан Сьюард (Julian Seward) создал bzip2, который использовал комбинацию преобразования Барроуза-Уилера (Burrows-Wheeler Transform, BWT) и других методов сжатия, достигая ещё лучших результатов, чем gzip. Ему требовался более мощный процессор и больше памяти, но учитывая постоянно возрастающие возможности компьютеров, со временем это перестало быть серьёзной проблемой.
Долгие годы gzip и bzip2 оставались стандартом де-факто в области сжатия в мире свободного ПО: gzip использовался для задач, чувствительных ко времени выполнения, а bzip2 - там, где хотелось получить максимальную степень сжатия.
Однако в 2000 году появилось кое-что новое. Игорь Павлов выпустил программу под названием 7-Zip, особенностью которой был новый алгоритм - LZMA. Этот алгоритм обеспечивал очень высокую степень сжатия, хотя и требовал очень много памяти и процессорного времени.
К сожалению, две проблемы делали 7-Zip далёким от идеала для пользователей Linux/BSD/Unix. Первая - он был разработан для Microsoft Windows. Как это ни печально... Эта проблема, к счастью, потеряла актуальность в 2004 году с выходом кросс-платформенного порта p7zip. Вторая же заключалась в том, что 7-Zip (и p7zip) использовали свой формат файла - 7z. По функциональности этот формат многофайлового архива был похож на zip. К сожалению, из-за своих Windows-корней, формат 7z не поддерживал информацию о правах доступа в Unix-стиле, информацию о пользователях и группах, списки контроля доступа (ACL) и так далее. Эти ограничения серьёзно мешали выполнять резервное копирование на многопользовательских системах.
Затем, в 2004 году, Игорь Павлов выпустил пакет разработчика LZMA SDK (Software Development Kit). Хотя он предназначался авторам приложений, этот пакет также содержал небольшой самородок - утилиту командной строки lzma_alone. Её можно было использовать для создания lzma-файлов точно так же, как gzip и bzip2. В комбинации с tar она обеспечивала превосходное сжатие файлов при полной совместимости с Unix.
Менее чем через год после выхода LZMA SDK Лэсс Коллин (Lasse Collin) выпустил пакет LZMA Utils. Первоначально это был набор скриптов-обёрток к lzma_alone, который обслуживался утилитой lzma (с опциями командной строки, очень похожими на используемые программами gzip и bzip2, вместо менее распространённых опций в стиле p7zip, используемых утилитой lzma_alone). Позднее lzma была полностью переписана на Си. Затем, в 2009 году, Лэсс Коллин выпустил XZ Utils, основной утилитой которого была xz. Эта новая утилита продолжила использовать сжатие LZMA, но вместо генерации сырого потока LZMA-данных она "оформляла" результирующий поток данных в хорошо продуманный файловый формат, содержащий различные "магические байты" [magic bytes, фиксированные последовательности байтов в начале и конце файла, предназначенные для определения его типа и завершённости - прим.перев.], флаги потока [stream flags, два байта в заголовке, зарезервированные для изменения различных свойств потока; в настоящее время используются только для выбора алгоритма CRC - прим.перев.] и проверки контрольной суммы (CRC). Так был рождён формат файлов xz.
В 2008 году Антонио Диас (Antonio Diaz) выпустил подобную утилиту, названную lzip. Как и xz, она использует алгоритм LZMA, но создаёт файлы формата lz. Этот формат отличается некоторыми деталями, но в целом имеет много общего с файлами xz - "магические байты", CRC и т.п. Кроме того, lzip умеет создавать файлы, содержащие несколько членов [при повреждении архива все неповреждённые члены могут быть восстановлены - прим.перев.], и разбивать вывод на несколько томов заданного размера.
На момент подготовки этой статьи существовало четыре утилиты командной строки (и три формата файлов), которые используют LZMA, демонстрируя превосходные результаты сжатия файлов: lzma_alone Игоря Павлова, lzma и xz Лэсса Коллина и lzip Антонио Диаса. Значит ли это, что мы на пороге войны форматов, как это в своё время случилось с VHS и Betamax [форматы аналоговых видеокассет - прим.перев.]? Трудно сказать. (К счастью, в данном случае вы не ограничены возможностью использовать что-то одно. Это всего лишь утилиты, а не видеомагнитофоны. На вашем жёстком диске достаточно места, чтобы вместить их все. У меня есть все четыре.)
Сам я предпочитаю lzma_alone, поскольку она сопровождается человеком, который и изобрёл алгоритм LZMA, а потому понимает его лучше всех. Однако этот формат файла предоставляет минимум возможностей, в то время как xz и lzip предлагают значительные преимущества за счёт "магических байтов" и проверки целостности данных. Кроме того, lzma_alone сложно компилировать, и к ней нет man-страницы. XZ Utils компилировать проще всего (поскольку используется современный скрипт настройки на основе autotools), но ему в настоящее время недостаёт man-страницы для основных утилит xz и lzma. Lzip занимает промежуточное положение. Он требует некоторых ручных манипуляций, чтобы выставить нужные флаги компиляции, но зато оснащён замечательной man-страницей.
Когда-нибудь одна из этих утилит может занять доминирующее положение в области LZMA-сжатия, но на сегодняшний день вы можете встретить "в дикой природе" все три формата файлов. Я с этим знаком не по наслышке.
Как же эти утилиты сравнивать, если не по степени сжатия? Как показывает результат, между ними есть небольшая разница. Ниже приводится итоговая таблица, показывающая, как lzma_alone, xz, lzip, bzip2, gzip и compress обрабатывают tar-архив исходных кодов ghostscript-8.64. (Я исключил из сравнения lzma Лэсса Коллина, поскольку сейчас это просто символическая ссылка на xz.) Конкретные версии: lzma_alone-4.65, xz-4.999.8beta, lzip-1.5, bzip2-1.0.5, gzip-1.3.12 и ncompress-4.2.4.2.
gs.tar | 65 003 520 байт | (исходный файл) |
gs.tar.lzma | 12 751 330 байт | (159,05 с сжатие, 1,48 с распаковка) |
gs.tar.xz | 12 768 488 байт | (155,17 с сжатие, 1,54 с распаковка) |
gs.tar.lz | 12 804 165 байт | (161,12 с сжатие, 1,97 с распаковка) |
gs.tar.bz2 | 16 921 504 байт | (14,72 с сжатие, 3,45 с распаковка) |
gs.tar.gz | 19 336 239 байт | (7,31 с сжатие, 0,63 с распаковка) |
gs.tar.Z | 29 467 629 байт | (2,39 с сжатие, 0,78 с распаковка) |
Результаты сжатия, продемонстрированные тремя LZMA-утилитами, очень близки, lzma_alone опередила остальные совсем на чуть-чуть. Все три отработали лучше, чем bzip2, gzip и compress, хотя и гораздо медленнее. Распаковка lzip была на 30% медленнее, чем у оставшихся двух утилит на основе LZMA, но она всё равно заметно быстрее, чем bzip2.
Как же воспользоваться преимуществами, предоставляемыми этими новыми утилитами? Ну, если вам повезёт, для вашего дистрибутива будет доступна одна из них или несколько в виде прекомпилированных пакетов. Я работаю на Debian (Lenny) 5.0, для которого есть lzma_alone и ранняя версия пакета LZMA Utils Лэсса Коллина (который содержит lzma, но xz отсутствует). Утилиты, не предоставляемые вашим дистрибутивом, вы можете скачать в виде исходного кода и собрать самостоятельно. Ниже приведены ссылки на три основные программы:
lzma_alone - http://www.7-zip.org/sdk.html
xz и lzma - http://tukaani.org/xz/
lzip - http://www.nongnu.org/lzip/lzip.html
Для тех, кто хочет собрать lzma_alone, я советую этот tar-архив: lzma_alone_patches.tar.bz2, содержащий минимальный набор патчей, инструкции по сборке и man-страницу. Для его использования вам всё равно нужно скачать исходный LZMA SDK с упомянутого выше сайта. Что касается XZ Utils и Lzip, то там сборка и установка выполняется довольно просто.
Как можно преобразовать существующие архивы из одного формата сжатия в другой? Конечно же, с помощью конвейеров Unix. Ниже приведено несколько примеров:
gzip -c -d source.tar.gz | lzma_alone e -si source.tar.lzma bzip2 -c -d source.tar.bz2 | lzma -c > source.tar.lzma gzip -c -d source.tar.gz | xz -c > source.tar.xz bzip2 -c -d source.tar.bz2 | lzip -c > source.tar.lz
А так эти предельно компактные файлы можно распаковать:
lzma_alone d source.tar.lzma -so | tar -xvf - tar --use-compress-program=lzma -xvf source.tar.lzma tar --use-compress-program=xz -xvf source.tar.xz tar --use-compress-program=lzip -xvf source.tar.lz
Те, кому нужно преобразовать много архивов, могут скачать и установить пакет
littleutils. Этот пакет содержит три скрипта (to-lzma, to-xz и to-lzip), которые преобразуют сразу несколько файлов, сжатых gzip или bzip2, в формат lzma, xz или lz соответственно. Опция -k
особенно полезна, поскольку позволяет удалять исходный файл только в том случае, если новый получается меньшего размера. Иначе исходный файл сохраняется. Чтобы преобразовать все gzip- и bzip2-архивы текущего каталога в формат lzma, просто выполните следующую команду:
to-lzma -k *.tar.gz *.tar.bz2
После такой бесстыдной рекламы моих собственных программ, я завершу эту статью призывом к читателям начать использовать хотя бы одну из утилит, основанных на алгоритме LZMA. Особенно если вы распространяете сжатые tar-архивы. Файлы, сжатые с помощью алгоритма LZMA, требуют меньше времени на загрузку и меньше времени на распаковку (по крайней мере, по сравнению с bzip2). Даже в мире широкополосных интернет-подключений, сверхпроизводительных процессоров и необозримых жёстких дисков, эти утилиты позволят более рационально использовать время и пространство.
Об авторе
Брайан Линдхольм - выпускник Вирджинского Университета, инженер-механик в самом расцвете сил, начавший программировать на Бейсике на TRS-80 Model I (в далёком 1980 году). В конце восьмидесятых он перешёл на Паскаль и Си на IBM-совместимых машинах.
Все эти годы Брайана сильно раздражала нестабильность и дороговизна различных операционных систем от Microsoft. В особенности его бесило отсутствие полного контроля над системой. Но ему страшно повезло, что его сосед по комнате в институтской общаге использовал Linux (то были давние времена Linux 0.9 и Slackware 1.0). Это знакомство дало ему всё, чего ему не хватало.
Год за годом, медленно постигал он всё больше и больше, и теперь способен поддерживать эффективную и стабильную работу своей системы Debian (даже спустя четыре крупных обновления: с 2.2 на 3.0, затем на 3.1, 4.0 и, наконец, 5.0). [Важное замечание: его Debian никогда не "падал" сам по себе. НИКОГДА. Только из-за проблем с питанием, попыток загрузки с неправильного раздела, ошибочных нажатий на клавишу Reset, пиратских DVD и особенно из-за "психованного" IDE Zip-привода.] Он обожает vim и находит Perl весьма полезным в работе.
В свободное от Linux время Брайан, чтобы не умереть с голода, проектирует электрогенераторы (оборудование для больших электростанций), от случая к случаю записывает живую музыку, читает научную фантастику и старается почаще выбираться на "Аппалачскую тропу" [популярный туристический маршрут - прим.перев.].