Если вы инициализируете zlib с lm_init()
с 1
, 2
или 3
, вместо deflate()
будет использоваться подпрограмма deflate_fast()
, которая будет использовать меньшие буферы времени выполнения и более быстрые алгоритмы.Компромисс хуже сжатия.Это, вероятно, того стоит.
Если вы скомпилируете zlib с определением SMALL_MEM
, при хешировании входных строк он будет использовать меньшие хэш-блоки.В документации (в deflate.c
) утверждается:
/* Compile with MEDIUM_MEM to reduce the memory requirements or
* with SMALL_MEM to use as little memory as possible. Use BIG_MEM if the
* entire input file can be held in memory (not possible on 16 bit systems).
* Warning: defining these symbols affects HASH_BITS (see below) and thus
* affects the compression ratio. The compressed output
* is still correct, and might even be smaller in some cases.
*/
Надеемся, что эти два метода в сочетании могут привести zlib в соответствие с вашим приложением.Это вездесущий стандарт, и возможность повторного использования изношенных компонентов может стоить жертв в других местах приложения.Но если вы знаете что-то о распределении ваших данных, что позволяет вам писать свои собственные процедуры сжатия, вы можете добиться большего успеха, но вы можете быстро внедрить zlib - написание и тестирование ваших собственных данных может занять больше времени.
Обновление
Вот некоторые выходные данные zlib, созданного с SMALL_MEM
, с использованием различных настроек уровня сжатия, для первого найденного файла размером 600 КБ:
$ ls -l abi-2.6.31-14-generic
-rw-r--r-- 1 sarnold sarnold 623709 2011-03-18 18:09 abi-2.6.31-14-generic
$ for i in `seq 1 9` ; do /usr/bin/time ./gzip -c -${i} abi-2.6.31-14-generic | wc -c ; done
0.02user 0.00system 0:00.02elapsed 76%CPU (0avgtext+0avgdata 2816maxresident)k
0inputs+0outputs (0major+213minor)pagefaults 0swaps
162214
0.01user 0.00system 0:00.01elapsed 52%CPU (0avgtext+0avgdata 2800maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
158817
0.02user 0.00system 0:00.02elapsed 95%CPU (0avgtext+0avgdata 2800maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
156708
0.02user 0.00system 0:00.02elapsed 76%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
143843
0.03user 0.00system 0:00.03elapsed 96%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
140706
0.03user 0.00system 0:00.03elapsed 81%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
140126
0.04user 0.00system 0:00.04elapsed 95%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
138801
0.05user 0.00system 0:00.05elapsed 84%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
138446
0.06user 0.00system 0:00.06elapsed 96%CPU (0avgtext+0avgdata 2768maxresident)k
0inputs+0outputs (0major+210minor)pagefaults 0swaps
138446
Вся программа gzip
занимает около 2,6 мегабайта памяти, независимо от запрошенного уровня сжатия;возможно, простое использование нужных вам функций, а не всей программы gzip
могло бы снизить это число, но это может быть слишком дорого для вашей маленькой машины.