Часть 1: Производительность
Вот сравнение двух отдельных рабочих процессов и того, что они делают.
У вас есть файл на диске blah.tar.gz
который, скажем, представляет собой 1 ГБ сжатых GZIP данных, который в несжатом виде занимает 2 ГБ (то есть степень сжатия 50%).
То, как вы могли бы создать это, если бы вы делали архивирование и сжатие отдельно, было бы:
tar cf blah.tar files ...
Это привело бы к blah.tar
который является простым объединением files ...
в несжатом виде.
Тогда вы бы сделали
gzip blah.tar
Это будет считывать содержимое blah.tar
с диска, сжимать их с помощью алгоритма сжатия gzip, записывать содержимое в blah.tar.gz
, а затем отсоединять (удалять) файл blah.tar
.
Теперь давайте распакуем!
Способ 1
У вас есть blah.tar.gz
, так или иначе.
Вы решили запустить:
gunzip blah.tar.gz
Это будет
- ПРОЧИТАЙТЕ 1 ГБ сжатого содержимого данных
blah.tar.gz
- ОБРАБОТАТЬ сжатые данные через распаковщик
gzip
в памяти.
- Когда буфер памяти заполняется данными из "блоков", ЗАПИШИТЕ несжатые данные в файл
blah.tar
на диске и повторяйте, пока все сжатые данные не будут прочитаны.
- Отсоедините (удалите) файл
blah.tar.gz
Теперь у вас есть диск blah.tar
, который не распакован, но содержит один или несколько файлов, с очень низкими издержками на структуру данных. Размер файла, вероятно, на пару байтов больше, чем сумма всех данных файла.
Ты бежишь:
tar xvf blah.tar
Это будет
- ПРОЧИТАЙТЕ 2 ГБ несжатого содержимого данных
blah.tar
и структур данных формата файла tar
, включая информацию о разрешениях файлов, именах файлов, каталогах и т.д.
- ЗАПИШИТЕ 2 ГБ данных плюс метаданные на диск. Это включает в себя: перевод информации о структуре данных / метаданных в создание новых файлов и каталогов на диске, в зависимости от ситуации, или перезапись существующих файлов и каталогов с новым содержимым данных.
Общие данные, которые мы ЧИТАЕМ с диска в этом процессе, составили 1 ГБ (для gunzip) + 2 ГБ (для tar) = 3 ГБ.
Общее количество данных, которые мы записали на диск в этом процессе, составило 2 ГБ (для gunzip) + 2 ГБ (для tar) + несколько байтов для метаданных = около 4 ГБ.
Способ 2
У вас есть blah.tar.gz
, так или иначе.
Вы решили запустить:
tar xvzf blah.tar.gz
Это будет
- ЧИТАЙТЕ 1 ГБ сжатого содержимого данных блока
blah.tar.gz
за раз, в память.
- ОБРАБОТАТЬ сжатые данные через распаковщик
gzip
в памяти.
- Поскольку буфер памяти заполняется, то это будет труба , что данные в памяти, вплоть до формата синтаксического анализа
tar
файла, который будет считывать информацию о метаданных и т.д. , а также данные несжатых файлов.
- Когда буфер памяти заполняется в синтаксическом анализаторе файлов
tar
, он ЗАПИСАЕТ несжатые данные на диск, создавая файлы и каталоги и заполняя их несжатым содержимым.
Общее количество данных, которые мы ПРОЧИТАЛИ с диска в этом процессе, составило 1 ГБ сжатых данных, точка.
Общее количество данных, которые мы записали на диск в этом процессе, составило 2 ГБ несжатых данных + несколько байтов для метаданных = около 2 ГБ.
Если вы заметили, объем дискового ввода-вывода в пути 2 идентичен дисковому вводу-выводу, выполняемому, скажем, программами Zip
или 7-Zip , с учетом любых различий в степени сжатия.
И если вам важна степень сжатия, используйте Xz
компрессор для инкапсуляции tar
, и у вас есть архив TAR с LZMA2 , который столь же эффективен, как и самый продвинутый алгоритм, доступный для 7-Zip :-)
Часть 2: Особенности
tar
хранит разрешения Unix в своих метаданных файла, и он очень хорошо известен и проверен на предмет успешной упаковки каталога со всеми видами различных разрешений, символических ссылок и т. д. Существует более нескольких случаев, когда может понадобиться скопировать кучу файлы в один файл или поток, но не обязательно сжимают его (хотя сжатие полезно и часто используется).
Часть 3: Совместимость
Многие инструменты распространяются в исходном или двоичном виде как .tar.gz или .tar.bz2, потому что это формат файла с "наименьшим общим знаменателем": так же, как большинство пользователей Windows имеют доступ к распаковщикам .zip или .rar, большинство установок Linux Даже самые простые будут иметь доступ по крайней мере к гудрону и смоле, независимо от того, сколько лет или урезаны. Даже прошивки Android имеют доступ к этим инструментам.
Новые проекты, ориентированные на аудиторию, использующую современные дистрибутивы, могут очень хорошо распространяться в более современном формате, например .tar.xz (с использованием формата сжатия Xz (LZMA), который сжимает лучше, чем gzip или bzip2), или .7z, что аналогично форматы файлов ZIP или RAR , в которых он сжимает и задает макет для инкапсуляции нескольких файлов в один файл.
Вы не видите, чтобы .7z использовался чаще по той же причине, по которой музыка не продается в онлайн-магазинах загрузки в совершенно новых форматах, таких как Opus, или видео в WebM. Совместимость с людьми, использующими древние или очень простые системы.