2

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. リングバッファの各要素は、キーをエポックとして ( を使用して簡単に日時に変換されるlocaltime) ハッシュリファレンスになり、値はその特定の時間の CPU 使用率になります。
  5. このリングバッファをシリアル化します(Storable推測を使用して)

他の提案はありますか?ありがとう、

4

2 に答える 2

10

あなたはこれを考えすぎているのではないかと思います。時間間隔ごとに 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)
    }
}

(注: 現在、これらのサンプル プログラムのいずれもテストできないため、バグやタイプミスが含まれている可能性があります。ご自身の責任で使用してください!)

于 2012-09-08T22:18:55.893 に答える
2

@Borodin が示唆するように、SQLite を使用するか、ここでDBM::Deep推奨されるようにします。

Perl 自体に固執したい場合は、DBM::Deepを使用してください:

純粋な perl で書かれたユニークなフラット ファイル データベース モジュール。... 何百万ものキーと無制限のレベルを大幅な速度低下なしに処理できます。純粋な perl で一から書かれています -- これは C ベースの DBM のラッパーではありません。Unix、Mac OS X、および Windows とのすぐに使える互換性。

@llmariが提唱する単純なテキストファイルで満たすことができるストレージの必要性について言及しています。(もちろん、CSV 形式を使用すると、ファイルをスプレッドシートで簡単に操作できます。)

ただし、大量のデータを収集する予定があり、最終的には優れたパフォーマンスでクエリを実行できるようにしたい場合は、その目的のために設計されたツールを使用してください。

于 2012-09-10T01:32:31.410 に答える