首页 > 解决方案 > CPU 日志解析、分组和报告

问题描述

以下是读取的日志文件示例,包括:JobStatus:(Finished, Processing)、JobName、InstanceName、Duration。
不保证事件的顺序。

使用 Java,完整解析此日志文件并报告每个 jobName 的名称和完成所需的最长持续时间的最有效方法是什么?你会使用什么数据结构?

 HashMap<String, TreeMap<Integer, String>>
 or
 List<HashMap<String, TreeMap<Integer, String>>>   

您将如何打印在不同作业名称之间排序的最终结果?

Sample Input:
--------------
"Processing jobName=execute    jobInstanceId=x1"
"Processing jobName=execute    jobInstanceId=y1"
"Finished   jobInstanceId=x1   duration=920"
"Finished   jobInstanceId=y1   duration=12009"
"Finished   jobInstanceId=z1   duration=50"
"Processing jobName=analyze    jobInstanceId=z1"

Expected Output:
--------------
execute  12009
analyze  50

标签: javahashmapcomparatorpriority-queuetreemap

解决方案


首先从最简单的事情开始。

  1. 定义一个包含必要信息的类。
  2. List创建一个该类类型的空。
  3. 将每条记录解析为该类的一个实例,并将其添加到列表中。
  4. 按作业名称(升序)和持续时间(降序)对列表进行排序。
  5. 依次遍历列表并输出每个作业名称的第一条记录。

这很直接、简单、相当有效,并且不应该使用太多内存。

你有一点复杂,因为一条记录实际上占据了两行,不一定是一个接一个。但是你说解析它不是问题,所以我假设你知道如何处理它。

您可能遇到的唯一问题是,如果日志文件包含太多条目,以至于您无法将所有内容都保存在内存中。如果是这种情况,那么您可以发挥创意并仅保留每个作业名称的当前最长持续时间条目,或者不将列表保存在内存中,而是将其写入磁盘。然后对磁盘文件进行排序,依次遍历。

做你认为可行的最简单的事情。如果它有效,不会耗尽内存,并且足够快地完成,那么你就完成了。不要担心优化空间或速度。继续做其他更重要的事情。


推荐阅读