我已经搜索了内存中的压缩,发现有很多库不具备此功能。 zlib似乎被广泛使用 - 但它似乎也很老了。我在这里问是否有更新,更好的选择。
我想在内存中压缩的数据是大小为几兆字节(2-16 MB)的内存池,每个块包含两个不同结构的数据以及一些指针数组。在块内部,结构和数组没有特定的顺序,当应用程序需要创建这样的元素时,它们只是在另一个之后被分配。
你会建议使用什么压缩库?压缩和解压缩性能(两者)比压缩质量更重要。
另外 - 出于压缩原因 - 为两个不同的结构和数组分别使用单独的池会更好吗,这样每个要压缩的数据块只包含一种数据?
这是我第一次打算使用内存中压缩,我知道我的问题可能过于笼统,无法给出一个好的答案 - 但是每个提示都是受欢迎的!
THX!
答案 0 :(得分:9)
zlib很好。许多人都证明,表现和理解。这就是我在新系统中默认使用的内容,就像你描述的那样。它的年龄应被视为其最大的资产之一。
答案 1 :(得分:3)
对于比zlib更现代的东西,libbzip2可能值得一看。它提供了与zlib类似的接口,以实现兼容性。在很多情况下,它提供了更好的压缩效果,但性能成本却很高。
对于比zlib更快的东西(但也不会压缩......),有LZO。
答案 2 :(得分:1)
在具有虚拟内存管理器的现代操作系统上执行此操作毫无意义。你将创建一个对任何东西都没用的字节blob,在你的虚拟内存地址空间占用空间是没有充分理由的。内存管理器不会将它留在RAM中很长时间,它会注意到blob占用的页面没有被访问并将其交换到页面文件。
此外,如果数据包含指针,则必须翻译数据。您可以在完全相同的虚拟内存地址解压缩数据的几率,使得指针仍然有效,非常接近于零。毕竟,你这样做是为了释放虚拟内存空间,以前数据使用的漏洞将被其他东西占用。这种翻译可能不会是微不足道的,而且会占用大量额外的内存。
如果您这样做是为了避免使用OOM,请查看内存映射文件的操作系统支持,并考虑切换到64位代码。
答案 3 :(得分:1)
答案 4 :(得分:0)
我不知道有什么比zlib更新/更好... zlib工作正常,尽管它的年龄。 zlib的deflateInit()有一个参数,可以让您将压缩速度与压缩大小进行权衡,因此您可以尝试使用它来查找最适合您应用程序的设置。
可能有C ++包装器API为你调用zlib C API,如果你想要一些“更漂亮”的东西......或者如果没有,那就很容易编写你自己的。
答案 5 :(得分:0)
对于压缩,数据非常重要。在内存中压缩任意二进制数据是完全浪费时间,会极大地降低性能,并可能最终使内存使用率更高。
如果你真的需要更多的内存,你应该看看使用VirtualAlloc或sbrk自己控制内存。通过这种方式,您可以处理所有物理内存,而不仅仅是2-4gb。