OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 11:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: простой и маленький LZ-компрессор
СообщениеДобавлено: Воскресенье, 04 Июнь, 2023 08:51 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
понадобилось мне тут быстропожать всякое, а zlib расчехлять неохота: жирный, страшный, лаяй. вспомнил про один свой старенький компрессор на си, портанул. благо, там кода-то…

чистейший LZ, выдаёт битовый поток, сжимает и разжимает строго из памяти в память. компрессору надо source_size*16 байт хипа и чуть более 4 кб стека, декомпрессору ничего кроме выходного буфера. размер распакованых данных для декомпрессора надо знать заранее, и буфер передавать соответствующего размера (это элементарно чинится, просто мне не надо).

чтобы вы понимали прелесть: размер компрессора около двухсот строчек (~6 кб исходника), декомпрессора около ста строчек (~3 кб исходника). они независимы, можно просто копипастить по месту. жмёт получше всяких lz4. параметры в компрессоре лучше не трогать: они методом ненаучной магии подобраны под более-менее производительность и compression ratio на разных наборах данных.

чисто по приколу: на level=normal тарбол "sqlite-autoconf-3360000.tar" у меня жмёт вот так:
packing 11,724,800 bytes...
packed: 3,383,942 in 6.505 seconds

а если вам очень хочется один раз пожать, но хорошо, то жмите с уровнем ultra, будет вот так:
packing 11,724,800 bytes...
packed: 2,800,464 in 397.077 seconds
это, кстати, лучше, чем gzip (ну ещё бы, со словарём в десять мегабайт-то, лол).

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


Вложения:
KthLzff.odc [12.13 КБ]
Скачиваний: 335
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 04 Июнь, 2023 08:59 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
p.s.: считайте, что код под WTFPL, как обычно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 04 Июнь, 2023 15:30 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Спасибо, штука полезная.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Июнь, 2023 00:20 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
может и tiny inflate тогда оформить под mainline и выложить отдельно, а не в составе LC? 20 кб, распаковщик deflate-потоков, обычных и raw. у меня вон трудится, распаковывая пинги.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Июнь, 2023 19:20 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
чисто ради интереса сделал эксперимент: уменьшил словарь до 64 кб, но впилил энтропийный кодек и пол-дюжины битовых моделей 9+ порядка. тарбол пожало за три секунды, гзип обошло на 100 кб.

публиковать не буду, потому что грязный эксперимент, код больше, и лень под mainline адаптировать. кому интересно — в личке попросите, но адаптировать сами будете. ;-)

краткое описание: битовый range coder (для алфавита из одного бита, внутренней разрядностью 32), 17-битовый предиктор (там механика чуть сложнее, ну да неважно), модель 256*256 предикторов для байта. по две байтовых модели на счётчик литералов, смещения и длины. памяти жрёт дополнительно несколько мегов, но энтропийный кодек того стоит. плюс в такой конфигурации это буквально десять строк кода для предиктора, и по десятку для encode и decode. делений не использует, только одно умножение (правда, LONGINT'а), и сдвиги.

недостаток в том, что декомпрессор тоже жрёт эти мегабайты, потому что ему, натурально, те же самые модели нужны. и медленней, само собой.

глубокого смысла эксперимент не имеет, но удержаться было сложно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Июнь, 2023 22:28 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
а если радикально уменьшить количество предсказателей, то дополнительной памяти надо 8 кб (плюс депакеру 128 кб на словарь), пакует не хуже, и депакер можно сделать потоковым. упс.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB