zLib值得吗?还有其他更适合的压缩机吗? 我正在使用嵌入式系统.通常,我的应用程序只有3MB或更少的RAM可用.所以我正在考虑使用zlib压缩我的缓冲区.然而,我担心开销. 缓冲区的平均大小
我正在使用嵌入式系统.通常,我的应用程序只有3MB或更少的RAM可用.所以我正在考虑使用zlib压缩我的缓冲区.然而,我担心开销.
缓冲区的平均大小为30kb.这可能不会被zlib压缩.对于极其有限的内存环境,有谁知道一个好的压缩器?
但是,我偶尔会遇到700kb的最大缓冲区大小,更常见的是500kb.在这种情况下,zlib值得吗?或者开销太大而无法证明?
我对压缩的唯一考虑因素是算法的RAM开销和性能至少与zlib一样好.
许可证:我更喜欢压缩机根据BSD,zLib或同等许可证获得许可.
如果使用lm_init()使用1,2或3初始化zlib,则将使用deflate_fast()例程而不是deflate(),这将使用较小的运行时缓冲区和更快的算法.权衡压缩更糟糕.这可能是值得的.如果使用定义的SMALL_MEM编译zlib,则在散列输入字符串时将使用较小的散列桶.文档(在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 – 编写和测试自己可能需要更多时间.
更新
这是在我找到的第一个600k文件上使用不同压缩级别设置使用SMALL_MEM构建的zlib上的一些输出:
$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程序会将这个数字降低一些,但对于你的小机器来说可能太昂贵了.