我有1024字节的数组(8192位),它们大多为零。
将设置0.01%至10%的位(随机,无模式)。
由于缺乏结构和相对较小的尺寸,如何压缩这些设备?
(我的第一个想法是存储集合位之间的距离。我每段距离需要13位,但在最坏的情况下,10%的占用率需要13 * 816 / 8 = 1326字节,这不是一个改进。)
这是用于超低带宽通信的,所以每个字节都很重要。
发布于 2017-07-21 09:15:32
我已经深入地处理了一个类似的问题,但是我的集合要大得多(每个集合中有3000万个可能的值,每个集合中有1到3000万个元素),所以它们都从压缩中获得了更多的好处,而且压缩元数据与数据的大小相比是微不足道的。我从来没有把东西压缩成比uint16_t小的单位,所以如果你开始把13位值切成碎片,我在下面写的东西可能就不适用了。感觉它应该有效,但请注意。
我所发现的工作是采用几种依赖于我们所拥有的特定数据的策略。好消息是,每组中的元素数是一个非常好的指示符,可以很好地指示哪种压缩策略对特定的集合最有效。因此,您需要的所有元数据都是集合中元素的计数。在我的数据格式中,第一个也是唯一的元数据值(我将不具体地称之为“值”,您可以按字节、16位值或13位值压缩数据)是集合中元素的计数,其余的只是set元素的编码。
这些战略是:
我只是含糊其辞地尝试在集合中保存数字之间的差值。快速实验表明,它们实际上并不比我提到的策略有效得多,存在不可预测的退化情况,但最重要的是,我所使用的应用程序实际上不需要反序列化其数据,只需直接从磁盘(mmap)使用它。
https://stackoverflow.com/questions/45232659
复制相似问题