【发布时间】:2013-10-31 14:45:24
【问题描述】:
我有一些 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) 时间
【问题讨论】:
-
你应该分析你的程序并找出慢的部分是什么,我希望(如果文件很大)大部分时间都花在读取文件而不是比较字符串值上。这将指出如何优化(读取时更大的缓冲区等)。
-
对我来说很有意义。将文件大小分成两半,寻找该位置,找到最近的 \n,解析日期和时间 -> 选择要继续挖掘的那一半。如果日期和时间逐行增加,您最终会找到您要搜索的内容。
-
@Anton 这些行没有按时间排序。
-
另外,你为什么要制作自定义程序 - 只需使用 awk。
-
@self 对不起,我没有在问题中提到它。该文件由 log4cpp 生成,并按时间排序。我已经编辑了问题
标签: c++ c binary-search log4cpp