Яка різниця між різними системами «стиснення»?


9

Я завжди використовував TAR і ZIP для стиснення, але останнім часом я чув про *.Zалгоритм стиснення. Це викликало для мене питання:

З усіх цих систем стиснення, яка з них найкраща для загального використання та стиснення?

Провівши кілька тестів, я виявив, що tar, як я виявив, НЕ дійсно стискається (якщо прямо не вказано). Що означає, чим він корисний порівняно з іншими методами стиснення?

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

Підсумок повідомлення:

  1. Повинен чи я використовувати *.tar, *.Z, *.7z, .tar, або .tar.<insert ending here>для кращого стиснення?
  2. Якщо звичайний *.tarне стискається, чому ми використовуємо його?

EDIT: Не всі алгоритми дозволяють зберігати дозволи Linux (з того, що я дізнався). Що робити, і чи є якийсь хак (або сценарій), який я міг би використовувати для зберігання дозволів?


Не потрібно говорити про ці речі, просто виберіть верхній, який проголосував, або той, який ви вважаєте найбільш корисним :)
Сет,

Відповіді:


17

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

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

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

Однією з інших важливих відмінностей між zip та tar є те, що zip стискає дані невеликими шматками, тоді як, коли ви стискаєте файл tar, ви стискаєте все це відразу. Останнє дає кращі коефіцієнти стиснення, але для того, щоб витягти один файл в кінці архіву, ви повинні розпакувати всю справу, щоб дістатися до неї. Таким чином, формат zip краще для отримання одного файлу або двох з великого архіву. 7z і darдозволяють вибрати компрес цілої речі (званої "твердий" режим) або невеликих шматочків для легкого витягання шматка.


Але, лише TAR підтримує метадані? Або gzip / bzip2 також тепер підтримує метадані
Kaz Wolfe

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

Чи можна одним націлити папку, а потім покласти це в zip і зберегти дозволи, хоча?
Каз Вулф

@pacificfils, так, але це було б трохи нерозумно, оскільки ви відмовилися від переваг zip та кращого коефіцієнта стиснення gzip.
psusi

@pacificfils tar cfpзбереже дозволи. Файл смоли не стискається, тому zip (7-zip), gzip2, gzip, lzo і т. Д. Добре стискає файл tar (загалом, тар стислих файлів навряд чи може бути стислим).
Елліот Фріш

9

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

Тепер tar, як ви вже говорили, tarне існує і ніколи не було програми стиснення. Натомість це архіватор ; його головне призначення - зробити один великий файл із безлічі маленьких. Історично це було полегшити зберігання на магнітофонах, звідси і назва: Tape ARchive.

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

Для ілюстрації, оскільки це було оскаржено в коментарях, на моєму /розділі 68G я маю таку кількість загальної кількості та використаних входів (майте на увазі, що кількість 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% /

Як ви бачите вище, створення кількох сотень тисяч порожніх файлів швидко виснажує мої вставки, і я більше не можу створювати нові. Якби я був до 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 на колінах. Що стосується зменшення загальної кількості файлів, то вам знадобиться набагато більше файлів, ніж це помітити, але в кількох налаштуваннях користувачів кількість вправ дійсно може стати обмежувальною.
тердон

@nneonneo, щоб надати конкретніший приклад, tune2fs -lна розділі, який тримає мій $ HOME, мені сказано, що у мене 1933552 вставки. Я не зможу створити більше файлів, ніж це. Як ви сказали, 10 ^ 6 не є божевільним, навіть навіть у більш високих межах. Залежно від того, що ви робите, вам може знадобитися набагато більше.
тердон

@nneonneo дивіться оновлену відповідь для реального прикладу того, як ви можете легко вичерпатись у введеннях.
тердон

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

4

Є два чіткі, але пов'язані між собою завдання. Упаковка дерева файлів (включаючи імена файлів, структуру каталогів, дозволи файлової системи, право власності та будь-які інші метадані) у потік байтів називається архівуванням . Видалення надмірності в потоці байтів для отримання меншого байтового потоку називається стисненням .

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

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

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

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

Створення 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, cpio and paxє архіваторами: вони беруть купу файлів і каталогів і кодують дані та метадані в одному файлі. дьоготь - найпопулярніший і найсумісніший, хоча технічні достоїнства між трьома є мінімальними, щоб з ним були релігійні війни на зорі часу.

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 та займає більше часу для стиснення та декомпресії. Однак для певних типів даних (послідовності dna, файли з дуже великими пробіжками одного байта тощо) bzip2 може збити все інше. Як приклад, мені одного разу довелося стиснути 4 Гб файл розміром 1 і b2, зменшивши я до кількох 10 кб, тоді як lzma взяв десь 10 Мб, якщо я правильно пам'ятаю.


Насправді lzma досить швидко розпаковується.
psusi

0

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

Ефект? Набагато швидше, ніж xz, lzmaі bzip2, на мій досвід, його коефіцієнт стиснення конкурує з рівнем lzma. Хоча це RAM свинка.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.