存储时间序列数据的最佳开源解决方案是啥? [关闭]
Posted
技术标签:
【中文标题】存储时间序列数据的最佳开源解决方案是啥? [关闭]【英文标题】:What is the best open source solution for storing time series data? [closed]存储时间序列数据的最佳开源解决方案是什么? [关闭] 【发布时间】:2010-11-23 00:25:54 【问题描述】:我有兴趣监视一些对象。我希望每 15 分钟获得大约 10000 个数据点。 (也许一开始不是,但这是“一般的球场”)。我还希望能够获得每日、每周、每月和每年的统计数据。将数据保持最高分辨率(15 分钟)两个月以上并不重要。
我正在考虑存储这些数据的各种方法,并且一直在研究经典的关系数据库或无模式数据库(例如 SimpleDB)。
我的问题是,这样做的最佳方式是什么?我更喜欢开源(免费)解决方案,而不是昂贵的专有解决方案。
小记:我正在用 Python 编写这个应用程序。
【问题讨论】:
您可能正在寻找某种分箱解决方案。您可能会发现此相关问题中的讨论很有帮助:***.com/questions/1248815/… 【参考方案1】:HDF5,可以通过h5py或PyTables访问,专为处理非常大的数据集而设计。两个接口都运行良好。例如,h5py 和 PyTables 都具有自动压缩功能,并且支持 Numpy。
【讨论】:
这看起来很有趣,我去看看。【参考方案2】:RRDTool Tobi Oetiker,绝对是!它是开源的,专为此类用例而设计。
编辑:
提供一些亮点:RRDTool 将时间序列数据存储在循环数据库中。它保留给定时间段内的原始数据,然后以可配置的方式对其进行压缩,因此您可以获得一个月的细粒度数据,过去 6 个月的一周内的平均数据,以及过去一个月内的平均数据2年。作为副作用,您的数据库始终保持相同的大小(因此不会让您的磁盘满负荷运行)。这是存储方面。在检索方面,RRDTool 提供了数据查询,这些查询可以立即转换为图形(例如 png),您可以轻松地将其包含在文档和网页中。这是一个坚如磐石、经过验证的解决方案,比其前身 MRTG 更通用(有些人可能听说过)。一旦你投入其中,你会发现自己一遍又一遍地重复使用它。
如需快速概览以及使用 RRDTool 的用户,另请参阅 here。如果您想了解您可以制作哪些类型的图形,请务必查看gallery。
【讨论】:
我知道 RRDTool,很高兴再给它一个“投票”。我会更深入地研究它。顺便说一句,你知道你是否可以在 Python 中与它交互吗? @lorg 我自己没有尝试过,但是文档明确列出了 Python 绑定 (oss.oetiker.ch/rrdtool/prog/rrdpython.en.html) 它有 Python 绑定。但是上次我(很久以前)看时,它们效果不佳。我最终只是用这个类的子进程调用来包装 CLI:code.google.com/p/perfmetrics/source/browse/trunk/lib/rrd.py @Corey 对,这就是我使用 RRDtool 的方式,这样做很自然。 你可能会看看 PyRRD - 它不是 100% 令人惊叹,但在基础方面做得很好。【参考方案3】:纯文本文件?目前尚不清楚每 15 分钟的 10k 个数据点以字节为单位转换为什么,但无论如何文本文件更容易存储/存档/传输/操作,您只需查看即可直接检查。使用 Python 也相当容易。
【讨论】:
【参考方案4】:这是非常标准的数据仓库。
许多“事实”,按多个维度组织,时间就是其中之一。大量聚合。
在许多情况下,您使用基于defaultdict
的简单聚合算法处理的简单平面文件将产生奇迹——快速且简单。
看Efficiently storing 7.300.000.000 rows
Database choice for large data volume?
【讨论】:
【参考方案5】:我编写了一个正在积极开发中的开源时间序列数据库(目前仅 .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);
【讨论】:
以上是关于存储时间序列数据的最佳开源解决方案是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中存储网站设置的最佳方式是啥? [关闭]
在开源社区中构建 C/C++ 程序的最佳方式是啥? [关闭]