java中的整数压缩

java中的整数压缩,java,compression,data-compression,Java,Compression,Data Compression,我有一个整数序列,格式如下: Integer1 Integer2 Integer3 Integer4 Integer5 .... 每四个连续整数对应于单个记录的值。所以,我真的不能点 压缩此类文件的最佳方式是什么 更新: 1-这些值相互独立。每4个连续整数代表一条记录,例如: CustomerId PurchaseId产品费用 每个都有一个整数值 2-理想情况下,我希望将其压缩为对象并存储在磁盘上 谢谢最简单、最兼容的方法是在编写文件时对其进行GZIP处理,方法是使用GZIPOutputStr

我有一个整数序列,格式如下:

Integer1 Integer2 Integer3 Integer4 Integer5 ....
每四个连续整数对应于单个记录的值。所以,我真的不能点

压缩此类文件的最佳方式是什么

更新:

1-这些值相互独立。每4个连续整数代表一条记录,例如:

CustomerId PurchaseId产品费用

每个都有一个整数值

2-理想情况下,我希望将其压缩为对象并存储在磁盘上


谢谢

最简单、最兼容的方法是在编写文件时对其进行GZIP处理,方法是使用GZIPOutputStream包装流并使用gzipoutstream包装读取

InputStream in = new BufferedInputStream(new GZIPInputStream(new FileInputStream(filename)));

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(filename)));

在给定的方式中,使用GZip不是最优的。由于您的OrderID、PurcaseId、ProductID和moneyspend彼此不同,但所有OrderID都有一些共同点,比如PurcaseId、ProductID和moneyspend。因此,最好不是按行而是按列存储这些值

由于您将要存储的表中通常有一个排序顺序,因此一列可以用delta值表示。例如,如果按OrderId对值进行排序,则可以将10、23、44、53的顺序表示为+10、+13、+21、+53。这些数字比原始数字更小,更容易重复

整数值可以表示为可变位长度信息。首先,存储该值的位数,并将其大于实际值。这样可以节省很多前导零

对于所花的钱,你也可以考虑典型数字的实际重复,比如99、25、50、49等等。更可能的情况是,产品的价格为49,99,而不是51,23。因此,将货币整数拆分为两个值将使您能够使用哈夫曼编码,并将特殊值视为符号,其余值视为运行长度位

为了表示位长度,您还可以使用不同的编码方案——一种是64个符号的哈夫曼码(64个不同长度的信息),并训练编码方案。这样,您将得到非常少的位数,而不是写入整数甚至长整数

剩下的东西可以放到gzip中。这通常效果更好,取决于您表示位长度的方式,因为压缩前导零比压缩不同的位长度信息更容易,但每次压缩都会产生成本

比特长度的另一种编码方案是使用最小-最大方法

例如,对于上面的序列10、23、44、53,我们存储10、+43(53)、+13、+23。这个想法是要知道在10到53之间有43个元素。因此,下一个值的最大长度为6(2^6=64)位。这样就不需要比特长度信息。您只需将序列存储在顺序中:第一个最小值、下一个最大值、下一个最小值、下一个最大值等等

更有效的方案是使用最小、最大、中间、中间左、中间右、中间左、中间左、中间左、中间左、中间右、中间右。这样,您就有最好的机会获得最小的位长度知识。使用这种方法会产生非常小的整数,而不需要额外的位长度信息

使用此类方案通常会使GZip进一步减少<10%,从而导致完全忽略GZip

[摘要]


因此GZip很简单,如果您需要挤出更多,请选择列方式,而不是行/条目方式。使用每列的专门知识。如果已排序,请使用增量作为表示。使用由哈夫曼码(每列一个)表示的位长度信息,并使用美分和美元的值作为产品价格,通常会产生非常好的压缩机会。按delta存储已排序的列,并使用树型存储,从而对下一步的位长度有很好的了解。

不,我不明白这个问题。。。可能是一个例子(用实数)可能会澄清你的要求。。。当你说压缩-标准压缩(比如gzip)不够好,或者你在追求FAST之类的东西时,你是想把它们压缩成代码中的对象,还是硬盘上的文件?你的问题很模糊……价值观是否平均分配?这些值包括哪些范围?相邻的值是独立的还是类似的,例如在音频样本中?你知道这些值的来源吗?这可能会有帮助吗?它们目前是否以人类可读的文本格式存储?如果是的话,二进制格式已经可以节省大量磁盘空间。它们作为对象存储,而不是以人类可读的格式存储。