我有一个文件说abc.log,其中附加了带时间戳的数据。
例如:
2018-02-18 22:42:05 DATA_ONE
2018-02-18 22:42:20 DATA_TWO
2018-02-18 22:44:05 DATA_THREE
2018-02-19 00:42:05 DATA_FOUR
2018-02-19 01:42:05 DATA_FIVE
2018-02-19 01:44:05 DATA_SIX
2018-02-19 03:42:05 DATA_SEVEN
2018-02-19 04:42:05 DATA_EIGHT
2018-02-19 06:42:05 DATA_NINE
在Java中过去两小时内只读取/获取带时间戳的那些行的最快或最有效的方法是什么?
我知道的一种方法是逐行读取和解析整个文件,并且只获得最近两小时内有时间戳的那些行,但有没有更好或更有效的方法呢?
注意:由于数据被附加到文件,因此文件大小会呈指数级增长。读取整个文件并每次解析都会导致性能问题。
答案 0 :(得分:0)
Yoy可以使用Dichotomic search or binary search algoritm
第一次搜索位于文件的中间。 根据读取记录之前或之后的时间,下一次搜索将在文件的第一季度或第三季度完成。等等。每次阅读都会缩小he堆栈。找到第一条记录后,按顺序阅读下一条记录。
要读取文件的中间部分,您需要使用文件的随机访问。
如何确定每条记录取决于文件的结构。
答案 1 :(得分:0)
如果你想保持文件的方式,你可以每小时生成一个文件
在这种情况下,收集最后两个小时的日志将足够简单:它将在3个文件上执行,您将忽略不在该区间内的日志。
滚动文件日志框架的附加程序可以实现此目标。不要重新发明轮子。
其他替代方法:将这些信息存储在数据库中并执行查询 如果您的日志增长会更有效,此外,如果您的需求发生变化,它也会更灵活。