用于大规模,基于时间序列,聚合操作的体系结构和模式

时间:2011-04-23 17:01:27

标签: database design-patterns architecture nosql

我将尝试描述我的挑战和操作: 我需要计算历史时期的股票价格指数。例如,我将采用100只股票并计算去年每秒(甚至更低)的累计平均价格。 我需要创建许多不同的指数,其中股票是从30,000种不同的工具中动态选取的。

主要考虑的是速度。我需要尽可能快地输出几个月的这种索引。

出于这个原因,我认为传统的RDBMS太慢了,所以我正在寻找一种复杂而原创的解决方案。

这是我想到的,使用NoSql或面向列的方法: 将所有股票分配到某种关键值时间对:价格与所有股票的匹配时间行。然后使用某种地图缩减模式,只选择所需的股票,并在逐行阅读时汇总价格。

我想对我的方法,工具和用例的建议,或完全不同的设计模式的建议提供一些反馈。我的解决方案的指导方针是价格(想要使用开源),处理大量数据的能力以及快速查找(我不关心插入,因为它只做了一次而且永远不会改变)

更新:通过快速查找我不是指实时,而是一个相当快速的操作。目前,每天处理数据需要几分钟的时间,这相当于每年计算几个小时。我希望在几分钟左右的时间内实现这一目标。

3 个答案:

答案 0 :(得分:1)

过去,我参与了几个涉及使用不同存储技术(文件,RDBMS,NoSQL数据库)存储和处理时间序列的项目。在所有这些项目中,关键点是确保时间序列样本按顺序存储在磁盘上。这确保了连续几千个样本的读取速度很快。

由于您似乎拥有适度数量的时间序列(约30,000),每个时间序列都有大量样本(每秒1个价格),因此一种简单而有效的方法可能是将每个时间序列写入单独的文件中。在文件中,价格按时间排序。

然后,您需要为每个文件建立一个索引,以便您可以快速找到文件中的某些时间点,并且只需要一段时间就不需要从头开始读取文件。

通过这种方法,您可以充分利用当今具有大文件缓存的操作系统,并针对顺序读取进行了优化(通常在检测到顺序模式时在文件中提前读取)。

聚合几个时间序列涉及从每个文件中读取一段时间到内存中,计算聚合数字并将它们写在某处。要充分利用操作系统,请逐个读取每个时间序列的完整所需时间段,并且不要尝试并行读取它们。如果你需要计算很长一段时间,那就不要把它分成更小的时期。

你提到你每天减少25,000个价格,每秒减少一个。在我看来,在这样一个时间序列中,许多连续的价格与每秒交易(甚至定价)的工具数量相同(除非您只处理S& P 500股票及其衍生品)。因此,额外的优化可能是通过仅在价格确实发生变化时存储新样本来进一步缩小您的时间序列。

在较低级别,时间序列文件可以组织为由样本运行组成的二进制文件。每次运行都以第一个价格的时间戳和运行的长度开始。之后,连续几秒的价格随之而来。每次运行的文件偏移量可以存储在索引中,可以使用关系DBMS(例如MySQL)实现。该数据库还将包含每个时间序列的所有元数据。

(远离内存映射文件。它们速度较慢,因为它们没有针对顺序访问进行优化。)

答案 1 :(得分:0)

如果您描述的方案是唯一的要求,那么“低技术”的简单解决方案更便宜,更容易实施。首先想到的是LogParser。如果你还没有听说过,它是一个在简单的CSV文件上运行SQL查询的工具。 令人难以置信地快 - 通常大约500K行/秒,具体取决于行的大小和HD的IO吞吐量。

将原始数据转储为CSV,通过命令行运行简单的聚合SQL查询,您就完成了。很难相信它可以那么简单,但确实如此。

有关logparser的更多信息:

答案 2 :(得分:0)

你真正需要的是一个内置时间序列功能的关系数据库,IBM最近发布了一个Informix 11.7(注意它必须是11.7才能获得这个功能)。更好的消息是,对于你正在做的免费版本,Informix Innovator-C将绰绰有余。 http://www.freeinformix.com/time-series-presentation-technical.html