我需要压缩很多长数字。那些长数字就像数据库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
之外,还有更好的替代方案来实现更高的压缩率吗?
由于
答案 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