embedded - zlib 内存使用/性能。具有 500kb 数据

标签 embedded memory-management zlib compression

zLib 值得吗?还有其他更适合的压缩机吗?

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

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

但是,我偶尔会遇到 700kb 的最大缓冲区大小,其中 500kb 更常见。 在这种情况下 zlib 值得吗?还是开销太大而无法证明其合理性?

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

许可证:我更喜欢压缩器获得 BSD、zLib 或同等许可证的许可。

最佳答案

如果使用 lm_init() 初始化 zlib与 1 , 2 ,或3deflate_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 放到适当的位置 - 编写和测试您自己的压缩例程可能需要更多时间。

更新

这是使用 SMALL_MEM 构建的 zlib 的一些输出,使用不同的压缩级别设置,在我找到的第一个 600k 文件上:

$ 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 MB 的内存;也许只是使用您需要的特定功能而不是整个 gzip程序会降低这个数字一些,但对于你的小机器来说可能太贵了。

关于embedded - zlib 内存使用/性能。具有 500kb 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358987/

相关文章:

linux - 为 RFS 选择 squashfs

linux - 停止 qt 写入/dev/tty0

c - malloc 中的信号 11 SIGSEGV?

C 2D 字符串数组在其声明的函数之外导致段错误

iphone - 解除分配 UIApplicationDelegate 拥有的对象有什么好处吗?

python - 解析帝国时代游戏记录文件(.mgx)

c++ - 编译用于高放射性环境的应用程序

c - 我怎样才能从 main while 循环(C 编程)中逃脱?

c++ - 与 Visual Studio 2010 的静态 libpng 链接

language-agnostic - 258 双编码的放气长度