Алгоритм сжатия данных
В вычислительной технике Deflate ( стилизованный как DEFLATE , а также называемый Flate [1] [2] ) — это формат файла сжатия данных без потерь , который использует комбинацию кодирования LZ77 и Хаффмана . Он был разработан Филом Кацем для версии 2 его архиватора PKZIP . Позднее Deflate был определен в RFC 1951 (1996). [3]
Кац также разработал оригинальный алгоритм, используемый для построения потоков Deflate. Этот алгоритм был запатентован как патент США 5,051,745 и передан PKWARE, Inc. [4] [5] Как указано в документе RFC, алгоритм, создающий файлы Deflate, широко считался реализуемым способом, не защищенным патентами. [3] Это привело к его широкому использованию — например, в сжатых файлах gzip и файлах изображений PNG , в дополнение к формату файла ZIP , для которого Кац изначально его разработал. С тех пор срок действия патента истек.
Формат потока
Поток Deflate состоит из серии блоков. Каждому блоку предшествует 3- битный заголовок:
- Первый бит: Маркер последнего блока в потоке:
1
: Это последний блок в потоке.0
: После этого блока нужно обработать еще несколько блоков.
- Второй и третий биты: Метод кодирования, используемый для этого типа блока:
00
: Сохраненный (также известный как необработанный или буквальный) раздел длиной от 0 до 65 535 байт01
: Статический сжатый блок Хаффмана , использующий заранее согласованное дерево Хаффмана, определенное в RFC10
: Динамический сжатый блок Хаффмана , в комплекте с таблицей Хаффмана11
: Зарезервировано — не использовать.
Вариант с сохраненным блоком добавляет минимальные накладные расходы и используется для несжимаемых данных.
Большинство сжимаемых данных в конечном итоге будут закодированы с использованием метода 10
, динамического кодирования Хаффмана , которое создает оптимизированное дерево Хаффмана, настроенное для каждого блока данных индивидуально. Инструкции по созданию необходимого дерева Хаффмана следуют сразу за заголовком блока. Статический параметр Хаффмана используется для коротких сообщений, где фиксированная экономия, полученная за счет исключения дерева, перевешивает процентную потерю сжатия из-за использования неоптимального (таким образом, технически не Хаффмана) кода.
Сжатие достигается в два этапа:
- Сопоставление и замена дубликатов строк указателями.
- Замена символов новыми, взвешенными символами на основе частоты использования.
Устранение дублирующихся строк
В сжатых блоках, если обнаружена дублирующаяся серия байтов (повторяющаяся строка), то вставляется обратная ссылка , ссылающаяся на предыдущее местоположение этой идентичной строки. Закодированное соответствие более ранней строке состоит из 8-битной длины (3–258 байт) и 15-битного расстояния (1–32 768 байт) до начала дубликата. Относительные обратные ссылки могут быть сделаны через любое количество блоков, пока расстояние появляется в пределах последних 32 КБ несжатых декодированных данных (называемых скользящим окном ).
Если расстояние меньше длины, дубликат перекрывает сам себя, указывая на повторение. Например, серия из 10 одинаковых байтов может быть закодирована как один байт, за которым следует дубликат длиной 9, начинающийся с предыдущего байта.
Поиск в предшествующем тексте дубликатов подстрок является наиболее затратной с точки зрения вычислений частью алгоритма DEFLATE и операцией, на которую влияют настройки уровня сжатия.
Сокращение бита
Второй этап сжатия состоит из замены часто используемых символов на более короткие представления, а менее часто используемых символов на более длинные представления. Используемый метод — кодирование Хаффмана , которое создает непрефиксное дерево неперекрывающихся интервалов, где длина каждой последовательности обратно пропорциональна логарифму вероятности того, что этот символ необходимо кодировать. Чем больше вероятность того, что символ необходимо кодировать, тем короче будет его битовая последовательность.
Создается дерево, содержащее место для 288 символов:
- 0–255: представляют собой буквенные байты/символы 0–255.
- 256: конец блока – остановить обработку последнего блока, в противном случае начать обработку следующего блока.
- 257–285: в сочетании с дополнительными битами длина совпадения составляет 3–258 байт.
- 286, 287: не используются, зарезервированы и незаконны, но все еще являются частью дерева.
Код длины совпадения всегда будет сопровождаться кодом расстояния. На основе считанного кода расстояния могут быть считаны дополнительные «дополнительные» биты для получения окончательного расстояния. Дерево расстояний содержит место для 32 символов:
- 0–3: расстояния 1–4
- 4–5: расстояния 5–8, 1 дополнительный бит
- 6–7: расстояния 9–16, 2 дополнительных бита
- 8–9: расстояния 17–32, 3 дополнительных бита
- ...
- 26–27: расстояния 8,193–16,384, 12 дополнительных бит
- 28–29: расстояния 16,385–32,768, 13 дополнительных бит
- 30–31: не используется, зарезервирован и незаконен, но все еще является частью дерева.
Обратите внимание, что для символов расстояния соответствия 2–29 количество дополнительных бит можно рассчитать как .
Два кода (дерево длины/литерала 288 символов и дерево расстояний 32 символа) сами кодируются как канонические коды Хаффмана , задавая длину бит кода для каждого символа. Длины бит сами кодируются длиной серии , чтобы создать максимально компактное представление. В качестве альтернативы включению представления дерева опция «статическое дерево» предоставляет стандартные фиксированные деревья Хаффмана. Сжатый размер с использованием статических деревьев может быть вычислен с использованием той же статистики (количество раз, когда появляется каждый символ), которая используется для генерации динамических деревьев, поэтому компрессору легко выбрать то, что меньше.
Кодер/компрессор
На этапе сжатия кодировщик выбирает количество времени, потраченного на поиск соответствующих строк. Реализация эталона zlib/gzip позволяет пользователю выбирать из скользящей шкалы вероятного результирующего уровня сжатия в зависимости от скорости кодирования. Варианты варьируются от 0
(не пытаться сжимать, просто хранить несжатым) до 9
представления максимальной возможности реализации эталона в zlib/gzip.
Были созданы другие кодировщики Deflate, все из которых также будут производить совместимый битовый поток , который может быть распакован любым существующим декодером Deflate. Различные реализации, вероятно, будут производить вариации окончательного закодированного битового потока. Основное внимание в не-zlib-версиях кодировщика обычно уделялось созданию более эффективно сжатого и меньшего закодированного потока.
Deflate64/Улучшенный Deflate
Deflate64, специфицированный PKWARE, является проприетарным вариантом Deflate. Это по сути тот же алгоритм. Изменилось увеличение размера словаря с 32 КБ до 64 КБ, расширение кодов расстояния до 16 бит, чтобы они могли адресовать диапазон в 64 КБ, и код длины, который был расширен до 16 бит, чтобы он мог определять длину от трех до 65 538 байт. [6] Это приводит к тому, что Deflate64 имеет большее время сжатия и потенциально немного более высокую степень сжатия, чем Deflate. [7] Несколько бесплатных и/или открытых проектов поддерживают Deflate64, такие как 7-Zip , [8] в то время как другие, такие как zlib , не поддерживают, из-за проприетарной природы процедуры [9] и очень скромного увеличения производительности по сравнению с Deflate. [10]
Использование Deflate в новом программном обеспечении
Реализации Deflate свободно доступны на многих языках. Приложения, написанные на C, обычно используют библиотеку zlib (в соответствии с разрешающей лицензией zlib License ). Приложения на Borland Pascal (и совместимых языках) могут использовать paszlib. Приложения на C++ могут использовать улучшенную библиотеку Deflate в 7-Zip . Java и .NET Framework предлагают встроенную поддержку Deflate в своих библиотеках (соответственно, java.util.zip
и System.IO.Compression). Приложения на Ada могут использовать Zip-Ada (чистый) или ZLib-Ada.
Реализации кодировщика
- PKZIP : первая реализация, изначально сделанная Филом Кацем как часть PKZip
- zlib : стандартная эталонная реализация, принятая во многих приложениях из-за ее открытого исходного кода, разрешительной лицензии. См. Zlib § Forks для более производительных forks.
- Crypto++ : содержит общедоступную реализацию на C++, направленную на снижение потенциальных уязвимостей безопасности . Автор, Вэй Дай, утверждает: « Этот код менее умен, но, надеюсь, более понятен и удобен в обслуживании [чем zlib] ».
- 7-Zip : написана Игорем Павловым на языке C++ , эта версия распространяется по свободной лицензии и обеспечивает более высокое сжатие, чем zlib, за счет использования процессора. Имеет возможность использовать формат хранения DEFLATE64.
- PuTTY 'sshzlib.c': автономная реализация по лицензии MIT от Саймона Тэтхэма, имеет полную возможность декодирования, но поддерживает только создание статических деревьев.
- libflate: [11] часть Plan 9 от Bell Labs , реализует сжатие deflate
- Hyperbac : использует собственную библиотеку сжатия (на C++ и Assembly) с возможностью реализации формата хранения DEFLATE64.
- Zopfli : реализация C по лицензии Apache от Google ; обеспечивает более высокое сжатие за счет использования процессора. ZopfliPNG — это разновидность Zopfli для использования с файлами PNG .
- igzip: кодировщик, написанный на языке ассемблера x86 , выпущенный Intel по лицензии MIT . В 3 раза быстрее, чем zlib -1. Полезен для сжатия геномных данных. [12]
- libdeflate: [13] библиотека для быстрого сжатия и распаковки на основе DEFLATE всего буфера. Libdeflate сильно оптимизирована, особенно на процессорах x86.
AdvanceCOMP использует версии Deflate с более высокой степенью сжатия в 7-Zip, libdeflate и Zopfli для обеспечения повторного сжатия файлов gzip , PNG , MNG и ZIP с возможностью получения файлов меньшего размера, чем zlib может достичь при максимальных настройках. [14]
Аппаратные кодеры
- AHA361-PCIX/AHA362-PCIX от Comtech AHA Архивировано 2006-12-08 на Wayback Machine . Comtech выпустила карту PCI-X (PCI-ID:
193f:0001
), способную сжимать потоки с помощью Deflate со скоростью до 3,0 Гбит/с (375 МБ/с) для входящих несжатых данных. Драйвер ядра Linux для AHA361-PCIX сопровождается " " утилитой и настраиваемой " ", способной использовать аппаратное сжатие от Apache . Аппаратное обеспечение основано на Xilinx Virtex FPGA и четырех специальных микросхемах AHA3601 ASIC . Платы AHA361/AHA362 ограничены обработкой только статических блоков Хаффмана и требуют модификации программного обеспечения для добавления поддержки — карты не могли поддерживать полную спецификацию Deflate, то есть они могли надежно декодировать только свой собственный вывод (поток, который не содержал динамических блоков Хаффмана типа 2).ahagzip
mod_deflate_aha
- StorCompress 300/MX3 от Indra Networks. Это ряд карт PCI (PCI-ID:
17b4:0011
) или PCI-X, оснащенных от одного до шести механизмов сжатия с заявленной скоростью обработки до 3,6 Гбит/с (450 МБ/с). Доступна версия карт с отдельным брендом WebEnhance, специально разработанная для использования в веб-обслуживании, а не для использования в SAN или резервном копировании; также выпускается версия PCIe , MX4E. - AHA363-PCIe/AHA364-PCIe/AHA367-PCIe. В 2008 году Comtech начала производить две карты PCIe (
PCI-ID: 193f:0363
/ 193f:0364
) с новым аппаратным чипом кодировщика AHA3610. Новый чип был разработан для обеспечения устойчивой скорости 2,5 Гбит/с. Используя два таких чипа, плата AHA363-PCIe может обрабатывать Deflate со скоростью до 5,0 Гбит/с (625 МБ/с) с использованием двух каналов (два сжатия и два распаковки). Вариант AHA364-PCIe представляет собой версию карты только для кодирования, разработанную для исходящих балансировщиков нагрузки , и вместо этого имеет несколько наборов регистров, что позволяет использовать 32 независимых виртуальных канала сжатия, питающих два физических механизма сжатия. Драйверы устройств для Linux, Microsoft Windows и ядра OpenSolaris доступны для обеих новых карт, а также модифицированная системная библиотека zlib, так что динамически связанные приложения могут автоматически использовать аппаратную поддержку без внутренней модификации. Плата AHA367-PCIe ( PCI-ID: 193f:0367
) похожа на AHA363-PCIe, но использует четыре чипа AHA3610 для постоянной скорости сжатия 10 Гбит/с (1250 МБ/с). В отличие от AHA362-PCIX, механизмы декомпрессии на платах AHA363-PCIe и AHA367-PCIe полностью совместимы с deflate. - Процессоры Nitrox и Octeon [ постоянно неработающая ссылка ] от Cavium, Inc. содержат высокоскоростные аппаратные механизмы сжатия и распаковки, совместимые как с ZLIB, так и с GZIP, а некоторые устройства способны обрабатывать несколько одновременных потоков данных.
- Реализация HDL-Deflate GPL FPGA.
- ZipAccel-C от CAST Inc. Это ядро Silicon IP, поддерживающее сжатие Deflate, Zlib и Gzip . ZipAccel-C может быть реализовано в ASIC или FPGA , поддерживает как динамические, так и статические таблицы Хаффмана и может обеспечивать пропускную способность свыше 100 Гбит/с. Компания предлагает эталонные проекты плат ускорителей сжатия/декомпрессии для Intel FPGA (ZipAccel-RD-INT) и Xilinx FPGA (ZipAccel-RD-XIL).
- Набор микросхем Intel Communications Chipset 89xx Series (Cave Creek) для процессоров Intel Xeon E5-2600 и E5-2400 (Sandy Bridge-EP/EN) поддерживает аппаратное сжатие и декомпрессию с использованием технологии QuickAssist. В зависимости от набора микросхем доступны скорости сжатия и декомпрессии 5 Гбит/с, 10 Гбит/с или 20 Гбит/с. [15]
- Процессоры IBM z15 включают в себя улучшенную версию аппаратного ускорения Nest Accelerator Unit (NXU) из плат расширения zEDC Express I/O, используемых в системах z14 для аппаратного сжатия и декомпрессии Deflate, как указано в RFC1951. [16] [17]
- Начиная с архитектуры POWER9 , IBM добавила аппаратную поддержку сжатия и распаковки Deflate (как указано в RFC 1951) к ранее криптоцентрическому ядру ускорителя Nest (NX), представленному в POWER7+ . Эта поддержка доступна для программ, работающих с AIX 7.2 Technology Level 4 Expansion Pack или AIX 7.2 Technology Level 5 Service Pack 2 через библиотеку zlibNX. [18] [19]
Декодер/декомпрессор
Inflate — это процесс декодирования, который берет поток битов Deflate для распаковки и корректно создает исходные полноразмерные данные или файл.
Реализации только с инфляцией
Обычной целью альтернативной реализации Inflate является высокооптимизированная скорость декодирования или предельно предсказуемое использование оперативной памяти для встраиваемых систем на базе микроконтроллера.
- Сборка
- 6502 inflate, написанный Петром Фусиком на языке ассемблера 6502 .
- SAMflate, написанный Эндрю Коллиером на языке ассемблера Z80 с дополнительной поддержкой страничной организации памяти для SAM Coupé , и доступный по лицензиям BSD / GPL / LGPL / DFSG .
- gunzip, написанный Лоренсом Хольстом на языке ассемблера Z80 для MSX , лицензированный под BSD .
- inflate.asm — быстрая и эффективная реализация на машинном языке M68000 , написанная Кейром Фрейзером и переданная в общественное достояние .
- С / С++
- kunzip от Michael Kohn, не связан с "KZIP". Поставляется с исходным кодом на языке C по лицензии GNU LGPL . Используется в установщике GIMP .
- puff.c ( zlib ), небольшая, необремененная, однофайловая эталонная реализация, включенная в каталог /contrib/puff дистрибутива zlib.
- tinf написан Йоргеном Ибсеном на языке ANSI C и поставляется с лицензией zlib. Добавляет около 2k кода.
- tinfl.c (miniz), общедоступная реализация Inflate, полностью содержащаяся в одной функции C.
PCDEZIP
, Боб Фландерс и Майкл Холмс, опубликовано в журнале PC Magazine 11 января 1994 г.- inflate.cl Джона Фодераро. Автономный декодер Common Lisp , распространяемый по лицензии GNU LGPL .
- inflate.s7i/gzip.s7i, чистая реализация Seed7 Deflate и распаковки gzip, Томаса Мертеса. Доступно по лицензии GNU LGPL .
- pyflate, чистый Python -автономный декодер Deflate ( gzip ) и bzip2 от Пола Слэйдена. Написан для исследований/прототипирования и доступен по лицензиям BSD / GPL / LGPL / DFSG .
- deflatelua, реализация Deflate на чистом Lua и распаковка gzip /zlib, автор Дэвид Манура.
- inflate - чистая реализация Inflate на Javascript Криса Дикинсона
- pako: оптимизированный по скорости порт zlib для JavaScript. Содержит отдельную сборку только с inflate.
Аппаратные декодеры
- Последовательный графический процессор Inflate от BitSim. Аппаратная реализация Inflate. Часть контроллера BitSim BADGE (Bitsim Accelerated Display Graphics Engine) для встраиваемых систем.
- Реализация HDL-Deflate GPL FPGA.
- ZipAccel-D от CAST Inc. Это ядро Silicon IP, поддерживающее распаковку файлов Deflate, Zlib и Gzip . Ядро ZipAccel-D IP, которое может быть реализовано в ASIC или FPGA. Компания предлагает эталонные проекты плат ускорителей сжатия/распаковки для Intel FPGA (ZipAccel-RD-INT) и Xilinx FPGA (ZipAccel-RD-XIL).
- Процессоры IBM z15 включают в себя улучшенную версию аппаратного ускорения Nest Accelerator Unit (NXU) из плат расширения zEDC Express I/O, используемых в системах z14 для аппаратного сжатия и декомпрессии Deflate, как указано в RFC1951. [16] [17]
- Начиная с архитектуры POWER9 , IBM добавила аппаратную поддержку сжатия и распаковки Deflate (как указано в RFC 1951) к ранее криптоцентрическому ядру ускорителя Nest (NX), представленному в POWER7+ . Эта поддержка доступна для программ, работающих с AIX 7.2 Technology Level 4 Expansion Pack или AIX 7.2 Technology Level 5 Service Pack 2 через библиотеку zlibNX. [18] [19]
Смотрите также
Ссылки
- ^ Авторы Go. "flate package - compress/flate - Go Packages". Язык программирования Go . Google . Получено 5 сентября 2023 г. Пакет
flate реализует формат сжатых данных DEFLATE, описанный в выпуске RFC 1951.
- ^ Adobe Systems Incorporated . "PDF 32000-1:2008: Управление документами — Формат переносимых документов — Часть 1: PDF 1.7" (PDF) . Adobe Open Source . Adobe. стр. 23 . Получено 5 сентября 2023 г. .
FlateDecode [...] Распаковывает данные, закодированные с использованием метода сжатия zlib/deflate
- ^ ab Deutsch, L. Peter (май 1996 г.). Спецификация формата сжатых данных DEFLATE версии 1.3. IETF . стр. 1. раздел. Аннотация. doi : 10.17487/RFC1951 . RFC 1951. Получено 23.04.2014 .
- ↑ Патент США 5051745, Katz, Phillip W. , «String Searcher, and Compressor Using Same», опубликован 24 сентября 1991 г., выдан 24 сентября 1991 г., передан PKWare Inc.
- ^ Дэвид, Саломон (2007). Сжатие данных: Полный справочник (4-е изд.). Springer. стр. 241. ISBN 978-1-84628-602-5.
- ^ "Binary Essence – Deflate64". Архивировано из оригинала 21 июня 2017 года . Получено 22 мая 2011 года .
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ) - ^ "Binary Essence – "Calgary Corpus" compression comparisons". Архивировано из оригинала 27 декабря 2017 года . Получено 22 мая 2011 года .
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ) - ^ "-m (Установить метод сжатия) переключатель". sevenzip.osdn.jp . Архивировано из оригинала 2022-04-09 . Получено 2023-01-21 .
- ^ История алгоритмов сжатия данных без потерь – Deflate64
- ^ Часто задаваемые вопросы по zlib – Поддерживает ли zlib новый формат «Deflate64», представленный PKWare?
- ^ "Plan 9 из Bell Labs's /n/sources/plan9/sys/src/libflate". plan9.bell-labs.com . Lucent Technologies. Архивировано из оригинала 2006-03-15.
- ^ "Высокопроизводительное сжатие DEFLATE с оптимизацией для наборов геномных данных". Intel Software . 1 октября 2019 г. Получено 18 января 2020 г.
- ^ "libdeflate". Сильно оптимизированная библиотека для сжатия и распаковки DEFLATE/zlib/gzip .
- ↑ Маццолени, Андреа (21 февраля 2023 г.). «амадванс/адванцемп». Гитхаб .
- ^ "Процессоры Intel® Xeon® серий E5-2600 и E5-2400 с набором микросхем Intel® Communications серии 89xx" . Получено 18.05.2016 .
- ^ ab "Представляем IBM z15 — корпоративную платформу для критически важных гибридных мультиоблаков". IBM . 12 сентября 2019 г. Получено 01.11.2021 г.
- ^ ab Lascu, Octavian (28 апреля 2021 г.). Техническое руководство IBM z15 (8562), стр. 97. IBM Redbooks. ISBN 9780738458991. Получено 01.11.2021 .
- ^ ab "Сжатие данных с использованием библиотеки zlibNX - Документация IBM". IBM . Получено 2021-11-01 .
- ^ ab "Эксплуатация внутриядерного ускорения процессоров POWER для AIX" . Получено 01.11.2021 .
Внешние ссылки
appnote.txt
Спецификация формата файла .ZIP компании PKWARE, Inc. Архивировано 05.12.2014 на Wayback Machine ; Раздел 10, X. Сжатие – Метод 8 .- RFC 1951 – Спецификация формата сжатых данных Deflate версии 1.3
- Домашняя страница zlib
- Объяснение алгоритма Deflate – Антей Фелдспар
- Расширенное применение суффиксных деревьев для сжатия данных. Архивировано 23 сентября 2016 г. на Wayback Machine – превосходный алгоритм для реализации Deflate от Джеспера Ларссона.
- Zip-файлы: история, объяснение и реализация — пошаговое руководство по реализации Deflate