【问题标题】:Quickly find lines from a log file, seeking backwards, then read line by line快速从日志文件中查找行,向后查找,然后逐行读取
【发布时间】:2012-03-25 15:41:25
【问题描述】:

我在日志文件中有行,按时间顺序附加。例如,可能是最近 30 天的数据,从 30 天前开始,然后是 29 天前,然后是 28 天前,等等。

我想按正常的时间顺序读取文件,但是从某个点开始(例如,从 7 天前开始,读取 7 天前的数据,然后读取 6 天前的数据,然后读取 5 天前的数据等)

一种方法是正常读取文件,但是出于速度原因,我需要: - 从文件末尾以指数方式向后寻找,以找到正确的起点 - 然后,一旦我找到了正确的起点,就按正序逐行阅读

我无法让它工作。我首先在这里修改答案: Most efficient way to search the last x lines of a file in python

有人可以提供帮助或提供有关更好方法的指导吗?

【问题讨论】:

  • 我会考虑将日志文件拆分为多个文件——每个文件都包含适当的持续时间,以便从一开始就进行搜索。 (也就是说,如果你有选择)
  • 我认为向后读取 指数 没有多大意义,因为您的计划是从那时开始读取 整个 文件.以指数方式向后读取,再加上通过了所需点后的二进制搜索,将帮助您在 O(log N) 时间内找到所需的第一行,但这对您来说只是毫无意义的复杂性,因为它将花费您 O(N)是时候从那一点开始阅读这些行了。

标签: python file search


【解决方案1】:

如果速度是一个问题,那可能意味着您需要多次执行此操作,或者必须即时执行此操作。因此,您可以构建一个索引文件,显示您每天必须到 seek 的位置,例如:

Day 1: 0
Day 2: 1048576
Day 3: 2097152
Day 4: 6291456
....

这将允许在建立索引后快速查找任何一天。

更新此索引的算法是从已知最后一天的位置开始,向前读取,每次到达新的一天时将其添加到索引中。

【讨论】:

    【解决方案2】:

    由于行是连续的,您可以执行half-interval search 以非常快速(log N 的顺序)到达感兴趣的开始日,然后从那里继续阅读。例如,如果日志文件有 10 亿行,则最多需要 30 次读取才能找到感兴趣的开始日期...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多