OberonCore
https://forum.oberoncore.ru/

простой и маленький LZ-компрессор
https://forum.oberoncore.ru/viewtopic.php?f=47&t=6947
Страница 1 из 1

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

понадобилось мне тут быстропожать всякое, а 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 КБ]
Скачиваний: 430

Автор:  arisu [ Воскресенье, 04 Июнь, 2023 08:59 ]
Заголовок сообщения:  Re: простой и маленький LZ-компрессор

p.s.: считайте, что код под WTFPL, как обычно.

Автор:  Борис Рюмшин [ Воскресенье, 04 Июнь, 2023 15:30 ]
Заголовок сообщения:  Re: простой и маленький LZ-компрессор

Спасибо, штука полезная.

Автор:  arisu [ Понедельник, 05 Июнь, 2023 00:20 ]
Заголовок сообщения:  Re: простой и маленький LZ-компрессор

может и tiny inflate тогда оформить под mainline и выложить отдельно, а не в составе LC? 20 кб, распаковщик deflate-потоков, обычных и raw. у меня вон трудится, распаковывая пинги.

Автор:  arisu [ Воскресенье, 11 Июнь, 2023 19:20 ]
Заголовок сообщения:  Re: простой и маленький LZ-компрессор

чисто ради интереса сделал эксперимент: уменьшил словарь до 64 кб, но впилил энтропийный кодек и пол-дюжины битовых моделей 9+ порядка. тарбол пожало за три секунды, гзип обошло на 100 кб.

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

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

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

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

Автор:  arisu [ Воскресенье, 11 Июнь, 2023 22:28 ]
Заголовок сообщения:  Re: простой и маленький LZ-компрессор

а если радикально уменьшить количество предсказателей, то дополнительной памяти надо 8 кб (плюс депакеру 128 кб на словарь), пакует не хуже, и депакер можно сделать потоковым. упс.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/