В чем разница между разными & ldquo; compression & rdquo; системы?

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

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

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

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

Сообщение:

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

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

1
задан 20 March 2014 в 09:39

4 ответа

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

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

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

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

Inode count:              393216
Free inodes:              171421
[d8 ] Если теперь я попытаюсь создать больше файлов, чем у меня есть 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, будут работать.

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

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

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

9
ответ дан 24 May 2018 в 10:36
  • 1
    Мой компьютер имел (в прошлом) свыше 10 000 000 файлов, и это не слишком сумасшествие. Я никогда не использую tar для «уменьшения количества файлов»; так как большинство файловых систем откровенно не заботятся, и в любом случае это не совсем оптимально, так как tar не поддерживает простой случайный доступ к файлам. Скорее, основное использование (для меня и я думаю, для большинства людей) заключается в том, чтобы поделиться файлами (например, исходным кодом) с другими людьми простым способом. – nneonneo 20 March 2014 в 10:03
  • 2
    @nneonneo вам когда-нибудь приходилось работать с миллионами файлов в каталоге single ? Я и считаю, что это непросто. В отличие от очевидных проблем с ARG_MAX, это может затруднить работу с вашими файлами и может фактически создать (плохо) настроенную сеть, где файлы хранятся на центральном сервере и совместно с NFS на коленях. Что касается сокращения количества файлов в целом, вам понадобится больше файлов, чем замечать, но в многопользовательских настройках количество inodes действительно может стать ограничивающим. – terdon♦ 20 March 2014 в 10:16
  • 3
    @nneonneo, чтобы дать более конкретный пример, tune2fs -l на разделе, содержащем мой $ HOME, говорит мне, что у меня есть 19,300,352 inodes. Я не смогу создать больше файлов, чем это. Как вы сказали, 10 ^ 6 не сумасшедший, даже не в высших диапазонах. В зависимости от того, что вы делаете, вам может понадобиться way больше, чем это. – terdon♦ 20 March 2014 в 10:22
  • 4
    @nneonneo см. обновленный ответ для реального мира, пример того, как вы можете легко запустить из inodes. – terdon♦ 20 March 2014 в 23:33
  • 5
    Мой сервер использует чуть более 1 миллиона инодов, и это связано только с тем, что у меня есть метрическая тонна электронной почты (большое количество списков рассылки для трафика в течение многих лет) и хранятся в формате Maildir. Я понятия не имею, что вы могли бы сделать, чтобы использовать 19 миллионов инодов. Вам нужно будет создавать новый файл каждую секунду, 24 часа в сутки, более 7 месяцев. – psusi 21 March 2014 в 00:30

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

В Unix две операции разделены, с различными инструментами для каждого.

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

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

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

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

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

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

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

Существуют и другие специализированные компрессоры. Варианты PPM и их преемник ZPAQ оптимизированы для максимального сжатия без учета потребления ресурсов. Они могут легко пережевывать столько CPU и RAM, сколько вы можете на них набросать, а декомпрессия - это как налогообложение, как сжатие (для контраста наиболее широко используемыми инструментами сжатия являются архивирование : распаковка дешевле, чем сжатие ).

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

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

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

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

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

Сжатие:

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

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

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

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

4
ответ дан 24 May 2018 в 10:36

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

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-ти МБ, если я правильно помню.

1
ответ дан 24 May 2018 в 10:36
  • 1
    На самом деле lzma довольно быстро при распаковке. – psusi 21 March 2014 в 00:34

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

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

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

0
ответ дан 24 May 2018 в 10:36

Другие вопросы по тегам:

Похожие вопросы: