【问题标题】:CPU Log parsing, grouping and reportingCPU 日志解析、分组和报告
【发布时间】:2019-06-26 15:05:20
【问题描述】:

以下是读取的日志文件示例,包括: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

【问题讨论】:

  • 您的问题非常广泛。我建议你分解一下。从解析开始。一旦你可以解析它,然后担心如何解释信息。考虑一下,然后发布具体的、针对性强的问题。
  • 在java中传递日志/平面文件的选项太多了。需要研究。
  • 谢谢@JimMischel,我应该更清楚这个问题。问题不在于解析。挑战在于 DS 建议您将数据解析成什么,这样我们就可以从每个 jobName 中找到 jobInstance 的最大持续时间并按排序顺序打印它。避免定义不必要的 DS 和消耗不必要的空间的最有效方法是什么?你会将什么信息解析成什么确切的 DS?感谢任何帮助

标签: java hashmap comparator priority-queue treemap


【解决方案1】:

先从最简单的开始。

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

这很直接、简单、相当高效,而且不应该占用太多内存。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多