database - 大规模、基于时间序列的聚合操作的架构和模式

标签 database design-patterns architecture nosql

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

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

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

这是我的想法,使用 NoSql 或面向列的方法: 将所有股票分配到某种时间键值对中:价格在所有股票上都有匹配的时间行。然后使用某种 map reduce 模式来仅选择所需的股票并在逐行读取它们的同时汇总它们的价格。

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

更新:我所说的快速查找并不是指实时,而是指相当快的操作。目前,我需要几分钟来处理每天的数据,这相当于每年计算几个小时。我想在几分钟内完成。

最佳答案

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

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

然后你需要为每个文件建立一个索引,这样你就可以快速找到文件中的某个时间点,而当你只需要某个时间段时就不需要从头读取文件。

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

聚合多个时间序列涉及从这些文件中的每一个读取特定时间段到内存中,计算聚合数字并将它们写入某处。要充分利用操作系统,请一一阅读每个时间序列的完整所需时间段,不要尝试并行阅读它们。如果您需要计算一个较长的周期,则不要将其分成更小的周期。

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

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

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

关于database - 大规模、基于时间序列的聚合操作的架构和模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765611/

相关文章:

sql - 在 SQL 连接中过滤重复项

ios - iOS 应用的推荐控件或页面流

ruby-on-rails - 如何处理 Rails/Ruby 中微不足道的 "duplication of code"气味

architecture - 在 Monodroid 应用程序中重用 Monotouch 代码

c++ - 如何在 C++ 中使用指针正确设计类的层次结构

.net - 没有日志库的日志记录

mysql - 如何从数据库中删除少于3个字符的单词

mysql - 运行缓慢的 MySql 还原 - 比备份速度慢 10 倍,但仍在运行

mysql - 在mysql中使用am pm获取数据

design-patterns - Windows 服务的六边形架构/端口和适配器架构。正确的路?