Якщо ви часто завантажуєте програмне забезпечення або передаєте великі документи, ви, напевно, стикалися з файлами .zip. Це одна з тих цифрових зручностей, які працюють настільки добре, що ми рідко замислюємося над тим, як вони влаштовані. Основна ідея проста: взяти об’ємний файл, зменшити його розмір та швидше передати через інтернет. Або просто заощадити місце на жорсткому диску.
Але тут є невеличкий феномен. Як можна видалити частину даних, а потім чарівним чином відновити їх пізніше без втрати навіть одного біта?
Не магія. Це управління надмірністю. Після того як ми розберемо основи як стиснути файл, ми заглибимося в механіку того, що відбувається всередині архіву.
Стиснення файлу: короткий посібник
В основі стиснення лежать алгоритми, що зменшують розмір файлу. Це заощаджує місце на диску. Це також прискорює передачу даних повільними каналами зв’язку. Створення zip-файлу вбудовано у більшість сучасних операційних систем. Для базових завдань не потрібні спеціальні інструменти.
Ось найпростіший процес.
1. Виберіть цільові файли
Почніть із визначення того, що ви хочете стиснути. Стиснення дає найкращі результати для великих файлів. Відеофайли та необроблені зображення є ідеальними кандидатами, оскільки вони займають значну пропускну здатність та місце для зберігання. Невеликі текстові файли часто стискаються погано, оскільки в них відсутні патерни, що повторюються, необхідні для ефективного зменшення розміру.
2. Використовуйте вбудовані інструменти
Ймовірно, у вас є необхідне програмне забезпечення.
У Windows процес дуже простий. Клацніть правою кнопкою миші на вибраних файлах. Перейдіть до меню «Надіслати» (Send to). Виберіть стиснуту папку (Compressed (zipped) folder). Windows зробить все інше.
Користувачі Mac мають аналогічну швидку команду. Клацніть правою кнопкою миші (або Control+клік) файлами. Виберіть “Стиснути” (Compress). Система автоматично створить zip-архів.
Якщо ваша операційна система не підтримує цю функцію або вам потрібні розширені можливості, потрібно програмне забезпечення. Такі інструменти як 7-Zip або WinRAR пропонують більш тонкий контроль над рівнями стиснення. Але для повсякденного використання вбудованих інструментів достатньо.
3. Створіть архів
Як тільки ви запускаєте команду, програма починає свою роботу. Вона сканує файли. Застосовує вибраний алгоритм. Створює новий zip-файл у тій директорії, що й оригінали.
Швидкість цього процесу залежить від двох факторів: розміру файлів та потужності процесора. Декілька великих відеофайлів можуть стискатися за секунди. Папка, заповнена дрібними текстовими файлами, може зайняти більше часу через накладні витрати, хоча підсумкове зменшення розміру може бути незначним.
4. Робота з результатом
Тепер у вас є єдиний контейнер. Ви можете перейменувати його. Ви можете перемістити його на флешку. Ви можете надіслати його електронною поштою. Одержувачу потрібно витягти вміст, щоб використовувати його. Це звертає процес назад.
Майте на увазі компроміси. Для документів, коду та тексту стиск практично без втрат. Ви отримуєте назад те, що поклали. Для зображень і відео справа інакша. Деякі методи стиснення погіршують якість для досягнення меншого розміру. Це називається стисненням із втратами (lossy compression). Стиснення тексту зазвичай відбувається без втрат.
Як насправді працює стиск файлів
Комп’ютерні файли неповторно повторюються (характеризуються високим ступенем повторюваності). Вони містять ту саму інформацію, що йде знову і знову. Програми для стиску процвітають на цій надмірності.
Замість записувати слово «the» триста разів, алгоритм стиснення записує «the» один раз. Потім він створює покажчик посилання. Щоразу, коли він зустрічає «the», він посилається на перший екземпляр. Це зменшує загальну кількість бітів і байтів.
Щоб зрозуміти це, погляньмо на мову.
Розглянемо інавгураційну промову Джона Ф. Кеннеді 1961 року. Знаменита фраза:
“Якщо ви не знаєте, що українська країна може скористатися цією мовою — ask what you може йти в свою країну.”
Давайте підрахуємо одиниці. Цитата складається із 17 слів. Вона містить 61 літеру. Є 16 прогалин. Один дефіс. Одна точка. Якщо ми надамо одну одиницю пам’яті кожному символу, пробілу або розділовому знаку, загальний розмір файлу становитиме 79 одиниць.
Тепер знайдемо надмірність. Для простоти ми ігноруємо регістр літер.
- “ask” зустрічається двічі.
- “What” зустрічається двічі.
- “your” зустрічається двічі.
- “country” зустрічається двічі.
- “can” зустрічається двічі.
- “do” зустрічається двічі.
- “for” зустрічається двічі.
- “you” зустрічається двічі.
Приблизно половина фрази є надмірною. Дев’ять унікальних слів – ask, not, what, your, country, can, do, for, you – містять майже всю необхідну інформацію. Щоб відновити другу половину, алгоритм просто посилається слова у першій половині. Він заповнює прогалини та розділові знаки, використовуючи прості правила.
У цьому вся суть стиску без втрат (lossless compression). Воно не видаляє інформацію. Воно видаляє повторення.
Далі ми розглянемо докладніше алгоритми, які шукають ці патерни.
Прихована ціна стиснення словника
Більшість інструментів стиснення використовують варіації адаптивного словникового алгоритму LZ. Він названий на честь творців Лемпеля і Зіва, а частина «словник» – це механізм каталогізації даних, що повторюються. Система організації цих записів не складна. Це може бути простий нумерований список.
Візьміть знамениту фразу Кеннеді. Програма стиснення сканує текст на наявність слів, що повторюються, і присвоює їм індекси. Потім вона замінює слова на присвоєні їм номери.
Якщо словник має такий вигляд:
- ask
- what
- your
- country
- can
- for
- you
Фраза “Ask no what your country can do for you; ask what you can do for your country” перетворюється на код. Вона стає:
1 not 2 3 4 5 6 7 8 — 1 2 8 5 6 7 3 4
Комп’ютер-отримувач використовує той самий словник і шаблон номерів для відновлення тексту. Саме так працює розпакування. Деякі стислі файли містять вбудовану програму розпакування. Вона автоматично відновлює вихідний файл під час завантаження.
Але наскільки це насправді заощаджує місце?
Числовий рядок коротше за повну цитату. Але є нюанс. Вам необхідно зберігати сам словник разом із стислими даними.
У реальних умовах розрахунок вимог до файлів є заплутаним. Для даного аналізу припустимо, що кожен символ і пропуск дорівнює одній одиниці пам’яті. Повна фраза займає 79 одиниць. Стисну пропозицію використовує 37 одиниць. Словник також займає 37 одиниць.
Загальний розмір файлу складає 74 одиниці. Зниження мінімальне.
Це лише одна пропозиція. Якби алгоритм обробив решту мови, він знайшов би ці слова, що повторюються набагато частіше. Ефективність зростає зі збільшенням повторень. Як ми побачимо, система також переписує власний словник для подальшої оптимізації організації.
За межами простого збігу слів
Попередні кроки спиралися на пошук повних, повторюваних слів. Ми розглядали текст як послідовність дискретних одиниць. Алгоритму стиснення не важливі слова. Важливі патерни.
Ціль проста: зменшити розмір файлу.
Для цього програмне забезпечення шукає надмірність. Воно не питає: «Це слово?». Воно запитує: «Чи зустрічалася мені ця послідовність раніше?». І воно безжальне. Якщо патерн зустрічається лише один раз, він видаляється. Якщо коротший патерн зустрічається частіше, ніж довший, то довший може бути розбитий на частини.
Це «адаптивне» ядро алгоритмів з урахуванням LZ. Словник еволюціонує. Він змінюється. Він оптимізується у реальному часі.
Як працює вибір патернів
Візьмемо відому фразу Джона Кеннеді.
“Як не може, якщо ваша країна може бути для вас, не може бути, що може бути для вашої країни.”
Людина бачить слова. Компресор бачить символи.
Першою послідовністю, що повторюється, може бути щось крихітне. «t» за яким слідує пробіл. Воно з’являється у словах “not” і “what”. Програма фіксує це. Записує. Потім переходить далі.
Чому? Тому що в цьому короткому фрагменті t не повторюється досить часто, щоб виправдати витрати на зберігання власного ідентифікатора в словнику. Воно перезаписується чи ігнорується.
Далі “ou” з’являється в словах “your” та “country”. Корисно? Можливо. У повній книзі “ou” – це золота жила. Тут? Алгоритм знаходить щось найкраще.
your і country з’являються разом як your country. Повторюється двічі. Це сильніший сигнал, ніж “ou”. Запис словника для “ou” відкидається. Your country займає її місце.
Але заждіть.
Подивіться на can do for. За ним йдуть «your» та «you». Послідовність can do for you повторюється.
Що ефективніше?
your country = 13 символів (включаючи пробіл).
“can do for you” = 15 символів.
Алгоритм віддає перевагу довшому збігу, якщо він економить більше біт на кожному екземплярі. Але can do for you включає you, тоді як your country включає your.
Якщо програма пріоритизує максимальну заміну символів, вона може розбити your country на частини. Вона залишає r country як суфікс і створює основний запис для can do for you. Це дозволяє компресору посилатися на основну частину фрази одним кодом, обробляючи невелику варіацію (“your” проти “you”) за допомогою вторинних посилань.
Це динамічний перепис робить LZ адаптивним. Словник не статичний. Це живий журнал того, що тільки-но сталося в потоці даних.
Коефіцієнт стиснення
Використовуючи наші виведені патерни:
- ask__
- what__
- you
- r__country
- cando__for__you
Вихідна пропозиція перетворюється на серію покажчиків:
1 not__ 2 3 4 5 __ - __ 1 2 3 5 4
Використання пам’яті змінюється кардинально.
Початковий текст: 79 одиниць.
Стислі дані: 18 одиниць.
Витрати словника: 41 одиниця.
Разом: 59 одиниць.
Ми заощадили 20 одиниць. Це приблизно 25% скорочення. Чимало для кількох рядків мови. І це не обов’язково найефективніший можливий результат. Ви, ймовірно, могли б знайти більш щільне компонування. Але суть у тому, що пошук правильних патернів важливіше, ніж пошук будь-яких патернів.
Чому текст стискається краще, ніж графіка
То чому одні файли зменшуються на 50% і більше, інші ж ледве змінюються?
Надмірність.
Природні мови мають високу надмірність. Літери групуються певним чином. “Th”, “ing”, “tion”. Слова повторюються постійно. Текстові файли щільні цими передбачуваними структурами. Компресори процвітають тут.
Програмний код аналогічний. Обмежений набір ключових слів та команд повторюється нескінченно. if, while, return. Паттерни тверді. Стиснення працює добре.
Графіка? Аудіо?
Не зовсім.
Зображення або MP3-файл містять унікальні дані. Кожен пікселя має конкретне значення. Кожен аудіосемпл унікальний. Повторюваних послідовностей мало. Ентропія висока. Алгоритм не може знайти патернів, що достатньо перекриваються, для створення корисного словника.
Саме тому без втрат (lossless) стиск не працює для медіафайлів. Потрібні інші техніки. Докладніше про це пізніше.
Розмір файлу та вибір алгоритму
Чи покращується стиснення зі збільшенням розміру файлів?
Загалом, так.
Якби ми стиснули всю промову Кеннеді, економія була б більшою. Чому? Тому що одні й самі патерни повторюються частіше. Записи словника використовуються тисячі разів. Накладні витрати на словник стають незначними, порівняно з економією.
Маленькі файли? Накладні витрати на словник з’їдають прибуток.
Вибір алгоритму також грає величезну роль.
Не всі варіанти LZ створені рівними. Деякі налаштовані для тексту. Деякі дані. Деякі використовують ієрархічні словники – словники всередині словників – для виявлення складних, вкладених патернів у великих файлах. Вони можуть “заїкатися” на невеликих вхідних даних.
Програмісти постійно настроюють ці системи. Ціль завжди одна: кращі коефіцієнти стиснення, більш висока швидкість. Але універсального рішення немає.
Кращий компресор для тексту може бути гіршим для вашої бази даних.
Йдеться про стиснення без втрат. Це єдиний спосіб гарантувати, що ви отримаєте вихідний файл. Кожен біт залишається недоторканим. Ви розбиваєте файл на дрібніші частини для зберігання або передачі, а потім збираєте його назад точно таким, яким він був. Дані не губляться.
Стиск із втратами йде іншим шляхом. Воно не намагається зберегти все. Натомість воно відкидає «непотрібну» інформацію. Ціль проста: зменшити розмір файлу. Ви зустрінете його всюди. Це стандарт для растрових зображень.
Растрові зображення роздуті. Вони займають багато місця. Відсканована фотографія – ідеальний приклад.
Алгоритми стиснення без втрат тут зазнають невдачі. Так, великі ділянки мають ідентичний вигляд. Синє небо. Але якщо придивитися, кожен піксель трохи відрізняється. Значення кольору змінюються. Щоб зменшити розмір файлу без втрати дозволу, потрібно змінити ці значення.
Програма вибирає один відтінок синього. Вона надає це єдине значення кожному пікселю у небі. Вона переписує файл, щоб він посилався на це посилання. Результат? Розмір файлу значно зменшується. Ви не помітите різниці.
Але є каверза. Ви ніколи не зможете отримати вихідний файл назад.
Як тільки ви стиснете його, ви залишаєтеся з інтерпретацією реальності, запропонованою програмою стиснення. Вихідні дані зникають. Ви не можете використовувати стиснення з втратами для речей, які потребують точного відтворення. Програмні програми? Ні. Бази даних? Ні. Інавгураційні промови президента? Категорично ні.
“При стисненні з втратами ви не можете отримати вихідний файл назад після його стиснення. Ви залишаєтеся з переосмисленням оригіналу програмою стиснення.”
Ми оновили цю статтю з використанням технологій штучного інтелекту, а потім переконалися, що вона перевірена фактами та відредагована редактором HowStuffWorks.
Часті питання про стиснення файлів
Що робить стиск файлу?
Воно зменшує розмір файлу. Найменші файли означають більш швидку передачу. Ви відправляєте та отримуєте дані швидше.
Які основні типи схем стиснення файлів?
Їх два. Стиснення без втрат та з втратами. Стиснення без втрат розбиває файл та відновлює його пізніше. Стиснення із втратами видаляє біти. Воно назавжди зменшує розмір файлу. Ви не можете звернути стиск із втратами.
Який стиск використовують zip-файли?
Zip-файли покладаються на стиснення даних без втрат. Вони обробляють кілька каталогів. Вони використовують такі алгоритми, як DEFLATE. Дані виходять такими самими, якими і входили.
Чи зменшує стиснення файлів якість?
Так. Після стиснення зображення на комп’ютері або камері якість часто страждає. Різкість падає. Контрастність зникає. Дрібні деталі кольору зникають. Зображення виглядає гіршим. Це компроміс.































































