寻求更好的编码和压缩数字的方法

时间:2012-04-12 06:43:02

标签: c++ encoding numbers

我有13个数字来自一组有13种类型的数据,每种类型有4项,所以总共52项。我们可以将项目编号为1,2,3,4,5,6,7,8,9,10,11,12,13,因此将有4“1”,4“2”,...... 4集合中的“13”。从集合中绘制的13个数字是随机的。整个过程重复了数百万甚至更多,所以我需要一种有效的方法来存储13个数字。我正在考虑使用某种编码方法将13个整数压缩成位。例如,我计算多少“1”,“2”......首先,用2位编码每个项目的计数,并再使用1位来表示项目是否被绘制。因此,对于每个项目,我们需要3位,总共13项目需要39位。它肯定需要8个字节才能这样做。但是,由于我正在讨论数百万或数十亿次计算,因此它仍然太多,以后每个集合都必须存储到文件中。因此,如果我使用8个字节,如果仍然要求我的数据大约80GB。但是,如果我可以减少一半,我将节省40GB。知道如何更有效地压缩这种结构吗?我还想到使用5个字节而不是我需要处理不同类型的数字(一个int +一个char),c ++中的任何库都可以轻松地为我编码/压缩吗?

感谢。

4 个答案:

答案 0 :(得分:1)

Google的协议缓冲区可以使用较少的位存储整数,具体取决于其值。它可能会显着降低您的存储空间见http://code.google.com/p/protobuf/

此处描述了实际协议:https://developers.google.com/protocol-buffers/docs/encoding

至于压缩,你看过zlib处理数据的方式吗?

答案 1 :(得分:1)

根据您的方案,由8位64位表示的39位的每一手将浪费25位,大约40%。

如果您将手放在一起,您可以代表它们而不会浪费这些位。

39和64没有共同因素,因此最低公倍数只是多个39 * 64 = 2496位或312字节。它拥有64只手,大约是你当前计划规模的60%。

答案 2 :(得分:0)

可能比你想要的更复杂,但请查看HDF5

答案 3 :(得分:0)

尝试谷歌搜索LV77和LVZ压缩