今天碰到一个问题,操作类似数据库:从文件中读取日志,原本每一条日志可以分为若干字段,假设为:time,a,b,c。
现在对这个日志文件进行聚合,规则是,日志文件是按照time分端进行合并。比如按照每5分钟为一段,每一段内的日志如果除了time字段外,abcd如果都一样,就合并,并在每条日志后最后一个添加一个字段ount,
标识这种日志在某个时间段内有几条。所以归并之后,每个时间段内是没有重复日志的,当然两个不同的时间段,比如10:00-10:04 和10:05-10:09这个不同的时间段内是可以有相同的日志的。
现在的问题是要从日志文件读取,并进行统计。比如现在有这么一种情况,所有日志先按照a字段进行划分,分为a1,a2….ai,按照日志进行排序。然后在每一类中,比如a1中,按照b1,b2,..bj进行再次排序。同样在a2大类里也按照b1,b2…bj进行排序。直到类型c。
所以,这个问题是一个多层次的排序问题。如何比较高效得解决问题?
第一反应就是用多级map来处理。
map<a, {count, *submap}> ma
先按照a的类型就行分类映射,其中的count标识a这种类型的日志的条数。submap指向a这种大类下的按照b划分的子映射。比如为 map<b, {count, *submap} >mb
, 同样,submap指向b这个分类下的c的映射,假设为 map<c, {count, *submap}>mc
, 在当前情况下,c后面没有再分子类,那么 mc中的 submap可以设置为NULL。随着日志的读取插入,每一层次的count一直在变。直到所有的日志都处理完毕。那么多层次的map也就构建完成。那么接下去的工作是如何排序?
(续)