如何高效存储时间序列数据

How to efficiently store timeseries data

本文关键字:存储 时间序列 数据 高效 何高效      更新时间:2023-10-16

我有一个时间戳更新序列,时间戳单调递增

<t1,d1> , <t2,d2> , <t3, d3> .... <tn, dn>

我需要存储这个数据。我事先知道我关心的最大时间。假设我关心的时间增量是T,那么我只需要存储所有比tn早不超过T个单位的最新更新。

我想按照它们给我的排序方式来存储它们。

所以总结一下,我正在寻找存储一个排序的序列,我可以有效地删除前面的元素。有点像c++的dequeue。

关于如何有效地找到截断元素,我可以删除所有旧条目的任何建议?

我会使用循环缓冲区。当要添加新数据点时,请检查要覆盖的值是否足够旧,可以删除。如果是,继续重写。否则,将缓冲区重新分配为原来的两倍大,并将数据指针复制到新的缓冲区中。

重新分配和复制可能有点耗时,但总的影响将受到算法基本上是平摊常数时间这一事实的限制。

如果确实需要,可以通过只将固定数量的元素从旧缓冲区复制到新缓冲区来分散复制。您必须移动每个新数据点的元素数量。只要这个数字至少为2,您将在新缓冲区被传入数据填充之前复制所有旧数据。

你所描述的是一个队列,当一个新元素到达时,它可能会删除一些最老的元素。我还将假设您需要随机访问所有元素。

所以你需要一个先进先出的队列,并且在每次添加操作之后删除最老的元素,直到最老的元素足够近。

以及如何获得一个FIFO队列随机访问?STL中的std::deque就是这样做的。

根据我的经验,std::deque的效率非常低,可能是由于糟糕的缓存行为。这对大多数项目来说并不重要,但这个问题是关于效率的。所以如果你真的关心效率,你可以使用std::vector +一个迭代器,从逻辑开始。所以当你想要移除最老的元素时你只需要对迭代器进行自增。问题是,这种方式永远不会真正删除元素。这可以通过检查向量中逻辑删除的元素的数量是否超过其大小的一半,然后仅从必要的元素重建向量来解决。如果您的队列中存在元素数量的上限,则可以使用静态大小数组而不是vector来进一步优化。

c++ dequeue是<deque>。你也可以使用<list>,但这通常只有在你可能从集合的中间迭代和删除时才有用;如果你只是从末尾添加和弹出,deque在内存和速度上都要高效得多。

我认为你可以使用multimaptuple s。