我有兴趣监视一些对象。我希望每 15 分钟获得大约 10000 个数据点。(也许一开始不是,但这是“一般的球场”)。我还希望能够获得每日、每周、每月和每年的统计数据。将数据保持最高分辨率(15 分钟)两个月以上并不重要。
我正在考虑存储这些数据的各种方法,并且一直在研究经典的关系数据库或无模式数据库(例如 SimpleDB)。
我的问题是,这样做的最佳方法是什么?我更喜欢开源(免费)解决方案,而不是昂贵的专有解决方案。
小提示:我正在用 Python 编写这个应用程序。
我有兴趣监视一些对象。我希望每 15 分钟获得大约 10000 个数据点。(也许一开始不是,但这是“一般的球场”)。我还希望能够获得每日、每周、每月和每年的统计数据。将数据保持最高分辨率(15 分钟)两个月以上并不重要。
我正在考虑存储这些数据的各种方法,并且一直在研究经典的关系数据库或无模式数据库(例如 SimpleDB)。
我的问题是,这样做的最佳方法是什么?我更喜欢开源(免费)解决方案,而不是昂贵的专有解决方案。
小提示:我正在用 Python 编写这个应用程序。
绝对是 Tobi Oetiker 的RRDTool !它是开源的,专为此类用例而设计。
编辑:
提供一些亮点:RRDTool 将时间序列数据存储在循环数据库中。它保留给定时间段内的原始数据,然后以可配置的方式对其进行压缩,因此您可以获得一个月的细粒度数据,过去 6 个月的一周内的平均数据,以及过去一个月内的平均数据2年。作为副作用,您的数据库始终保持相同的大小(所以没有出汗你的磁盘可能会运行满)。这是存储方面。在检索方面,RRDTool 提供了数据查询,这些查询可以立即转换为图形(例如 png),您可以轻松地将其包含在文档和网页中。这是一个坚如磐石、经过验证的解决方案,比其前身 MRTG 更通用(有些人可能听说过)。一旦你进入它,你会发现自己一遍又一遍地重复使用它。
纯文本文件?目前尚不清楚每 15 分钟的 10k 个数据点以字节为单位转换为什么,但无论如何文本文件更容易存储/存档/传输/操作,您只需查看即可直接检查。使用 Python 也相当容易。
这是非常标准的数据仓库的东西。
许多“事实”,按多个维度组织,其中之一是时间。很多聚合。
在许多情况下,使用基于简单聚合算法的简单平面文件defaultdict
将产生奇迹——快速且简单。
我编写了一个正在积极开发中的开源时间序列数据库(目前仅 .NET)。它可以以“二进制平面文件”的方式存储大量(TB)的统一数据。所有使用都是面向流的(正向或反向)。我们积极将其用于我们公司的股票报价存储和分析。
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);
}