存储时间序列数据的最佳开源解决方案是什么?

时间:2009-08-26 13:47:32

标签: python database statistics time-series schemaless

我对监视某些对象感兴趣。我希望每15分钟获得大约10000个数据点。 (也许不是一开始,但这是'一般球场')。我还希望能够获得每日,每周,每月和每年的统计数据。将数据保持在最高分辨率(15分钟)超过两个月并不重要。

我正在考虑各种方法来存储这些数据,并且一直在查看经典的关系数据库,或者在无模式数据库(例如SimpleDB)上。

我的问题是,这样做的最佳方式是什么?我非常希望开源(和免费)解决方案成为专有的高成本解决方案。

小记:我正在用Python编写这个应用程序。

5 个答案:

答案 0 :(得分:11)

HDF5可以通过h5pyPyTables访问,旨在处理非常大的数据集。两个接口都运行良好。例如,h5py和PyTable都具有自动压缩功能,并支持Numpy。

答案 1 :(得分:8)

绝对是Tobi Oetiker的{p> RRDTool!它是开源的,它专为这种用例而设计。

编辑:

提供一些亮点:RRDTool将时间序列数据存储在循环数据库中。它保留给定时间段内的原始数据,然后以可配置的方式压缩它,这样您就可以获得一个月的细粒度数据,过去6个月中一周的平均数据,以及最后一个月的平均数据。 2年。作为副作用,您的数据库始终保持相同的大小(因此,不会让您的磁盘充满汗水)。这是存储方面。在检索方面,RRDTool提供的数据查询可立即转换为图形(例如png),您可以将其轻松地包含在文档和网页中。它是一个坚如磐石,经过验证的解决方案,与其前身MRTG(有些人可能已经听说过)相比,它是一种非常普遍的形式。一旦你进入它,你会发现自己一遍又一遍地重复使用它。

要快速了解并使用RRDTool,请参阅here。如果您想查看可以生成哪种图形,请务必查看gallery

答案 2 :(得分:1)

纯文本文件?目前还不清楚你的每15分钟10k数据点的字节数是多少,但无论如何,文本文件更容易存储/存档/传输/操作,你可以直接检查,只需查看即可。使用Python也很容易。

答案 3 :(得分:1)

这是非常标准的数据仓库内容。

许多“事实”,由多个维度组织,其中一个是时间。大量聚合。

在许多情况下,使用基于defaultdict的简单聚合算法处理的简单平面文件将会产生奇迹 - 快速而简单。

查看Efficiently storing 7.300.000.000 rows

Database choice for large data volume?

答案 4 :(得分:0)

我写的是一个开源时间序列数据库正在进行的活动开发(目前只有.NET)。它可以以“二进制平面文件”的方式存储大量(terrabytes)的统一数据。所有用法都是面向流的(正向或反向)。我们积极地将其用于我们公司的股票存储和分析。

https://code.google.com/p/timeseriesdb/

// Create a new file for MyStruct data.
// Use BinCompressedFile<,> for compressed storage of deltas
using (var file = new BinSeriesFile<UtcDateTime, MyStruct>("data.bts"))
{
   file.UniqueIndexes = true; // enforces index uniqueness
   file.InitializeNewFile(); // create file and write header
   file.AppendData(data); // append data (stream of ArraySegment<>)
}

// Read needed data.
using (var file = (IEnumerableFeed<UtcDateTime, MyStrut>) BinaryFile.Open("data.bts", false))
{
    // Enumerate one item at a time maxitum 10 items starting at 2011-1-1
    // (can also get one segment at a time with StreamSegments)
    foreach (var val in file.Stream(new UtcDateTime(2011,1,1), maxItemCount = 10)
        Console.WriteLine(val);
}