Java压缩了很多长数

时间:2016-05-20 16:35:15

标签: java performance compression

我需要压缩很多长数字。那些长数字就像数据库ID。压缩后,它将作为请求的一部分发送。除了# melt to long form df %>% gather(var, val, -obs) %>% # separate into key and test labels separate(var, c('key', 'var')) %>% # spread to wide form spread(var, val) %>% # make it pretty so pre is before post for each obs arrange(obs, desc(key)) # obs key data1 data2 data3 # 1 1 pre 0.40 0.61 0.58 # 2 1 post 0.12 0.15 0.06 # 3 2 pre 0.21 0.18 0.35 # 4 2 post 0.05 0.49 0.24 # 5 3 pre 0.48 0.00 0.96 # 6 3 post 0.85 0.62 0.37 # 7 4 pre 0.66 0.88 0.13 # 8 4 post 0.29 0.56 0.72 # 9 5 pre 0.43 0.80 0.05 # 10 5 post 0.23 0.78 0.90 # 11 6 pre 0.86 0.25 0.99 # 12 6 post 0.04 0.34 0.79 # 13 7 pre 0.57 0.20 0.11 # 14 7 post 0.86 0.34 0.34 # 15 8 pre 0.13 0.24 0.79 # 16 8 post 0.39 0.51 0.63 # 17 9 pre 0.87 0.00 0.86 # 18 9 post 0.57 0.55 0.72 之外,还有更好的替代方案来实现更高的压缩率吗?

由于

2 个答案:

答案 0 :(得分:0)

可以通过更改其基数来更改任意数字的字节长度。由于计算机使用字节数据(基数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的基础上朗读数字。你无法读取压缩数字。

答案 1 :(得分:-1)

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