【问题标题】:c++ what in-memory compression library?c++什么内存压缩库?
【发布时间】:2010-12-31 19:42:26
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

  • 如果任何压缩库正确处理指针,我会感到惊讶。
  • 指针实际上只是指向池开头的地址偏移量

标签: c++ compression in-memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在一些(很多?)应用程序中,zlib 的压缩强度旋钮并不是那么有用。它可以使压缩花费相当长的时间,但可能不会像简单地使用不同的系统那样减少输出大小(例如 bzip2,它可以比 zlib 在其最大设置下进行更极端的压缩,尽管速度成本很高)。不过,很高兴指出这一点。
    【解决方案3】:

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

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

    【讨论】:

    • bzip2 不适用于需要高速的地方。
    【解决方案4】:

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

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

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

    【讨论】:

    • 指针是内存池的地址偏移量。我真的不明白分页的问题。我需要压缩,因为我有一个实时系统,可以创建和重用大量数据
    • 分页并不总是可用的!例如。我在我的机器上禁用了它,因为它使它的响应速度更快并且不会耗尽我的 SSD!
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 2012-03-08
        相关资源
        最近更新 更多