2013-01-24 62 views
0

我有整数的序列在以下格式:整数压缩在java中

Integer1 Integer2 Integer3 Integer4 Integer5 .... 

每4个连续程序整数对应于单个记录的值。所以,我不能订购它们。

什么是压缩这种文件的最佳方式?

更新:

1-值被indpendent彼此的。每4点连续程序的整数表示的记录,例如:

客户ID PurchaseId产品MoneySpent

每个容纳一个整数值。

2-理想情况下,我希望将它压缩为对象和磁盘。

感谢

+3

nope,我没有得到这个问题...可能是一个例子(用实数)可能会澄清你的要求...当你说压缩 - 标准按压(如gzip)不够好或你是在其他东西像FAST例如?? – Nim

+2

您是否试图将它们压缩为代码中的对象或作为硬盘上的文件?你的问题很模糊...... –

+1

这些值是否等于分布?值覆盖哪个范围?彼此相邻的值是独立的还是例如音频样本中的值是否相似?你知道价值的来源,这可能有帮助吗? – MrSmith42

回答

0

最简单和最兼容的做法是,你通过包装与GZIPOutputStream流中的信息阅读它包裹着GZIPInputStream将其写入GZIP文件。

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

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

以给定的方式使用GZip并不是最优的。由于您的OrderID,您的PurcaseId,ProductID和MoneySpent彼此不同,但所有OrderIds都具有PurcaseId,ProductId和MoneySpent的共同点。因此,最好将这些值存储为不是明智的列式明智的。

由于您通常会在此表中对您存储的排序顺序进行存储,因此一列可能会由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是简单的,如果你需要挤出更多,去逐列,而不是行/项明智的。使用每列的特殊知识。如果排序使用deltas作为表示。使用由霍夫曼代码表示的比特长度信息(每列一个)并使用美分和美元的价值来产品价格通常导致非常好的压缩机会。按增量存储已排序的列,并使用明智的树形存储,从而获得关于下一个期望的位长度的非常好的知识。