使用C / C ++中的二进制搜索在日志文件中搜索日期时间

时间:2013-10-31 14:45:25

标签: c++ c binary-search log4cpp

我有一些由log4cpp格式写的日志文件

- 根据log4cpp的性质,此文件按每行开头的日期时间排序

假设格式类似

2012-09-02 17:17:36.891 This is line 1 in file 2   
...
2013-08-05 14:17:35.344 This is line 607082 in file 2
2013-08-05 14:17:36.891 This is line 607083 in file 2
...
2013-09-05 14:27:36.891 This is line 934594 in file 2

现在我正在编写一个解析这些文件的程序,并尝试快速找到一行。

例如,如果我运行

./ my_program -start_time“2013-08-05 14:17:36”file_2.txt

我希望这个程序可以返回607083.

此外,-start_time可以基于其他粒度,如“2013-08-05 14:17:35.899”或“2013-08-15”但我期待最接近的结果。

我可以逐行遍历此文件,并比较每行开头的时间戳(只是使用字符串比较),但这需要O(N)时间。我已经实现了这一点,并且发现如果开头有数百万行可以跳过它,那真的很慢。

我想知道我们是否可以使用二进制搜索。我认为这是返回最近结果的最佳方式,只需要O(lgN)时间

2 个答案:

答案 0 :(得分:0)

是的,你可以。这是按日期排序的日志。为什么不采取应该是最近和最近一次约会的第一行和最后一行。

您可以创建一个将日期转换为秒的函数。在第一个电话中,转到您的日志中间并检查您的日期是大还是小等等......(二进制搜索)

希望这会有所帮助,并希望我对这将如何运作的解释是明确的

答案 1 :(得分:0)

当你在Unix / Posix下运行它时,你可以mmap()整个文件并对内存进行操作(并避免使用lseek()和朋友)。

所以,你得到一个'char * logbuffer = mmap(...)'指针,可以在那里执行二进制搜索。