用于 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 亿 float
s),到目前为止我一直使用 lz4,但它只处理 int
计数char
s。由于我的向量中有 60 亿个字符,因此需要 33 位来表示,并且 LZ4 的压缩无法按我的需要进行。
根据我在 zlib 库中看到的,它需要 int 以及压缩数据长度的输入。
我是否需要对我的数据进行分段,或者是否有一个框架能够处理超过 32 位的 char
s,或者我遗漏了什么?
【问题讨论】:
我现在要分段,因为它是最简单的解决方案,而且您已经有了它的代码。在这些尺寸下,您不会损失太多效率,也不必学习/导入新系统... 我知道这不是您问题的核心,但您可能想澄清一下您的意思是float
s 还是 char
s - 您似乎可以互换使用它们。
我在数组中有 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 位的元素的主要内容,如果未能解决你的问题,请参考以下文章