В чем разница между различными системами сжатия?


9

Я всегда использовал TAR и ZIP для сжатия, но недавно я услышал об *.Zалгоритме сжатия. Это подняло вопрос для меня:

Со всеми этими системами сжатия, какая из них лучше всего подходит для общего использования и сжатия?

Выполнив несколько тестов, я обнаружил, что tar, как я обнаружил, на самом деле НЕ сжимается (если не указано явно). То есть, чем это хорошо по сравнению с другими методами сжатия?

Я уже знал , что ZIP является наиболее широко используемой системой сжатия, но я должен использовать это вместо того , чтобы *.Z, *.7z, .tarили .tar.<insert ending here>?

Сообщение Резюме:

  1. Должен ли я использовать *.tar, *.Z, *.7z, .tar, или .tar.<insert ending here>для лучшего сжатия?
  2. Если обычный *.tarфайл не сжимается, зачем мы его используем?

РЕДАКТИРОВАТЬ: Не все алгоритмы позволяют хранить разрешения Linux (из того, что я узнал). Что делать, и есть ли какой-нибудь взлом (или скрипт), который я мог бы использовать для хранения разрешений?


Нет необходимости говорить такие вещи, просто выберите один из тех, за кого проголосовали, или тот, который вы считаете наиболее полезным :)
Сет

Ответы:


17

tarвыступает за ленточный архив. Все, что он делает - это упаковывает файлы и их метаданные (права доступа, владельца и т. Д.) В поток байтов, который можно сохранить на ленточном накопителе (или в файле) и восстановить позже. Сжатие - это совершенно отдельный вопрос, который вы привыкли передавать по конвейеру через внешнюю утилиту для сжатия, если хотите. GNU tar был достаточно хорош, чтобы добавить переключатели, чтобы он автоматически фильтровал вывод через соответствующую утилиту в качестве ярлыка.

Zip и 7z объединяют архивирование и сжатие вместе в свой собственный контейнерный формат, и они предназначены для упаковки файлов в системе DOS / Windows, поэтому они не хранят разрешения и владение Unix. Таким образом, если вы хотите хранить разрешения для правильного резервного копирования, вам нужно придерживаться tar. Если вы планируете обмениваться файлами с пользователями Windows, тогда zip или 7z - это хорошо. Фактические алгоритмы сжатия zip и 7zip могут использоваться с tar, используя uzing gzipи lzmaсоответственно.

lzma (aka. * .xz) имеет один из лучших коэффициентов сжатия и довольно быстро распаковывает файлы, что делает его лучшим выбором в наши дни. Однако для сжатия требуется тонна оперативной памяти и процессорного времени. Преподобный gzipнемного быстрее при сжатии, поэтому может быть использован, если вы не хотите посвящать так много процессорного времени. У этого также есть еще более быстрый вариант, названный lzop. bzip2все еще довольно популярен, так как он в значительной степени заменил gzip некоторое время до появления 7zip / lzma, так как он получил лучшие коэффициенты сжатия, но в наши дни он не пользуется популярностью, так как 7z / lzma быстрее при распаковке и получает лучшие коэффициенты сжатия. compressУтилита, которая обычно имена файлов * .Z, древний и давно забыли.

Одно из других важных различий между zip и tar состоит в том, что zip сжимает данные небольшими порциями, тогда как при сжатии файла tar вы сжимаете все это сразу. Последний дает лучшие коэффициенты сжатия, но чтобы извлечь один файл в конце архива, вы должны распаковать все это, чтобы добраться до него. Таким образом, формат zip лучше при извлечении одного или двух файлов из большого архива. 7z и darпозволяют выбрать сжатие всего объекта (называемого «твердым» режимом) или небольших кусков для легкого извлечения по частям.


Но только TAR поддерживает метаданные? Или gzip / bzip2 также теперь поддерживает метаданные
Kaz Wolfe

@pacificfils, утилиты сжатия сжимают только один файл без метаданных.
Псуси

Можно ли скопировать папку, а затем поместить ее в zip-файл и сохранить права доступа?
Каз Вулф

@pacificfils, да, но это было бы немного глупо, поскольку вы отказались бы от преимуществ zip и лучшей степени сжатия gzip.
psusi

@pacificfils tar cfpсохранит разрешения. Файл tar распакован, поэтому zip (7-zip), gzip2, gzip, lzo и т. Д. Будут хорошо сжимать файл tar (в общем, архив сжатых файлов вряд ли будет сжимаемым).
Эллиотт Фриш

9

Детали алгоритмов здесь не по теме 1, так как они никак не связаны с Linux, не говоря уже об Ubuntu. Однако, вы найдете здесь полезную информацию .

Теперь tar, как вы сказали, tarпрограмма сжатия не является и никогда не была. Вместо этого это архиватор ; его основная цель - сделать один большой файл из множества маленьких. Исторически это облегчало хранение на ленточных накопителях, отсюда и название: Tape ARchive.

Сегодня основной причиной использования tarявляется уменьшение количества файлов в вашей системе. Каждый файл в файловой системе Unix занимает инод , чем больше у вас файлов, тем меньше доступных инодов, и когда у вас заканчиваются иноды, вы больше не можете создавать новые файлы. Проще говоря, тот же объем данных, который хранится в тысячах файлов, займет больше вашего жесткого диска, чем те же файлы в одном архиве tar.

Чтобы проиллюстрировать это, поскольку это оспаривалось в комментариях, на моем /разделе 68G у меня есть следующее количество общих и используемых инодов (имейте в виду, что число инодов зависит от типа файловой системы и размера раздела):

Inode count:              393216
Free inodes:              171421

Если я сейчас попытаюсь создать больше файлов, чем у меня есть inode:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

Нет места? Но у меня есть много места:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

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

Наличие меньшего количества файлов также значительно ускоряет ввод-вывод файловой системы, особенно в смонтированных файловых системах NFS. Я всегда сохраняю свои старые рабочие каталоги, когда проект закончен, поскольку чем меньше у меня файлов, тем быстрее findбудут работать подобные программы .

На Super User есть отличный ответ, в который tarвходят гораздо более подробные сведения, но в дополнение к вышесказанному есть и другие основные причины, по-прежнему популярные сегодня:

  1. Эффективность: использование tarдля конвейерной передачи подобной программы сжатия gzipболее эффективно, поскольку позволяет избежать создания промежуточных файлов.

  2. tar поставляется со всевозможными наворотами, функциями, которые были разработаны в течение его долгой истории, что делает его особенно полезным для * nix-резервных копий (разрешения на размышления, владение файлами, возможность передавать данные прямо в STDOUT и по каналу SSH ... )

  3. Инерция. Мы привыкли tar. Можно с уверенностью предположить, что он будет доступен на любом * nix, который вы можете использовать, что делает его очень переносимым и удобным для архивов исходного кода.


1 Это абсолютно верно и не имеет ничего общего с тем, что я недостаточно знаю о них, чтобы объяснить :)


3
На моем компьютере было (в прошлом) более 10 000 000 файлов, и это не так уж и безумно. Я никогда не использую tar«для уменьшения количества файлов», поскольку, честно говоря, большинству файловых систем это безразлично, и в любом случае это не совсем оптимально, поскольку tarне поддерживает простой произвольный доступ к файлам. Скорее, основное использование (для меня и большинства людей) - это простой обмен файлами (например, исходным кодом) с другими людьми.
nneonneo

@nneonneo Вам когда-нибудь приходилось работать с миллионами файлов в одном каталоге? У меня есть, и поверьте мне, это не легко. Помимо очевидных проблем ARG_MAX, это может затруднить работу с вашими файлами и фактически может привести к (плохо) настроенной сети, где файлы хранятся на центральном сервере и совместно используются с NFS на коленях. Что касается уменьшения количества файлов в целом, вам понадобится гораздо больше файлов, чем это нужно заметить, но в многопользовательских настройках число inode может действительно стать ограничивающим.
Тердон

@nneonneo, чтобы привести более конкретный пример, tune2fs -lв разделе, содержащем мой $ HOME, говорит, что у меня 19 300 352 инодов. Я не смогу создать больше файлов, чем это. Как вы сказали, 10 ^ 6 - это не сумасшествие, даже в верхних диапазонах. В зависимости от того, что вы делаете , вы можете иметь нужду в пути больше , чем это.
Тердон

@nneonneo см. обновленный ответ для реального примера того, как можно легко исчерпать inode.
Terdon

Мой сервер использует чуть более 1 миллиона инодов, и это только потому, что у меня есть метрическая тонна электронной почты (много списков рассылки с большим трафиком, уходящей в течение многих лет), и я храню ее в формате Maildir. Я понятия не имею, что вы могли бы сделать, чтобы использовать 19 миллионов инодов. Вам придется создавать новый файл каждую секунду, 24 часа в сутки, в течение более 7 месяцев.
psusi

4

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

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

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

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

Самый популярный архиватор Unix есть tar, хотя существуют и другие, такие как cpioи ar. (Пакеты Debian являются arархивами, хотя cpioчасто используются для начальных виртуальных дисков.) tarИли часто комбинируются с такими инструментами сжатия, как compress(.Z), gzip(.gz), bzip2(.bz2) и xz(.xz), от самого старого до самого младшего и не случайно от худшего к лучшему сжатию.

Создание tarархива и его сжатие - это разные шаги: компрессор ничего не знает о tarформате файла. Это означает, что извлечение одного файла из сжатого tarархива требует распаковки всех предыдущих файлов. Это часто называют «солидным» архивом.

Точно так же, поскольку tar является «потоковым» форматом - необходим для того, чтобы он был полезен в конвейере, - в архиве tar нет глобального индекса, и перечисление содержимого архива tar столь же дорого, как и его извлечение.

Напротив, Zip и RAR и 7-zip (самые популярные архиваторы на современных платформах Windows) обычно сжимают каждый файл отдельно и слегка сжимают метаданные, если вообще. Это дает возможность дешевого перечисления файлов в архиве и извлечения отдельных файлов, но означает, что избыточность между несколькими файлами в одном архиве не может быть использована для увеличения сжатия. Хотя в общем случае сжатие уже сжатого файла не приводит к дальнейшему уменьшению размера файла, иногда вы можете увидеть zip-файл в zip-файле: первое сжатие превратило множество маленьких файлов в один большой файл (возможно, с отключенным сжатием), а второе молния затем сжимается как единое целое.

Существует взаимное опыление между различными платформами и философиями: gzipпо сути, zipэто компрессор без своего архиватора, и, xzпо сути 7-zip, компрессор без своего архиватора.

Есть и другие, специализированные компрессоры. Варианты PPM и их преемник ZPAQоптимизированы для максимального сжатия без учета потребления ресурсов. Они могут легко поглотить столько ЦП и ОЗУ, сколько вы можете использовать для них, и декомпрессия так же обременительна, как и сжатие (для сравнения, наиболее широко используемые инструменты сжатия асимметричны : распаковка дешевле, чем сжатие).

На другом конце спектра, lzo, snappyи LZ4являются «легкими» компрессорами для максимальной скорости и минимального потребления ресурсов, при стоимости сжатия. Они широко используются в файловых системах и других хранилищах объектов, но в меньшей степени, как автономные инструменты.


Так что вы должны выбрать?

Архивирование:

Поскольку вы работаете в Ubuntu, нет никакой реальной причины использовать что-либо кроме tarархивирования, если только вы не пытаетесь создавать файлы, которые легко читаются в другом месте.

zipТрудно превзойти вездесущность, но он не ориентирован на Unix и не будет хранить разрешения на доступ к вашей файловой системе и информацию о владельце, а встроенное сжатие устарело. 7-zip и RAR (и ZPAQ) имеют более современное сжатие, но одинаково не подходят для архивирования файловых систем Unix (хотя ничто не мешает вам использовать их только в качестве компрессоров); RAR также является частной собственностью.

Сжатие:

Для максимального сжатия вы можете взглянуть на эталонный тест, например, на http://mattmahoney.net/dc/text.html . Это должно дать вам лучшее представление о компромиссах.

Вы, вероятно, не хотите максимального сжатия, хотя. Это слишком дорого.

xzявляется наиболее популярным инструментом сжатия общего назначения в современных системах Unix. Я верю, что 7-zip тоже может читать файлы xz, так как они тесно связаны.

Наконец: если вы архивируете данные для чего-то другого, кроме кратковременного хранения, вы должны выбрать что-то с открытым исходным кодом и, желательно, широко распространенное, чтобы минимизировать головные боли в дальнейшем.


1

lzo, gz, b2, lzma (.lzma2 =.xz)являются «потоковыми» компрессорами: они сжимают поток байсов, которые не знают и не заботятся о файлах, каталогах и метаданных, таких как разрешения. Вы должны использовать архиватор, такой как tar, чтобы объединить все эти данные в поток байтов (файл tar) и сжать их с помощью компрессора. Если это данные одного файла, который вас интересует, вы можете также передать этот файл одному из этих компрессоров.

Tar, cpio and paxявляются архиваторами: они берут кучу файлов и каталогов и кодируют данные и метаданные в один файл. tar является самым популярным и наиболее совместимым, хотя технические достоинства между ними достаточно минимальны, чтобы на заре времен происходили религиозные войны.

7z и zip - это компрессоры и дуги: затем сохраните все данные и метаданные и сожмите их. Однако AFAICT, ни один из них не сохраняет Unix-разрешения.

Zip использует тот же алгоритм, что и gzip, который называется DEFLATE. 7z использует алгоритм lzma

чтобы прочитать один файл из tar.gz или чего-то подобного, вам нужно будет распаковать весь поток gz до тех пор, пока не будет открыто достаточное количество файла tar, чтобы вы могли извлечь его. Zip позволяет сжимать и извлекать каждый файл в отдельности. 7z может иметь любое поведение.

Коэффициенты сжатия и скорости: gzip и lzo имеют очень очень высокую скорость сжатия и декомпрессии, но низкие коэффициенты сжатия. Это также не займет много памяти для сжатия. gzip немного медленнее и дает немного лучшую степень сжатия, чем lzo.

Это так быстро, что может быть быстрее считывать сжатый файл gz или lzo с диска и распаковывать его на лету, а не читать несжатый файл прямо с диска.

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

bz2 был предпочтительным алгоритмом с высокой степенью сжатия, но он потерял популярность, так как он медленнее lzma и требует больше времени для сжатия и распаковки. Однако для определенных типов данных (последовательности ДНК, файлы с очень большими сериями одного и того же байта и т. Д.) Bzip2 может превзойти все остальное. Например, однажды мне пришлось сжать файл размером 4 ГБ, равный 1, а b2 уменьшил i до нескольких десятков килобайт, в то время как lzma потребовала около 10 MB, если я правильно помню.


На самом деле lzma довольно быстро распаковывается.
psusi

0

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

Эффект? Гораздо быстрее, чем xz, lzmaили bzip2, и, по моему опыту, его степень сжатия конкурентов, что lzma. Впрочем, это ОЗУ.

http://en.wikipedia.org/wiki/Rzip

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.