1

我已经分隔了日志文件,这些文件每 5 分钟捕获一次某些进程的快照。我想对它们进行一些统计分析,对数据的子集进行分组和绘制图表等。其中一部分将涉及计算进程打开的时间(即总分钟数 = 它在 x 5 中的快照显示方式)。我可以使用 Python、R 或任何我选择的语言。

挑战在于没有一个字段是唯一的(存在一对多和多对多关系),因此唯一的匹配是当整行上的每个元素都相同时。

也许一个例子会有所帮助。假设第一个快照日志如下所示:

R123,M,5,... <-- line A
R190,Z,4,...
R663,M,8,...

然后 5 分钟后,下一个快照显示:

R123,M,5,... <-- line A
R123,P,3,... <-- line B
R955,Z,3,...

显然,A 行中的过程现在至少已经存在了 5 分钟。但是即使 B 行具有相同的第一个字段,其他字段也不匹配,因此它不是同一个过程。

我只是想找出一个好的数据模型,使这些数据易于使用。

一种选择是简单的频率计数:将每一整行读入 Python dict 或 Perl 哈希,并以该行作为键,这样当重复行出现在下一个快照中时,它只会添加到计数中。例如在 Perl 中:$count{$_}++ foreach @lines;

但是一整行数据甚至可以作为字典键有效吗?那么不连续的实例呢,比如如果 A 行连续出现 3 个快照,然后另一天再次出现?--这些应该是单独的实例,以便基于时间的查询仍然有效。

关于如何处理和存储这些数据的任何建议?

4

1 回答 1

1

第一个问题——当然,至少在 Perl 中你可以使用任何字符串作为散列键。无限。

下一步:按顺序评估快照。在快照 1 中,只需将所有内容读入内存并为每个项目分配一个计数器 0。继续进行快照 2。在快照 N 处,进行如下操作: 任何新内容都存储在内存中,并分配计数 0。任何已经在内存中的内容都保存在内存中,并增加计数器。任何在内存中但不再在当前快照中的东西都会被归档到输出文件中。

如果您担心日志文件的大小,请使用 SQL 数据库而不是 Perl 的哈希,例如通过 DBI 的 SQLite。

于 2013-06-27T22:48:05.913 回答