我怀疑你多虑了。为什么不使用每个时间间隔一行的平面(例如)制表符分隔文件,每行包含时间戳和 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)
}
}
(注意:我现在无法测试这些示例程序中的任何一个,因此它们可能包含错误或拼写错误。使用风险自负!)