时间序列数据存储

时间:2015-12-15 09:32:11

标签: java sockets go network-programming time-series

我收集来自同一网络上的服务的大量UDP数据包(取决于时间)。这些数据包被反序列化为包含内存中的数字(float和int)并进行处理的结构。我们可以说我们正在收集时间序列数据。但是,它不是您通过监督服务获得的时间序列数据类型(在一段时间内大多数值相同)。这些价值不断变化,真实,而不是非常多。但它们各不相同。

除此之外,我想将该数据发送到云中的服务器,并在该服务器上存储时间序列数据。

我的问题是:压缩数据的可能性是什么,以便通过线路将较小的数据包发送到服务器(我们可以通过TCP批量发送传入的UDP数据包)并存储它们?我特别感兴趣的是不使用我附加到服务器的整个存储。一个会话的数据接近32MB,我会同时有多个会话。一个会话的数据与另一个会话无关。他们是完全独立的。

1 个答案:

答案 0 :(得分:0)

您可以使用此库压缩时间序列数据:https://github.com/dgryski/go-tsz

它基于Facebook的这篇论文: http://www.vldb.org/pvldb/vol8/p1816-teller.pdf

  

我们发现大约96%的时间戳   可以压缩到一个位。

     

[...]

     

从那以后,大约51%的值被压缩为一位   当前值和先前值是相同的。约占30%   使用控制位'10'压缩值(情况b),   平均压缩大小为26.6位。剩余的   19%用控制位'11'压缩,平均值   由于需要额外的13位开销,因此大小为36.9位   编码前导零位和有意义位的长度。

您可以使用像bolt这样的键值存储(或者可能更好:支持压缩的rocksdb)并为每个键存储多个点。例如,您可以每10分钟存储一个键值对,其中值将是该10分钟窗口期间发生的所有点。

这应该会给你带来良好的性能和高压缩。