【问题标题】:Integer compression in javajava中的整数压缩
【发布时间】:2015-03-10 09:03:48
【问题描述】:

我有以下格式的整数序列:

Integer1 Integer2 Integer3 Integer4 Integer5 ....

每四个连续整数对应一个记录的值。所以,我不能真正订购它们。

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

更新:

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

CustomerId PurchaseId Products MoneySpent

每个都保存一个整数值。

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

谢谢

【问题讨论】:

  • 不,我不明白这个问题......可能是一个例子(带有实数)可能会澄清你的要求......当你说压缩时 - 标准压缩(如 gzip)不好够了,还是你在追求 FAST 之类的东西??
  • 您是想将它们压缩为代码中的对象还是硬盘上的文件?你的问题很模糊...
  • 值是否均等分布?值涵盖了哪个范围?相邻的值是独立的还是例如在音频样本中,彼此相邻的值是否相似?你知道值的来源,这可能会有所帮助吗?
  • 目前它们是否以人类可读的文本格式存储?如果是,二进制格式已经可以节省大量磁盘空间。
  • 它们被存储为对象,而不是人类可读的格式。

标签: java compression data-compression


【解决方案1】:

最简单且最兼容的方法是在编写文件时对文件进行 GZIP,方法是使用 GZIPOutputStream 包装您的流并使用 GZIPInputStream 包装来读取它。

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

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

【讨论】:

    【解决方案2】:

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

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

    整数值可以表示为可变位长信息。首先,您存储值的位数而不是实际值。这样可以节省很多前导零。

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

    要表示位长,您还可以使用不同的编码方案,其中一种是 64 个符号(64 个不同长度信息)的霍夫曼码并训练编码方案。这样你最终会得到非常少的位数,而不是写整数甚至长整数。

    剩下的东西可以放入gzip。这通常更有效,具体取决于您表达位长的方式,因为压缩前导零比压缩不同的位长信息更容易,但每次压缩都需要成本。

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

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

    更有效的方案是使用最小值、最大值、中间、中间左侧、中间右侧、中间左侧、中间左侧、中间左侧、中间右侧、中间右侧...。这样,您就有最好的机会获得最小位长的知识。使用这种方式会导致非常小的整数大小而没有额外的位长信息。

    使用此类方案通常会使 GZip 有机会进一步减少

    [摘要]

    所以 GZip 很简单,如果您需要挤出更多内容,请选择按列而不是按行/条目。使用每列的特殊知识。如果已排序,则使用增量作为表示。使用由霍夫曼代码表示的比特长度信息(每列一个)并使用美分和美元的值作为产品价格通常会产生非常好的压缩机会。按增量存储已排序的列并使用树型存储,从而很好地了解接下来的位长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多