6

我已经用谷歌搜索了内存压缩,并找到了很多提供此功能的库。zlib 似乎被广泛使用 - 但它似乎也很老了。我在这里问是否有更新,更好的选择。

我要在内存中压缩的数据是大小为几兆字节(2-16 MB)的内存池,每个块都包含两个不同结构的数据以及一些指针数组。在块内部,结构和数组没有特定的顺序,它们只是在应用程序需要创建这样的元素时一个接一个地分配。

你会为此建议什么压缩库?压缩和解压缩性能(两者)比压缩质量更重要。

此外-出于压缩原因-为两个不同的结构和数组设置单独的池会更好吗,以便每个要压缩的数据块仅包含一种数据?

这是我第一次打算使用内存压缩,我知道我的问题可能过于笼统而无法给出一个好的答案 - 但欢迎每一个提示!

谢谢!

4

6 回答 6

10

zlib 不错。经验证、性能卓越,并为许多人所理解。这是我在你描述的新系统中默认使用的。它的年龄应该被视为其最大的资产之一。

于 2010-01-02T17:58:59.280 回答
3

对于比 zlib 更现代的东西,libbzip2可能值得一看。为了兼容性,它提供了与 zlib 类似的接口。在很多情况下,它提供了更好的压缩,但会降低性能。

对于比 zlib 更快的东西(但它也不压缩......)有LZO

于 2010-01-02T18:05:23.777 回答
1

如果压缩/解压缩速度对您很重要,您应该看看 LZO:

http://www.oberhumer.com/opensource/lzo/

与 zlib 相比,代码更小且更易于使用。

于 2010-01-02T22:44:20.720 回答
1

在带有虚拟内存管理器的现代操作系统上这样做是没有意义的。您将创建一个对任何东西都无用的字节块,无缘无故地占用您的虚拟内存地址空间中的空间。内存管理器不会将它留在 RAM 中很长时间,它会注意到该 blob 占用的页面没有被访问并将其交换到页面文件。

此外,如果数据包含指针,则必须翻译数据。您能够在完全相同的虚拟内存地址解压缩数据以使指针仍然有效的几率非常接近于零。毕竟,你这样做是为了释放虚拟内存空间,数据之前使用的空洞将被其他东西占用。这种翻译可能不会是微不足道的,它会占用大量额外的记忆。

如果您这样做是为了避免 OOM,请查看操作系统对内存映射文件的支持并考虑切换到 64 位代码。

于 2010-01-02T18:50:49.210 回答
0

对于压缩,数据很重要。在内存中压缩任意二进制数据完全是浪费时间,会极大地降低您的性能,并且最终可能会使您的内存使用率更高。

如果你真的需要更多的内存,你应该考虑使用 VirtualAlloc 或 sbrk 来自己控制内存。这样您就可以寻址所有物理内存,而不仅仅是 2-4gb。

于 2010-01-03T05:11:23.517 回答
0

我不知道有什么比 zlib 更新/更好的东西...... zlib 工作正常,尽管它很老。zlib 的 deflateInit() 有一个参数可以让您在压缩速度与压缩大小之间进行权衡,因此您可以尝试使用它来找到最适合您的应用程序的设置。

可能有 C++ 包装器 API 为您调用 zlib C API,如果您想要“更漂亮”的东西......或者如果没有,它很容易编写您自己的。

于 2010-01-02T17:59:45.737 回答