【问题标题】:Storing time series data, without a database存储时间序列数据,无需数据库
【发布时间】:2012-09-02 07:49:49
【问题描述】:

我想存储时间序列数据,例如 6 个月以上的 CPU 使用率(将每 2 分钟轮询一次 CPU 使用率,因此稍后我可以获得多个分辨率,例如 - 1 周、1 个月,甚至更高的分辨率, 5 分钟等)。

我正在使用 Perl,我不想使用 RRDtool 或关系数据库,我正在考虑使用某种具有以下属性的循环缓冲区(环形缓冲区)来实现我自己的:

  1. 6 个月 = 186 天 = 4,464 小时 = 267,840 分钟。
  2. 将其分为 2 分钟部分:267,840 / 2 = 133,920。
  3. 133,920 是环形缓冲区大小。
  4. 环形缓冲区中的每个元素都是一个 hashref,键为纪元(使用 localtime 轻松转换为日期时间),值是该给定时间的 CPU 使用率。
  5. 我将序列化这个环形缓冲区(我猜是使用Storable

还有其他建议吗? 谢谢,

【问题讨论】:

  • 我强烈建议您使用数据库。 SQLite 不需要服务器

标签: perl datetime time-series


【解决方案1】:

我怀疑你想多了。为什么不只使用一个平面(例如)制表符分隔的文件,每个时间间隔一行,每一行包含一个时间戳和 CPU 使用率?这样,您可以在收集新条目时将它们附加到文件中。

如果您想自动丢弃超过 6 个月的数据,您可以通过为每天(或每周或每月或其他任何时间)使用单独的文件并删除旧文件来实现此目的。这比每次都读取和重写整个文件效率更高。


在 Perl 中编写和解析此类文件很简单。下面是一些示例代码,我想不到:

写作:

use strict;
use warnings;
use POSIX qw'strftime';

my $dir = '/path/to/log/directory';

my $now = time;
my $date = strftime '%Y-%m-%d', gmtime $now;  # ISO 8601 datetime format
my $time = strftime '%H:%M:%S', gmtime $now;

my $data = get_cpu_usage_somehow();

my $filename = "$dir/cpu_usage_$date.log";

open FH, '>>', $filename
    or die "Failed to open $filename for append: $!\n";

print FH "${date}T${time}\t$data\n";

close FH or die "Error writing to $filename: $!\n";

阅读:

use strict;
use warnings;
use POSIX qw'strftime';

my $dir = '/path/to/log/directory';

foreach my $filename (sort glob "$dir/cpu_usage_*.log") {
    open FH, '<', $filename
        or die "Failed to open $filename for reading: $!\n";
    while (my $line = <FH>) {
        chomp $line;
        my ($timestamp, $data) = split /\t/, $line, 2;
        # do something with timestamp and data (or save for later processing)
    }
}

(注意:我现在无法测试这些示例程序,因此它们可能包含错误或拼写错误。使用风险自负!)

【讨论】:

    【解决方案2】:

    正如@Borodin 建议的那样,使用 SQLite 或 DBM::Deep 作为推荐的here

    如果您想坚持使用 Perl 本身,请使用 DBM::Deep

    一个独特的平面文件数据库模块,用纯 perl 编写。 ... 可以处理数百万个键和无限级别,而不会显着减速。用纯 perl 从头开始​​编写——这不是基于 C 的 DBM 的包装器。与 Unix、Mac OS X 和 Windows 的开箱即用兼容性。

    您提到了您对存储的需求,这可以通过@llmari 提倡的简单文本文件来满足。 (当然,使用 CSV 格式可以轻松地在电子表格中操作文件。)

    但是,如果您打算收集 大量数据,并且希望最终能够以良好的性能查询它,那么请使用专为那个目的。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 2018-07-19
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 2021-11-23
      • 2010-12-13
      • 2023-04-01
      相关资源
      最近更新 更多