понадобилось мне тут быстропожать всякое, а 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 (ну ещё бы, со словарём в десять мегабайт-то, лол).
декомпрессору, натурально, плевать на уровни сжатия, он ничего дополнительно не требует.
|