【问题标题】:Search a datetime in a log file using Binary Search in C/C++使用 C/C++ 中的二分搜索在日志文件中搜索日期时间
【发布时间】: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


【解决方案1】:

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

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

希望这会有所帮助,并希望我对它的工作原理的解释很清楚

【讨论】:

  • 是的,我就是这么想的。但是在 C++ 中,我发现很难使用 seekg 和 tellg 来操纵位置。是否支持 + 运算符?
  • 不确定它是否支持 + 运算符,但您可以使用 seekg 从当前位置前后移动,使用 seekg 管理位置肯定会很困难。让我想想你如何管理文件中的位置,我会回复你
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答!但这是更大应用程序的子问题,我必须同时对一堆大文件进行此操作。所以我想即时完成,而不是将它们全部加载到内存中:-)
  • mmap() 很便宜;您只分配了一些内部管理对象。所以阅读例如char line[8192] 可能比 mmap()'ing TB 大小的文件消耗更多的内存。
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2023-03-05
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多