Использование памяти zlib / производительность.С 500 КБ данных - PullRequest
4 голосов
/ 19 марта 2011

Стоит ли zLib? Есть ли другие лучше подходящие компрессоры?

Я использую встроенную систему. Часто для моего приложения доступно всего 3 МБ ОЗУ или меньше. Поэтому я рассматриваю возможность использования zlib для сжатия моих буферов. Однако меня беспокоят накладные расходы.

Средний размер буфера будет 30 КБ. Вероятно, это не будет сжато zlib . Кто-нибудь знает хороший компрессор для чрезвычайно ограниченных сред памяти?

Однако , я буду иногда испытывать максимальный размер буфера 700 КБ, при этом 500 КБ встречаются гораздо чаще. Стоит ли в этом случае zlib? Или это слишком много, чтобы оправдать накладные расходы?

Мои единственные соображения относительно сжатия: накладные расходы ОЗУ алгоритма и производительность , по крайней мере, такие же хорошие , как у zlib.

ЛИЦЕНЗИЯ : Я предпочитаю, чтобы компрессор имел лицензию BSD, zLib или эквивалентную лицензию.

Ответы [ 3 ]

5 голосов
/ 19 марта 2011

Если вы инициализируете 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 могло бы снизить это число, но это может быть слишком дорого для вашей маленькой машины.

3 голосов
/ 19 марта 2011

Посмотрите на LZO .

Из документации:

  • Не требует памяти для распаковки.
  • Требуется64 кБ памяти для сжатия.

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

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

1 голос
/ 22 марта 2011

LZS - это очень простой компрессор и декомпрессор с раздвижными окнами, предназначенный для использования в различных интернет-протоколах.Это может быть хорошим техническим решением.

Я написал код на C и Python для LZS сжатия и распаковки .

...