Объясните на пальцах, как работает сжатие WinRAR?

 
1 2 3 4
+
-
edit
 

Murkt

Pythoneer

Murkt>> Пробовал обычные фотки и картинки djvu сжимать?
Balancer> Нет. Я предпочитаю закручивать винты гаечным ключём, а не плоскогубцами и не пинцетами :D
Ну вот, и я о чём. Моя фраза ведь в контексте была, а не просто «дежавю - говноформат!» ;)
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
Murkt> Ну вот, и я о чём. Моя фраза ведь в контексте была, а не просто «дежавю - говноформат!» ;)

Ну, я не уловил такого контекста :)
 
+
-
edit
 

Kernel3

аксакал

Balancer> Что лишний раз говорит о том, что RLE - это не алгоритм, а семейство методов сжатия :)
? С какой стати? Классический пример эволюции, когда из простой сущности возникает другая, более сложная :)
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

Balancer

администратор
★★★★★
Kernel3> ? С какой стати? Классический пример эволюции, когда из простой сущности возникает другая, более сложная :)

Ты ещё скажи, что IBM PC не является машиной Тьюринга, потому что намного сложнее :D
 
+
-
edit
 

Kernel3

аксакал

Balancer> Ты ещё скажи, что IBM PC не является машиной Тьюринга, потому что намного сложнее :D
Некорректный пример. Разные изначально сущности. Скорее уж, можно сказать, что семейство микропроцессоров Pentium-4 не относится к 8086. Хотя и эволюционировало из них. И 8086 можно рассматривать как частный случай Р-4 (реальный режим работы) :P
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

Fakir

BlueSkyDreamer
★★★★☆
Murkt>> Пробовал обычные фотки и картинки djvu сжимать?
Balancer> Нет. Я предпочитаю закручивать винты гаечным ключём, а не плоскогубцами и не пинцетами :D

Ну, кто как, а я лично винты предпочитаю закручивать отвёрткой :lol:
(не удержался, чтоб не докопаться)
 
+
-
edit
 

Mishka

модератор
★★★
Naturalist>> В факсе/bmp групповое кодирование, это совсем не то.
Kernel3> Вообще говоря, RLE можно рассматривать как частный случай LZ-алгоритмов :P
Блин, да все нетеряющие методы можно рассматривать как один абстрактный метод. Просто единица информации разная — бит или байт, метод составления словаря разный — полная-частичная обработка, статистическая обработка. Ну и разные методы освобождения словаря. Есть такая отличная книжечка ещё времён СССР — URSS.ru - Купить книгу: Кричевский Р.Е. / Сжатие и поиск информации / Krichevskij R.E. — очень хорошая с точки зрения общей математической теории. Кому интересно, может купить. Многое будет понятно. Но книжка очень математична.
 
EE Татарин #21.01.2008 06:41  @Balancer#20.01.2008 20:01
+
-
edit
 

Татарин

координатор
★★★★☆
Murkt>> Пробовал обычные фотки и картинки djvu сжимать?
Balancer> Нет. Я предпочитаю закручивать винты гаечным ключём,
?! :)
Болты, может?
Потому что винты обычно закручивают таки отвёртками.

> а не плоскогубцами и не пинцетами :D
...или в жтом был смысл?
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
+
-
edit
 

mabusse

новичок
Популярно.
RAR, ZIP, ARJ и прочие - это лишь различные форматы архива, контейнеры. Как правило, архиваторы последовательно используют несколько алгоритмов сжатия, далее сжатые данные размещается в контейнере вместе с информацией об использованных кодеках. Все алгоритмы сжатия без потерь делятся на 2 большие группы - потоковые алгоритмы и блочные. Потоковые алгоритмы - могут работать в потоке :) - то есть, грубо говоря, на вход алгоритма поступают данные последовательно, хоть по одномы байту, на выходе тоже последовательно появляются сжатые данные. Это алгоритмы Хаффмана, примитивное кодирование длинных серий (пару лет назад курсовик знакомой делал - разработка архиватора на базе этой байды :) и наиболее совершенные из них - большое семейство словарных алгоритмов Лемпеля-Зива (LZ, LZW, deflating и др.).
Блочные алгоритмы отличаются тем, что для сжатия информации они должны изначально знать весь кусок сжимаемых данных. На практике, если входной файл большой, он разбивается на блоки, каждый из которых сжимается отдельно. Поэтому в потоке данные алгоритмы могут работать только так: накопить из входного потока блок данных, потом сжать его разом и выдать на выход. Эти алгоритмы более эффективны, чем поточные, но требуют больше ресурсов (и вообще довольно сложны для понимания, как там это все работает :) Примеры - алгоритм Барроуза-Уилера (перестановок), семейство PPM алгоритмов (самые сильносжимающие на сегодня, но и самые медленные). Их, наряду с поточными и используют современные архиваторы, напр. RAR, 7zip и даже совсем не новый ha (если кто помнит такой еще под DOS, жал тексты как черт, но очень медленно).
Помню точно, что RAR использует PPM, какой-то LZ-подобный алогритм и кодирование Хаффмана - а в каком порядке они применяются к сжимаемому блоку - уже не помню.
 
+
-
edit
 

Balancer

администратор
★★★★★
Fakir> Ну, кто как, а я лично винты предпочитаю закручивать отвёрткой :lol:

:D Да, конечно же болты имелись в виду :) А то получилось как про забивание шурупов молотком и закручивание гвоздей отвёрткой :)
 
+
-
edit
 

Mishka

модератор
★★★
Ну, блочные появились из-за того, ИМХО, что на поточных словарей не напасёшься. А полностью опустошив словарь (по переполнению сразу или постепенно — не важно), то преимущества потокового сжатия теряются. Хотя всякие мпеги работают с потоками и ограниченными словарями.
 
+
-
edit
 

mabusse

новичок
Mishka> Ну, блочные появились из-за того, ИМХО, что на поточных словарей не напасёшься.

Ну, не только, наверное. Если мы знаем все данные сразу, то у нас больше возможностей сжать их оптимальнее. Пример:

Преобразование Барроуза — Уилера

Используется, например, в bzip2. Специально посмотрел - из командной строки позволяет выбирать размер блока от 100 до 900кБ. Народ пишет, что это еще мало, в других архиваторах BWT используют с блоками до 16 МБ. Где-то читал, что Шекспир за свою жизнь написал в 2 раза меньше: около 8 МБ :)
 

TEvg

аксакал

админ. бан
Благодатная тема. Народ кинулся делиться знаниями. Изложу свое видение.

Информация может сжиматься без потерь данных и далее полностью восстанавливаться с точностью до байта различными способами

1) кодирование наиболее часто встречающихся букв (цифр и т.д.) более короткими кодами, а редко встречающихся - более длинными. Например буквы Е, А - встречаются в текстах очень часто их можно записать не 8 битами, как в исходном тексте, а тремя или даже двумя, зато другие буквы нам придется кодировать даже не 8, а гораздо большим количеством битов. Какой-нибудь букве Х может придется отвалить битов 11-12. Такое кодирование известно как кодирование Хаффмана. :) Есть и другие случаи реализации данного принципа. Например довольно известная азбука Морзе :) В ней самой распространенной букве Е присвоен самый короткий код - точка (.), буква А кодируется уже точкой-тире (.-), а буква С - тремя точками (...)

2) кодирование последовательности одинаковых символов, оно же RLE кодирование. К примеру имеются байты ААААААААА. На них можно не тратить целых девять байтов, а описать все как "9 букв А". Слову "букв" присваивается некий условный и не слишком длинный код. Если повторяющихся данных много, то этот метод дает хорошие результаты.
Повторяющиеся данные характерны например для рисованных вручную картинок, где имеется постоянный фон в сотни повторяющихся точек и мазки в которых повторяющихся точек тоже достаточно много.

3) выделение многократно встречающихся сочетаний символов и составление словаря таких сочетаний. Далее значения, вошедшие в словарь, в самом исходном тексте заменяются на короткие условные коды. А к сжатому файлику добавляется этот словарь, чтобы при декодировании можно было подставить всё обратно. Это LZ-кодирование.

Архиваторы используют обычно несколько методов сжатия.
 
Это сообщение редактировалось 22.01.2008 в 12:26

mabusse

новичок
TEvg> Благодатная тема. Народ кинулся делиться знаниями. Изложу свое видение ...

И, прошу заметить, совершенно справедливое видение. Разве что еще инкрементное сжатие можно добавить (дельта-кодирование) - например, тот же ADPCM.
Но в погоне за лишними процентами или десятками процентов степени сжатия часто используются предварительные преобразования данных перед собственно компрессией. Просто и доступно можно глянуть тут:
Алгоритмы сжатия без потерь
 
+
-
edit
 

Mishka

модератор
★★★
mabusse> Ну, не только, наверное. Если мы знаем все данные сразу, то у нас больше возможностей сжать их оптимальнее. Пример:

Дык, если обработаем весь поток сразу (бесконечный словарь), то какая разница с блочным?

mabusse> Преобразование Барроуза — Уилера
mabusse> Используется, например, в bzip2. Специально посмотрел - из командной строки позволяет выбирать размер блока от 100 до 900кБ. Народ пишет, что это еще мало, в других архиваторах BWT используют с блоками до 16 МБ. Где-то читал, что Шекспир за свою жизнь написал в 2 раза меньше: около 8 МБ :)

У блочного минус тот, что словарь от предыдущих блоков не переиспользуется часто. Поэтому часто у блочных наполнение словаря начальное может быть статистическое — кто-то посчитал когда-то.
 
+
-
edit
 

Mishka

модератор
★★★
Есть ещё функциональное сжатие. Но это больше для специфических данных. Типа ряда Фурье — коэффициенты и шаг сетки, а не множество точек.
 

Fakir

BlueSkyDreamer
★★★★☆
TEvg> 1) кодирование наиболее часто встречающихся букв (цифр и т.д.) более короткими кодами, а редко встречающихся - более длинными.
TEvg> 2) кодирование последовательности одинаковых символов, оно же RLE кодирование. К примеру имеются байты ААААААААА. На них можно не тратить целых девять байтов, а описать все как "9 букв А".

По идее, наверное, более корректно было бы говорить не о "буквах", а о последовательностях битов? Архиватору-то, наверное, всё равно, с файлом какого формата он имеет дело - текст это (с буквами в прямом смысле), картинка, звук, или что-либо другое? Вряд ли же архиватор пользуется разными алгоритмами в зависимости от типа файла?
 
+
-
edit
 

mabusse

новичок
Mishka> Дык, если обработаем весь поток сразу (бесконечный словарь), то какая разница с блочным?

Для примера те же BWT или там MTF - начальное преобразование данных перед сжатием (безо всяких словарей, это затем уже преобразованные данные сжимаются словарным или каким еще способом.) Улучшает сжатие, но автоматически делает компрессор в целом блочным. В потоковом режиме компрессор с BWT никак использовать не получится, ну только что с ма-аленькими блочками :). Так что получается либо:
1. чисто блочный компрессор с BWT (а для собственно компрессии там хоть LZ с большущим словарем на весь блок)
2. либо потоковый компрессор в блочном режиме, запихавший в себя весь входной поток и отрастивший большой словарь. Но без BWT, ибо он поточный от рождения, просто его так работать заставили :)
И если исходный файл влазит в блок целиком, то от варианта 1. логично ждать лучшей компрессии.
В общем, чем-то напоминает обычную дилемму специализированного (1.) и более универсального, но в чем-то компромиссного решения (2.)

Mishka> У блочного минус тот, что словарь от предыдущих блоков не переиспользуется часто.

Да, поэтому, наверное, будет лучший вариант - блочное предварительное преобразование, затем сжатие сплошным потоком. Гибрид эдакий. Возможно в архиваторах так и делают.
 

mabusse

новичок
Fakir>Архиватору-то, наверное, всё равно, с файлом какого формата он имеет дело - текст это (с буквами в прямом смысле), картинка, звук, или что-либо другое? Вряд ли же архиватор пользуется разными алгоритмами в зависимости от типа файла?

На самом деле разница есть. К примеру, WAv лучше сжимать дельта-кодированием (ADPCM) чем LZ. Тексты - наоборот.
Да и архиваторы теперь поумнели. Открой WinRAR - при добавлении файла в архив там вкладка "Дополнительно" -> "Параметры сжатия...". Можешь ему примерно намекнуть, что сжимать будем, если он сам правильно затрудняется определить. И в 7zip что-то подобное есть.
Не заметил, правда, что на практике это хоть как-то помогает WinRAR-у сжимать мультимедию. Ну да понятно, ужимать mp3 - дохлый номер :)
 
Это сообщение редактировалось 22.01.2008 в 16:51
EE Татарин #22.01.2008 16:52  @Fakir#22.01.2008 15:30
+
-
edit
 

Татарин

координатор
★★★★☆
TEvg>> 1) кодирование наиболее часто встречающихся букв (цифр и т.д.) более короткими кодами, а редко встречающихся - более длинными.
TEvg>> 2) кодирование последовательности одинаковых символов, оно же RLE кодирование. К примеру имеются байты ААААААААА. На них можно не тратить целых девять байтов, а описать все как "9 букв А".
Fakir> По идее, наверное, более корректно было бы говорить не о "буквах", а о последовательностях битов? Архиватору-то, наверное, всё равно, с файлом какого формата он имеет дело - текст это (с буквами в прямом смысле), картинка, звук, или что-либо другое? Вряд ли же архиватор пользуется разными алгоритмами в зависимости от типа файла?
"Буквы" тут может быть в смысле "знаки алфавита" (который может существенно меняться от задачи к задаче).
А вот во втором - ты не прав. Тот же RAR, вроде, делает кое-какие предположения по типу файла.

Кстати, именно на забытое здесь всеми (кроме Мишки :)) функциональное сжатие приходится наибольшее число "сэкономленых байт" - это звук, видео; тексты отдыхают.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
EE Татарин #22.01.2008 16:55  @mabusse#22.01.2008 16:33
+
-
edit
 

Татарин

координатор
★★★★☆
Mishka>> У блочного минус тот, что словарь от предыдущих блоков не переиспользуется часто.
mabusse> Да, поэтому, наверное, будет лучший вариант - блочное предварительное преобразование, затем сжатие сплошным потоком. Гибрид эдакий. Возможно в архиваторах так и делают.
Большинство хоть сколь-нить применимых алгоритмов сжатия - сильно энтропийны (в этом высказывании, как ни странно, нет смысловой тавтологии :)). Поэтому сжимать сжатое, как правило, почти бестолку.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
RU Kernel3 #22.01.2008 16:56  @Татарин#22.01.2008 16:52
+
-
edit
 

Kernel3

аксакал

Татарин> Кстати, именно на забытое здесь всеми (кроме Мишки :)) функциональное сжатие приходится наибольшее число "сэкономленых байт" - это звук, видео; тексты отдыхают.
Функциональное сжатие - это компрессия с потерями, посему практически оффтопик :F
Broken Windows® cures my ills and makes me feel alright... ©  
EE Татарин #22.01.2008 16:59  @Kernel3#22.01.2008 16:56
+
-
edit
 

Татарин

координатор
★★★★☆
Татарин>> Кстати, именно на забытое здесь всеми (кроме Мишки :)) функциональное сжатие приходится наибольшее число "сэкономленых байт" - это звук, видео; тексты отдыхают.
Kernel3> Функциональное сжатие - это компрессия с потерями, посему практически оффтопик :F
В WinRARe его нет, так что оффтопик, да.

Но вот насчёт потерь - это ерунда. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
RU Kernel3 #22.01.2008 17:02  @Татарин#22.01.2008 16:59
+
-
edit
 

Kernel3

аксакал

Татарин> Но вот насчёт потерь - это ерунда. :)
да ладно? Фурье-преобразование вы точно обратимым не сделаете в реальной жизни :) А вот есть ли другие методы без потерь - хз. Я таких не знаю :)
Broken Windows® cures my ills and makes me feel alright... ©  
RU Kernel3 #22.01.2008 17:04  @Татарин#22.01.2008 16:55
+
-
edit
 

Kernel3

аксакал

Татарин> Поэтому сжимать сжатое, как правило, почти бестолку.
Ну, эээ... Компрессия по определению повышает информационную энтропию :) Как и шифрование, кстати :)
Broken Windows® cures my ills and makes me feel alright... ©  
1 2 3 4

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru