如何存储多年的 100 x 25 Hz 时间序列 - Sql Server 或时间序列数据库

Posted

技术标签:

【中文标题】如何存储多年的 100 x 25 Hz 时间序列 - Sql Server 或时间序列数据库【英文标题】:How to store many years worth of 100 x 25 Hz time-series - Sql Server or timeseries database 【发布时间】:2010-10-31 09:43:41 【问题描述】:

我正在尝试确定存储 100 个 25 Hz 浮点数据通道的可能方法。这将产生 每年 78,840,000,000 个数据点

理想情况下,所有这些数据都可以有效地用于网站和工具,例如 Sql Server 报告服务。我们知道,关系数据库在处理这种规模的时间序列方面表现不佳,但尚未确定令人信服的时间序列特定数据库。

关键问题是压缩以实现高效存储,同时还提供简单高效的查询、报告和数据挖掘。

您将如何处理这些数据?

Sql Server 中是否有可以处理这么多时间序列数据的功能或表设计?

如果没有,是否有任何 Sql server 的第三方扩展来有效处理庞大的时间序列?

如果没有,是否有专门处理此类数据但通过 Sql、.Net 和 Sql Reporting 服务提供自然访问的时间序列数据库?

谢谢!

【问题讨论】:

数据点有多大? 样本的数据类型是什么?样品/进料速率是固定的还是变化的?您需要存储采样时间还是可以推断?采样的是什么类型的数据? 假设 32 位浮点。可能会有一些优化,但如果我们不必处理那种头痛,那将是完美的。 几乎不可能处理 FP 数据的压缩问题,除非我们知道它是什么类型的数据:它是真实世界的物理测量数据还是合成/人工/生成的数据?数据是基于频率的、周期性的还是非周期性的?数据点是单调累加器(从不下降),还是波动水平,或者它们是速率测量?它们大多是平坦的,偶尔出现峰值(事件)还是高度可变和混乱?数据的准确性如何,其中有多少噪音?最后,有损压缩是否可以接受? 【参考方案1】:

我会按日期对表进行分区,以将数据分成216,000,000 行的微小位。

如果您不需要全年统计数据,这很容易通过索引提供。

比如说,像“给我一个给定小时的平均值”这样的查询将只需要几秒钟。

【讨论】:

感谢您的回答。使用 sql server 分区还是只使用多个表?如果它有多个表,是否有任何设计模式可以轻松处理跨表查询? @Duncan:SQL Server 分区是最好的,但我不知道它允许多少个分区。对于多个表,您可以运行调度程序将视图重新创建为 SELECT * FROM table_20090609 UNION ALL SELECT * FROM table_20090608 等。不要忘记在表中包含分区列。【参考方案2】:

我想您需要随机访问数据系列。我已经用于降雨数据表的想法是将整个数据集细分为更小的部分,每隔几分钟甚至一分钟创建一个条目。 然后你可以从数据库中弹出这个仍然很大的数组并直接访问所需的部分,你可以找到时间偏移量和字节偏移量之间的直接相关性。

【讨论】:

感谢您的回答。对大数组使用 blob?是否有任何设计方法可以使 blob 易于查询,例如观看次数?【参考方案3】:

您描述的功能集用于分析多维数据集。如果您身处科技界,请查看 Microsoft 的分析服务:

http://msdn.microsoft.com/en-us/library/ms175609(SQL.90).aspx

就您所描述的模型而言,您需要实现具有时间维度的 Kimball 模型(标准数据仓库模型)。不久前我在存储媒体日志文件时遇到了这个问题。

祝你好运。

【讨论】:

感谢您的回答。很难知道从哪里开始使用数据仓库。我已经用谷歌搜索并阅读了您的链接,但会从解决类似问题的示例项目之类的东西中受益。你知道这样的事情吗? 你说得对,数据仓库很难上手。我可以推荐的最佳过程是(请记住,我在这里说的是 Microsoft Visual Studio 和 Sql Server 2005/2008)下载 AdventureWorks db 的示例仓库:microsoft.com/downloads/… 然后查看一些动手操作Sql Server 实验室:microsoft.com/sqlserver/2008/en/us/virtual-labs.aspx 最后,我推荐 Kimball 的书入门:ralphkimball.com/html/booksDWT2.html 祝你好运!【参考方案4】:

你有

A. 365 x 24 x 100 = 876,000 小时信号(所有渠道)每年

B.每个信号包含 3600 * 25 = 90,000 个数据点

如果您将数据存储为每个信号一行,其中列用于当前支持的用例的摘要/查询统计信息,以及 blob 用于未来的压缩信号? p>

【讨论】:

感谢您的回答。我可能不完全理解这个建议。是否建议每一行都喜欢(signalId、timeperiod、float ave、float min、float max、blob raw)?是否有任何使 blob 数据易于查询的示例,例如观看次数? 类似的东西,但我不确定是否让 blob 数据可查询。我的想法是根据需要将查询限制在其他统计数据列。【参考方案5】:

我认为您可以查看 Infobright 社区版或企业版。 它是一种面向列的存储,专为分析目的而设计,拥有大量(如他们所说的那样,现有安装现在高达 30 TB)数据和良好的压缩率。

数据加载器也非常快,并且存在用于 ETL 工具(Talend、kettle 等)的连接器。

在 GNU GPL 条款下免费提供社区版,但仅允许通过本机加载程序添加数据。企业版支持通过DML单行添加/更新。

另一个好处是您可以将它与支持 mysql 连接的所有工具一起使用。

列方向允许您,例如,在每个需要的聚合级别(我使用日期、周数、月份和 qtr)上为日期组件添加列,以获得更好的性能,但没有它也很好。

我将它用于分析目的相对少量(但)的业务交易数据,使用 R 作为数据分析工具,通过 mysql 接口和 python (numpy) 脚本作为某种 ETL。

缺点: 缺乏官方 utf-8 支持,按函数值聚合(选择月份(日期来自 ...))尚未实现(计划:2009 年 7 月,AFAIK),但我为此使用 ETL。

链接:http://www.infobright.org/Download/ICE/

【讨论】:

请在探索 ICE 后随时分享您的经验 :) 我正在研究我们的小型分析/报告应用程序的架构,其中 R、Infobright 和 Django 作为报告查看器,并对有关存储/的新想法感兴趣代表大数据:)【参考方案6】:

您是否考虑过时间序列数据库,例如 http://opentsdb.net ?

【讨论】:

【参考方案7】:

您是否考虑过 HBASE 或 Open TSDB。你也可以看看Cassandra

【讨论】:

【参考方案8】:

如果它只是浮点数据,TSDB 将为您提供更好的性能。时间序列压缩算法不同,因此您可以获得更好的存储和查询率。

【讨论】:

以上是关于如何存储多年的 100 x 25 Hz 时间序列 - Sql Server 或时间序列数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何理解FFT

使用 FFT 进行频谱分析

如何从 3 轴加速度计数据中获取运动大小

fpga图像处理学习日记

来自串行的 100 Hz 数据

MATLAB仿真信号