【问题标题】:Best of breed indexing data structures for Extremely Large time-series超大时间序列的最佳品种索引数据结构
【发布时间】:2012-04-15 20:02:24
【问题描述】:

我想就用于索引时间序列的最佳数据结构(又名按列数据,又名扁平线性)向 SO 同行征求意见。

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

  1. 正则离散化(每个样本都以相同的频率采集)

  2. 不规则离散化(样本取自任意时间点)

需要的查询:

  1. 时间范围[t0,t1]内的所有值

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

  3. 时间范围[t0,t1]中的所有值在值范围[v0,v1]中

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

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

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

我已经考虑过 HDF5,它对于较小的数据集运行良好/高效,但随着数据集变大开始拖累,前端也没有原生并行处理能力。

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

【问题讨论】:

  • 类型 1-3 的查询通常称为“正交范围报告”。
  • @Martin:谢谢你,但是只有一把锤子的问题是一切看起来都像钉子——在一个高度面向 db/dba 的 Q/A 网站上提出这样的问题,将导致略带偏见的回答。
  • @Xander:不用担心 - 我没有在这里发表任何评论,只是链接到 DBA 问题,这是有原因的。我只是想知道如何/是否可以在传统的 RDBMS 设置中解决您的问题。并不是说这将是最好的解决方案。

标签: c++ algorithm indexing data-structures large-data


【解决方案1】:

您可能希望使用某种类型的大型平衡树。就像 Tobias 提到的,B 树将是解决第一个问题的标准选择。如果您还关心快速插入和更新,那么在 MIT 和 CMU 等地方正在对这些新的“缓存遗忘 B 树”进行大量新工作。有关这些事情的实现的一些讨论,请查看Tokutek DB,他们有很多很好的演示文稿,如下所示:

http://tokutek.com/downloads/mysqluc-2010-fractal-trees.pdf

问题 2 和 3 通常要困难得多,因为它们涉及更高维度的范围搜索。执行此操作的标准数据结构是range tree(它提供 O(log^{d-1}(n)) 查询时间,代价是 O(n log^d(n)) 存储)。您通常想要将 k-d 树用于此类事情。虽然 kd 树确实具有最优的 O(n) 存储成本,但事实是,如果您只使用 O(n) 存储。对于 d=2,这将是 O(sqrt(n)) 时间复杂度;坦率地说,如果你有 10^10 个数据点(谁想在简单的范围查询中等待 O(10^5) 磁盘读取完成?)

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

【讨论】:

  • 另一方面,在存储中使用额外的日志因子意味着(假设没有大 O 常数)从价值 2,000 美元的硬盘(20TB * 大约 100 美元/TB 的今天价格)到 80,000 美元.以不到一年的程序员成本,这可能是值得的,但祝你的经理能以这种方式看待事情。
  • @mikola:确实很有趣!任何利用被建模价值的内在价值结构的时间序列索引结构都值得一看。
【解决方案2】:

总体思路:

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

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

【讨论】:

  • 将 b-tree 结构与时间序列结合使用的问题在于,大多数时间序列模型都是离散意义上的“连续”值。例如:30 度的房间温度需要降到 25 度才能达到 20 度,b 树不使用这种洞察力,因此对时间序列进行索引效率低下。
  • 对于问题 1,您的评论对我来说没有意义。如果您想搜索温度为 30 度的所有时间点,则必须使用 dindex 来获取数据。关于问题 2 和 3 - 我看不出矛盾。它实际上假设数据是连续的 - 否则使用最小值/最大值来确定数据介于两者之间是行不通的。
  • 请重新阅读我对您的原始评论。如果您过去使用过类似的数据,这应该是有意义的。
【解决方案3】:

由您自己实现这将非常耗时且复杂。我建议你使用 Cassandra。 Cassandra 可以为您提供水平可扩展性、冗余,并允许您在未来运行复杂的 map reduce 功能。 要了解如何在 cassandra 中存储时间序列,请查看: http://www.datastax.com/dev/blog/advanced-time-series-with-cassandrahttp://www.youtube.com/watch?v=OzBJrQZjge0

【讨论】:

  • 考虑到基本要求、延迟和数据大小,任何被管理的东西显然都达不到要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多