我分隔了日志文件,每5分钟捕获一些进程的快照。我想对它们进行一些统计分析,对数据的子集进行分组和制图等,其中一部分涉及计算过程开放的时间(即总分钟=它在x 5中出现的快照)。我可以使用Python,R或我选择的任何语言。
挑战在于 none 这些字段是唯一的(有一对多和多对多的关系),所以唯一的匹配是每个整行的元素是相同的。
也许一个例子会有所帮助。假设第一个快照日志如下所示:
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;
但是整行数据甚至可以作为字典键有效吗?那么非连续的实例呢,比如连续3个快照出现A行然后又出现另一天? - 那些应该是单独的实例,以便基于时间的查询仍然有效。
对我如何处理&amp;的任何建议存储此数据?
答案 0 :(得分:1)
第一个问题 - 确保,至少在Perl中,您可以使用任何字符串作为哈希键。没有限制。
下一步:按顺序评估快照。在快照1中,只需将所有内容读入内存并为每个项目分配一个计数器0。继续执行快照2.在快照N处,按以下步骤操作:将任何新内容存储在内存中并分配计数0.任何已经在内存中的内容都会使用增加的计数器保存在内存中。内存中但不再存在于当前快照中的任何内容都会被归档到输出文件中。
如果您担心日志文件的大小,而不是Perl的哈希使用SQL数据库,例如SQLite通过DBI。