我对监视某些对象感兴趣。我希望每15分钟获得大约10000个数据点。 (也许不是一开始,但这是'一般球场')。我还希望能够获得每日,每周,每月和每年的统计数据。将数据保持在最高分辨率(15分钟)超过两个月并不重要。
我正在考虑各种方法来存储这些数据,并且一直在查看经典的关系数据库,或者在无模式数据库(例如SimpleDB)上。
我的问题是,这样做的最佳方式是什么?我非常希望开源(和免费)解决方案成为专有的高成本解决方案。
小记:我正在用Python编写这个应用程序。
答案 0 :(得分:11)
答案 1 :(得分:8)
编辑:
提供一些亮点:RRDTool将时间序列数据存储在循环数据库中。它保留给定时间段内的原始数据,然后以可配置的方式压缩它,这样您就可以获得一个月的细粒度数据,过去6个月中一周的平均数据,以及最后一个月的平均数据。 2年。作为副作用,您的数据库始终保持相同的大小(因此,不会让您的磁盘充满汗水)。这是存储方面。在检索方面,RRDTool提供的数据查询可立即转换为图形(例如png),您可以将其轻松地包含在文档和网页中。它是一个坚如磐石,经过验证的解决方案,与其前身MRTG(有些人可能已经听说过)相比,它是一种非常普遍的形式。一旦你进入它,你会发现自己一遍又一遍地重复使用它。
答案 2 :(得分:1)
纯文本文件?目前还不清楚你的每15分钟10k数据点的字节数是多少,但无论如何,文本文件更容易存储/存档/传输/操作,你可以直接检查,只需查看即可。使用Python也很容易。
答案 3 :(得分:1)
这是非常标准的数据仓库内容。
许多“事实”,由多个维度组织,其中一个是时间。大量聚合。
在许多情况下,使用基于defaultdict
的简单聚合算法处理的简单平面文件将会产生奇迹 - 快速而简单。
答案 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);
}