如何高效存储时间序列数据
How to efficiently store timeseries data
我有一个时间戳更新序列,时间戳单调递增
<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
在内存和速度上都要高效得多。
我认为你可以使用multimap
或tuple
s。
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- C++-需要读取存储在文件(.txt)中的时间戳并正确检索
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何在双精度内存储时间
- 如何使课程持续时间存储时间长度
- 时间序列与序列术语
- 来自C++"forecast" R 包的时间序列
- 如何使用QCustomPplot有效地绘制大型时间序列
- 用于超大时间序列的最佳索引数据结构
- 设计一个结构来存储时间和日期.写一个函数来计算两个时间之间的差(以分钟为单位)
- 如何高效存储时间序列数据
- std::vector的替代方案,用于存储对象序列
- 消除具有静态存储时间的变量
- 初始化带有静态存储时间的std::数组,带有参数Pack扩展和附加值
- 如何使用c++和PHP在客户端和云服务器之间正确存储时间戳和偏移量
- 如何处理无法在整数中存储时间
- 在字符串中存储时间