17

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

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

我的问题是,这样做的最佳方法是什么?我更喜欢开源(免费)解决方案,而不是昂贵的专有解决方案。

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

4

5 回答 5

11

HDF5, which can be accessed through h5py or PyTables, is designed for dealing with very large data sets. Both interfaces work well. For example, both h5py and PyTables have automatic compression and supports Numpy.

于 2009-08-26T14:16:43.177 回答
8

绝对是 Tobi Oetiker 的RRDTool !它是开源的,专为此类用例而设计。

编辑:

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

如需快速概览以及使用 RRDTool 的人员,请参见此处。如果您想查看可以制作哪种图形,请务必查看图库

于 2009-08-26T14:29:48.240 回答
1

纯文本文件?目前尚不清楚每 15 分钟的 10k 个数据点以字节为单位转换为什么,但无论如何文本文件更容易存储/存档/传输/操作,您只需查看即可直接检查。使用 Python 也相当容易。

于 2009-08-26T14:31:07.537 回答
1

这是非常标准的数据仓库的东西。

许多“事实”,按多个维度组织,其中之一是时间。很多聚合。

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

查看有效存储 7.300.000.000 行

大数据量的数据库选择?

于 2009-08-26T16:52:11.607 回答
0

我编写了一个正在积极开发中的开源时间序列数据库(目前仅 .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);
}
于 2012-03-13T14:22:25.043 回答