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

7

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

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

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

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

Сообщение:

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

EDIT: не все алгоритмы позволяют хранить разрешения Linux (из того, что я узнал). Что делать, и есть ли какой-то хак (или скрипт), который я мог бы использовать для хранения разрешений?

    
задан Kaz Wolfe 20.03.2014 в 03:17
источник

5 ответов

16

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

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

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

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

    
ответ дан psusi 20.03.2014 в 03:37
источник
8

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

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

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

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

Inode count:              393216
Free inodes:              171421

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

$ 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% /

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

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

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

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

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

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

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

    
ответ дан terdon 20.03.2014 в 03:40
источник
4

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

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

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

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

Самый популярный архиватор Unix - tar , хотя существуют другие таких как cpio и ar . (Пакеты Debian представляют собой ar архивов, тогда как cpio часто используется для inital ramdisks.) 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 оптимизирован для максимального сжатия без учета потребление ресурсов. Они могут легко пережевывать столько CPU и RAM, сколько вы можете бросить на них, а декомпрессия - как налогообложение, так и сжатие (для контраста наиболее широко используемые инструменты сжатия асимметричный : декомпрессию дешевле, чем сжатие).

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

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

Архивация:

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

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

Сжатие:

Для максимального сжатия вы можете взглянуть на бенчмарк, например огромный в ссылке . Это должно дать вы лучше понимаете связанные с этим компромиссы.

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

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

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

    
ответ дан hexwab 20.03.2014 в 14:23
источник
1

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

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

7z и zip являются компрессорами AND arcihvers: Затем сохраняйте все данные и метаданные и сжимайте их. Однако AFAICT, ни один из них не сохраняет разрешения unix.

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

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

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

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

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

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

    
ответ дан staticd 20.03.2014 в 05:36
источник
0

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

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

Ссылка

    
ответ дан user258532 19.05.2014 в 11:11
источник

Ознакомьтесь с другими вопросами по меткам