我感兴趣的监控某些对象。 我期望能获得每15分钟约10000个数据点。 (也许不是第一次,但这是“一般的球场”)。 我也想能够每天获得,每周,每月和每年的数据统计。 这不是关键,以保持数据的最高分辨率(15分钟)超过两个月。
我正在考虑各种方式来存储这些数据,并一直在寻找一个经典的关系型数据库,或在无模式的数据库(如SimpleDB的)。
我的问题是,什么是沿着这样做最好的方法去? 我非常喜欢使用开源(免费)解决方案,以专有的昂贵的一个。
小记:我用Python写这个应用程序。
我感兴趣的监控某些对象。 我期望能获得每15分钟约10000个数据点。 (也许不是第一次,但这是“一般的球场”)。 我也想能够每天获得,每周,每月和每年的数据统计。 这不是关键,以保持数据的最高分辨率(15分钟)超过两个月。
我正在考虑各种方式来存储这些数据,并一直在寻找一个经典的关系型数据库,或在无模式的数据库(如SimpleDB的)。
我的问题是,什么是沿着这样做最好的方法去? 我非常喜欢使用开源(免费)解决方案,以专有的昂贵的一个。
小记:我用Python写这个应用程序。
HDF5 ,它可以通过访问h5py或PyTables ,是专为处理大型数据集。 两个接口都工作得很好。 例如,既h5py和PyTables具有自动压缩,并且支持numpy的。
RRDTool的由托比欧梯克,绝对! 它是开源的,它被设计用于正是这样的用例。
编辑:
为了提供几个亮点:RRDTool的一个循环赛数据库存储时间序列数据。 它保持原始数据给定的时间段,然后凝结它在一个可配置的方式让你有细粒度的数据说了一个月,平均一个多星期过去6个月的数据,和平均数据在每月的最后一个2年。 作为一个副作用,你的数据库的大小保持不变,所有的时间 (所以没有出汗你磁盘可能运行满)。 这是存储方面。 在检索方面的RRDTool提供了立即变成图表,你可以很容易地包括文档和网页数据的查询(如PNG)。 这是一个坚如磐石,久经考验的解决方案,超过其前任,MRTG(有些人可能已经听说过这)一个更广义的形式。 一旦你坐进它,你会发现自己重新使用它一遍又一遍。
对于一个快速的概述以及谁在使用RRDTool的,也看这里 。 如果你想看看你能生产出各种图形,请确保您有一个看看画廊 。
纯文本文件? 目前还不清楚是什么每十五分钟的10K数据点转化为以字节为单位,而是以任何方式文本文件更易于存储/存档/传输/处理,你可以直接检查,只要看一眼。 很容易与Python工作,太。
这是非常标准的数据仓库的东西。
很多的“事实”,由多个维度,其中一个是时间举办。 大量聚集。
在许多情况下,您使用基于简单的合并算法处理简单的平面文件defaultdict
将创造奇迹-快速和简单。
看看能够有效地存储7.300.000.000行
数据库的选择。大数据量?
目前正在积极开发的开源数据库的时间序列(.NET现在只),我写的。 它可以存储在一个“二进制平面文件”时尚均匀的大量数据(T字节)。 所有使用是面向流的(正向或反向)。 对于股票在我们公司蜱存储和分析,我们积极地使用它。
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);
}