Embedded zlib内存使用率/性能。有500kb的数据 zLib值得吗?还有其他更适合的压缩机吗?

Embedded zlib内存使用率/性能。有500kb的数据 zLib值得吗?还有其他更适合的压缩机吗?,embedded,memory-management,zlib,compression,Embedded,Memory Management,Zlib,Compression,我使用的是嵌入式系统。通常,我的应用程序只有3MB或更少的RAM可用。因此,我正在考虑使用zlib压缩缓冲区。不过,我担心的是开销 缓冲区的平均大小为30kb这可能不会被zlib压缩。有谁知道适用于内存极其有限的环境的好压缩机吗 然而,我偶尔会遇到700kb的最大缓冲区大小,500kb更常见在这种情况下zlib值得吗?还是开销太大而无法解释? 我对压缩的唯一考虑是算法的RAM开销,以及性能,至少与zlib一样好 许可证:我希望压缩机获得BSD、zLib或同等许可证。如果使用lm_init()和1

我使用的是嵌入式系统。通常,我的应用程序只有3MB或更少的RAM可用。因此,我正在考虑使用zlib压缩缓冲区。不过,我担心的是开销

缓冲区的平均大小为30kb这可能不会被zlib压缩。有谁知道适用于内存极其有限的环境的好压缩机吗

然而,我偶尔会遇到700kb的最大缓冲区大小,500kb更常见在这种情况下zlib值得吗?还是开销太大而无法解释?

我对压缩的唯一考虑是算法的RAM开销,以及性能,至少与zlib一样好


许可证:我希望压缩机获得BSD、zLib或同等许可证。

如果使用
lm_init()
1
2
3
初始化zLib,将使用
deflate\u fast()
例程代替
deflate()
,这将使用更小的运行时缓冲区和更快的算法。折衷是更糟糕的压缩。这可能是值得的

如果编译zlib时定义了
SMALL_MEM
,则在对输入字符串进行散列时,它将使用较小的散列桶。文档(在
deflate.c
中)声称:

希望这两种技术的结合能够使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.6MB的内存,而不考虑要求的压缩级别;也许仅仅使用您需要的特定功能而不是整个
gzip
程序就可以降低这个数字,但是对于您的小机器来说,这可能太贵了。

请看一看

从文件中:

  • 解压缩不需要内存
  • 压缩需要64 kB的内存
如果您巧妙地安排数据,您可以(就地)进行重叠 解压,这意味着你可以解压到相同的状态 压缩数据所在的块

在进行压缩时,还可以部分覆盖缓冲区

是一个非常简单的滑动窗口压缩器和解压缩器,指定用于各种Internet协议。这可能是一个很好的技术解决方案


我已经为编写了一些C和Python代码。

许可证几乎使我无法将此作为答案。我更喜欢zLib或BSD license.Unixman83,顺便提一下,该许可证可能只是一个小麻烦:您可能会拼凑一个新的守护进程,对管道提供的数据进行解压缩,以将代码与GPL的“链接病毒”隔离开来。如果LZO的内存确实比zlib少,并且提供了类似的压缩和运行时,那么设置内存屏障可能是值得的。@sarnold以数百KB的代价创建一个单独的ELF可执行文件。我在一个嵌入式设备上,只有4MB的闪存用于存储,16MB的RAM。@unixman83,@sarnold–另外,可能有一个理由认为整个固件是一个程序。然而,我认为如果在技术上符合您的需要,您可以轻松获得LZO的商业许可证。SMALL_MEM已经过时。debian中出现了模糊的引用,似乎表明在现代libs中根本不需要它。不在最近的资料来源tarball.Unixman83,人力资源管理;我从Ubuntu的
apt-get-source-gzip
获得了我的源代码。我想知道他们离Debian的源代码还有多远。也许这是Debian特有的补丁。SMALL_MEM无论如何都不会出现在zlib.net的产品版本中。当你说“性能”时,你是指速度还是压缩比?您会在嵌入式系统中进行压缩、解压缩,还是同时进行压缩和解压缩?您更关心压缩性能还是解压缩性能?两者都关心。“性能”指的是RAM使用/开销。
$ 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