我需要存储并能够查询一些非常大的时间序列数据。
数据的属性如下:
- 系列数:约12.000(1.2万)
- 全球数据点数量:每月约5000亿(五亿)
- 混合值类型:大多数数据点为浮点值,其余为字符串
- 采样周期:系列之间以及系列内的变量
- 时间戳:毫秒精度
- 数据保留期:数年,无衰减或下采样
- 数据存档需要近乎实时地构建,但是可以接受合理的延迟(〜1小时)
- 如果需要,可以重建过去的数据,但是成本很高
- 有时(但很少),需要更新一些过去的数据
预想查询的属性:
- 针对数据的大多数查询将是基于时间戳的查询;从一天到几个月/年不等。90%以上将是对最新数据的查询
其他需求:
- 解决方案必须像免费啤酒一样免费,最好是开源的
我最初的想法是将带有HDF5文件的 PyTables / Pandas 用作存储后端,而不是SQL数据库。
问题:
假设PyTables / Pandas是“最佳”途径,将数据拆分成多个HDF文件,每个文件跨越一个给定的时间,还是将所有内容都放入一个单独的文件中,然后再变得庞大会更好吗?
我应该选择固定格式还是表格格式?对我来说,如果我每月保留一个HDF文件,则固定格式看起来还可以,因为这样一来,整个系列就可以放入RAM中,并且可以在内存中切片而不需要表格式索引。我对么 ?
如果那不是最好的方法,那么我应该如何构造该数据存储或应该考虑哪些技术?我不是第一个处理存储大量时间序列数据的人,解决此难题的一般方法是什么?
我考虑过的其他方法:
- 数组数据库:它们非常适合具有恒定采样周期的时间序列,因为您只需要存储数组的开始和结束时间以及采样周期,然后只需要数组本身中的值和索引即可。但是,由于序列本身具有可变的采样周期,因此我需要保持更紧密的timestamp-> value关系,我认为这不太适合数组DBMS。
- 标准SQL数据库,其中带有时间戳,paramID,值作为列,但根据其性质,它们为任何查询都请求大量磁盘I / O