提问

有个需求,让你压缩一列时间戳,想一想,怎么做

以下是纳秒精度时间戳

1616047412408692000

1616047412408692001

1616047412408692002

1616047412408692002

1616047412408692005

1616047412408692005

1616047412408692010

回答

  1. 记录首个时间戳 + 每个时间戳与首个的差值
时间戳 实际记录值
1616047412408692000 1616047412408692000
1616047412408692001 1
1616047412408692002 2
1616047412408692002 2
1616047412408692005 5
1616047412408692005 5
1616047412408692010 10
  1. 记录首个时间戳 + 他们与上一个数字的差值
时间戳 实际记录值
1616047412408692000 1616047412408692000
1616047412408692001 1
1616047412408692002 1
1616047412408692002 0
1616047412408692005 3
1616047412408692005 0
1616047412408692010 5

第2种方法明显比第1种更节约空间,它只需要记录变化值,而这个变换值在连续时间线下是很小的。

它在压缩数据上做的很好,我们把这个方案叫delta压缩。然而请想想它有什么缺点呢?

计算,我们必须得知道第一个时间戳,再依次计算每个变化量,才得到一个指定时间点。

而第1种方案,只需要计算一次即可。


主角登场

那么我们的压缩可以再进一步吗?

Delta-of-Delta

时间戳 delta delta-of-delta
1616047412408692000 1616047412408692000 1616047412408692000
1616047412408692001 1 1
1616047412408692002 1 0
1616047412408692002 0 -1
1616047412408692005 3 3
1616047412408692005 0 -3
1616047412408692010 5 5

它只需要计算当前增长幅度的变化情况

我的理解是,delta记录了增长幅度,而delta-of-delta记录的是增长幅度的变化情况。

它更适合增长幅度稳定的时间戳记录