用于 C/C++ 的压缩库能够处理数组中超过 32 位的元素

Posted

技术标签:

【中文标题】用于 C/C++ 的压缩库能够处理数组中超过 32 位的元素【英文标题】:Compression library for C / C++ able to deal with more than 32 bit elements in the array 【发布时间】:2013-02-07 18:19:28 【问题描述】:

我有一个问题,我需要压缩大约 6 GB std::vector()(其中有 15 亿 floats),到目前为止我一直使用 lz4,但它只处理 int 计数chars。由于我的向量中有 60 亿个字符,因此需要 33 位来表示,并且 LZ4 的压缩无法按我的需要进行。

根据我在 zlib 库中看到的,它需要 int 以及压缩数据长度的输入。

我是否需要对我的数据进行分段,或者是否有一个框架能够处理超过 32 位的 chars,或者我遗漏了什么?

【问题讨论】:

我现在要分段,因为它是最简单的解决方案,而且您已经有了它的代码。在这些尺寸下,您不会损失太多效率,也不必学习/导入新系统... 我知道这不是您问题的核心,但您可能想澄清一下您的意思是 floats 还是 chars - 您似乎可以互换使用它们。 我在数组中有 15 亿个浮点数,但压缩时需要一个 char 数组作为输入,因此长度为 60 亿个字符。 我倾向于同意 Michael 的观点 - 与切换到不同的库相比,分段似乎是一个相当简单的解决方案。我会编写一个处理它的包装类,这样您的调用代码就不必关心数据是否被分段。然后,如果您决定稍后升级库,您的主代码不会受到影响。 是的,将输入分成更小的输入块。这是要走的路。请注意,这就是处理 >4GB 输入的库正在做的事情。 【参考方案1】:

使用 zlib,并将数组作为几个块传递。 zlib 使用的 DEFLATE 算法的窗口大小约为 32 KB,并且已经对压缩后的数据进行了缓冲,因此将数据作为多个 chunk 传入不会影响压缩效率。

【讨论】:

【参考方案2】:

看看XZ,它似乎可以处理非常大的尺寸。 CLI 可执行文件本身是库的瘦包装器,因此这应该符合您的要求。

OTOH,binary 浮点流不应该压缩得那么好...

【讨论】:

二进制浮点数流的压缩程度取决于流的内容。给定一个好的压缩算法,它会压缩到与压缩文本表示相同的大小。例如。 std::vector<float>(1000000, 0.0f) 可以很好地压缩,无论是表示为文本还是二进制。 压缩应该不会太差,因为所有的浮点数都在10-30的范围内,所以大多数时候指数会非常相似。如果我压缩原始文件,它会给我大约 60% 的压缩率,这对我来说非常好。

以上是关于用于 C/C++ 的压缩库能够处理数组中超过 32 位的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在处理 r 中超过 500 万个观测值的数据框时加快迭代速度?

数组中超过一半的数

数组中超过一半的数字

剑指offer-数组中超过一半的数字

查找一个数组中超过一半的元素

Vim 中超过 80 个字符的高亮行不适用于 php