C++ 针对超大时间序列的同类最佳索引数据结构

C++ 针对超大时间序列的同类最佳索引数据结构,c++,algorithm,indexing,data-structures,large-data,C++,Algorithm,Indexing,Data Structures,Large Data,我想问问其他SO'ers,他们对用于索引时间序列的最佳数据结构(又名列数据,又名平面线性)的看法 基于采样/离散化特征,存在两种基本类型的时间序列: 常规离散化(每个样本均以相同频率采集) 不规则离散化(在任意时间点取样) 所需的查询: 时间范围[t0,t1]中的所有值 时间范围[t0,t1]中大于/小于v0的所有值 时间范围[t0,t1]内的所有值,其值范围为[v0,v1] 数据集由汇总的时间序列(这类数据可以克服不规则离散)和多元时间序列组成。所讨论的数据集大小约为15-20TB,因此以分布

我想问问其他SO'ers,他们对用于索引时间序列的最佳数据结构(又名列数据,又名平面线性)的看法

基于采样/离散化特征,存在两种基本类型的时间序列:

  • 常规离散化(每个样本均以相同频率采集)

  • 不规则离散化(在任意时间点取样)

  • 所需的查询:

  • 时间范围[t0,t1]中的所有值

  • 时间范围[t0,t1]中大于/小于v0的所有值

  • 时间范围[t0,t1]内的所有值,其值范围为[v0,v1]

  • 数据集由汇总的时间序列(这类数据可以克服不规则离散)和多元时间序列组成。所讨论的数据集大小约为15-20TB,因此以分布式方式执行处理-因为上述一些查询将导致数据集大于任何一个系统上可用的物理内存量

    在这种情况下,分布式处理还意味着将所需的特定于数据的计算与时间序列查询一起调度,以便计算尽可能靠近数据进行,从而减少节点到节点的通信(有点类似于map/reduce范式)-在短时间内,计算和数据非常关键

    该指数应该能够解决的另一个问题是,绝大多数数据是静态/历史数据(99.999…%),但每天都会添加新数据,比如“现场传感器”或“市场数据”。想法/要求是能够以尽可能低的延迟更新任何正在运行的计算(平均值、garch等),其中一些正在运行的计算需要历史数据,其中一些将超过可以合理缓存的数据

    我已经考虑过HDF5,它对于较小的数据集工作得很好/有效,但随着数据集变得更大,它开始拖拉,而且前端也没有本机并行处理功能

    寻找建议,链接,进一步阅读等(C或C++解决方案,库)

    一般思想:

    问题1相当常见:创建一个适合RAM的索引,并具有到辅助存储(数据结构:)上的数据的链接。 问题2/3非常复杂,因为您的数据非常大。您可以将数据划分为时间范围,并计算该时间范围的最小/最大值。使用该信息,您可以筛选出时间范围(例如,范围的最大值为50,您搜索v0>60,则间隔为out)。其余的需要通过遍历数据进行搜索。有效性在很大程度上取决于数据变化的速度


    您还可以通过组合较低级别的时间范围来进行多个索引,以便更快地进行过滤。

    您可能希望使用某种类型的大型平衡树。正如Tobias提到的,B-树将是解决第一个问题的标准选择。如果你也关心如何快速插入和更新,那么在麻省理工学院和芝加哥大学等地,有很多新的工作正在做,这些新的“缓存不经意的B树”。对于这些东西的实现的一些讨论,请查阅,他们有许多很好的演示,如以下所示:

    问题2和3通常要难得多,因为它们涉及更高维度的范围搜索。进行此操作的标准数据结构是(这将提供O(log^{d-1}(n))查询时间,而代价是O(n log^d(n))存储)。通常情况下,您不希望将k-d树用于类似的内容。虽然kd树确实具有最优的O(n)存储成本,但事实是,如果只使用O(n)存储,则对范围查询的求值速度无法超过O(n^{(d-1)/d}。对于d=2,这将是O(sqrt(n))时间复杂度;坦率地说,如果您有10^10个数据点(谁想在一个简单的范围查询中等待O(10^5)个磁盘读取完成),那么这并不会减少数据量


    幸运的是,听起来你的情况你真的不需要太担心一般情况。因为所有数据都来自一个时间序列,所以每个时间坐标最多只能有一个值。假设,您所能做的只是使用一个范围查询来提取一些点的间隔,然后作为一个后处理过程,逐点应用v约束。这将是我尝试的第一件事(在获得一个好的数据库实现之后),如果它能工作,那么您就完成了!只有在[t0,t1]x[-infty,+infty]中的点数比[t0,t1]x[v0,v1]中的点数大几个数量级的情况下,才有必要尝试优化后两个查询。

    自行实现这一点将非常耗时和复杂。我建议你用卡桑德拉。 Cassandra可以为您提供水平可扩展性、冗余,并允许您在将来运行复杂的map reduce函数。 要了解如何在cassandra中存储时间序列,请查看:
    和。

    类型1-3的查询通常被称为“正交范围报告”。@Martin:谢谢,但只有锤子的问题是,一切看起来都像钉子——在一个高度以db/dba为导向的Q/a网站上提出了这样的问题,将导致答案带有轻微的偏见。@Xander:不用担心-我之所以没有在这里发表任何评论,只是链接到DBA问题。我只是想知道在传统的RDBMS设置中如何/是否可以解决您的问题。不是说这将是最好的解决方案。另一方面,在存储中使用额外的日志系数意味着(假设没有大O常量)从价值2000美元的硬盘(今天的价格是20TB*大约100美元/TB)到$