java - 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
解决方案
首先从最简单的事情开始。
- 定义一个包含必要信息的类。
List
创建一个该类类型的空。- 将每条记录解析为该类的一个实例,并将其添加到列表中。
- 按作业名称(升序)和持续时间(降序)对列表进行排序。
- 依次遍历列表并输出每个作业名称的第一条记录。
这很直接、简单、相当有效,并且不应该使用太多内存。
你有一点复杂,因为一条记录实际上占据了两行,不一定是一个接一个。但是你说解析它不是问题,所以我假设你知道如何处理它。
您可能遇到的唯一问题是,如果日志文件包含太多条目,以至于您无法将所有内容都保存在内存中。如果是这种情况,那么您可以发挥创意并仅保留每个作业名称的当前最长持续时间条目,或者不将列表保存在内存中,而是将其写入磁盘。然后对磁盘文件进行排序,依次遍历。
做你认为可行的最简单的事情。如果它有效,不会耗尽内存,并且足够快地完成,那么你就完成了。不要担心优化空间或速度。继续做其他更重要的事情。
推荐阅读
- vue.js - 无法获取 v-simple-checkbox 或 v-checkbox 来呈现框本身
- javascript - 如何将参数从 JS 函数传递到 PHP 代码
- javascript - 如何有条件地将道具传递给 React JS 中的组件
- node.js - 使用 Docker 后节点不与 Postgres 数据库通信
- react-native - 如何使用 React-Native 创建自定义构建?
- jestjs - 为什么每次我开玩笑都会弹出这个错误EADDRINUSE?
- mysql - TypeORM,ManyToOne 关系:获取没有子关系的父行
- python - Python Keras 调谐器。如何使上一层的神经元总是比下一层多?
- php - PHP数组循环 - 无法访问元素
- batch-file - 带有时间戳的ffmpeg jpg批处理脚本