如何有效地存储时间序列数据

时间:2015-09-29 04:41:13

标签: c++ time-series

我有一系列带时间戳的更新,时间戳单调增加

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

我需要存储这些数据。我事先知道我关心的最大时间差值。 所以说我关心的时间delta是T.所以,我只需要存储所有最新的更新,这些更新不超过tn的T单位。

我想将它们按照分类的方式存储给我。

总而言之,我正在寻找存储已排序的序列,我可以有效地删除早期的元素。像C ++出队的东西。

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

4 个答案:

答案 0 :(得分:2)

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

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

如何获得随机访问的FIFO队列? STL中有std::deque就是这样。

根据我的经验,std::deque的效率低得惊人,可能是因为缓存行为不好。对大多数项目来说无关紧要,但这个问题专门针对效率问题。 因此,如果您真的关心效率,可以使用std::vector +迭代器来开始逻辑。因此,只要您想要删除最旧的元素,您只需增加迭代器即可。问题是这样你永远不会真正删除元素。这可以通过检查向量中逻辑删除的元素的数量是否超过其大小的一半然后仅从必要的重建向量来解决。如果队列中的元素数量存在上限,则可以使用静态大小数组而不是向量来进一步优化它。

答案 1 :(得分:1)

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

重新分配和复制可能需要耗费一些时间,但总体影响将受到算法基本上按时间摊销的事实的限制。

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

答案 2 :(得分:0)

我认为你可以使用multimap tuple来获取它。

答案 3 :(得分:0)

C ++ dequeue是<deque>。您也可以使用<list>,但如果您可能正在从集合的中间进行迭代和删除,那么这通常是有益的;如果您只是追加并弹出两端,deque在内存和速度方面都更有效率。