【问题标题】:Java compress lots of long numbersJava 压缩大量长数字
【发布时间】:2018-05-16 22:01:05
【问题描述】:

我需要压缩很多长数字。那些长数字就像数据库ID。压缩后,它将作为请求的一部分发送。除了java.util.zip,还有没有更好的办法来实现更高的压缩率?

谢谢

【问题讨论】:

  • 你的问题毫无意义。首先,为什么要压缩它们?这些是什么?为什么你认为你需要压缩?
  • 这在很大程度上取决于这些数字的性质。例如,如果它们在整个 64 位范围内随机分布,您将根本无法压缩它们。
  • 可能重复? int vs. long,但过程应该相同。 stackoverflow.com/questions/283299/…
  • 您需要提供更多关于数字性质的信息。它们的范围、所需的准确度、数字之间的相关性。

标签: java performance compression


【解决方案1】:

可以通过改变基数来改变任意数字的字节长度。由于计算机使用字节作为数据(基数 256)而人类使用以 10 为基数的明文数字,因此空间效率不高,因为它们只能使用 256 个值中的 10 个值。

简单的java程序来演示:

System.out.println(Long.MAX_VALUE);
String sa = Long.toString(Long.MAX_VALUE, Character.MAX_RADIX);
System.out.println(sa);

输出:

9223372036854775807              # 20 bytes
1y2p0ij32e8e7                    # 14 bytes

这减少了 6 个字节(30% 压缩**,以字节为单位)。由于 Character.MAX_RADIX 等于 36,您可以通过编写自定义 toString 方法来实现更大的压缩。

当然,这仅适用于数字的文本表示。此示例中使用的 Long.MAX_VALUE 数字在其二进制形式中只有 8 个字节长。因此,与二进制形式的数字相比,即使大小减少了 30%,实际上也增加了 75%。

** 这种方法并不是真正的压缩。这只是利用以人类可读形式写入数字而引入的存储效率低下。像 zip 这样的实际压缩总是会击败这种方法,尽管它会使数字无法被人类读取。说白了:你可以大声读出以 10、16、36 甚至 256 为底的数字。你不能读出压缩数字。

【讨论】:

    【解决方案2】:

    您可以使用运行长度编码压缩长数字:https://en.wikipedia.org/wiki/Run-length_encoding

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多