使用插值搜索在大文本文件中查找列表的开头 - Python

Using interpolation search to find beginning of list in large text file - Python

我需要在行数未知的非常大的日志文件中找到最后一个时间戳,然后才能到达带有时间戳的行。我一次一行地向后阅读文件,除了一种情况外,这通常很快。有时,我会 运行 放入一个非常大的块(数千行),具有已知的重复模式(如下所示的一个条目)并且没有时间戳:

  goal_tolerance[0]: 
    name: joint_b
    position: -1
    velocity: -1
    acceleration: -1

由于这是我遇到此类问题的唯一情况,我可以将一段代码放入循环中,在逐行搜索日志之前检查它。

goal_tolerance 之后的数字是一个计数器,每次模式重复时增加 1,所以我想做的是使用该数字来计算模式的开始。我现在看到的是这样的:

if '  goal_tolerance' in line:
    gtolnum = line[17:-3]
    print gtolnum
    startFrom = currentPosition - ((long(gtolnum) + 1) * 95)
    break

但是,这并没有考虑到计数器中的字符数,因此我最终运行在搜索循环中比必要的次数多了几次。有没有一种快速的方法可以将这些字符包括在计算中?

编辑:我没有阅读整个文件来达到这一点,因为它很大,而且我有数百个时间戳要在数百个日志文件中搜索。我的搜索功能查找文本文件中的某个位置,然后找到靠近该点的一行的开头并读取它。计算是根据模式中的字节数或字符数确定我可以与 .seek() 一起使用的文件位置。

同时我做了一些数学运算并得出了一个数学解决方案:

...
n = long(gtolnum)
q = len(gtolnum)        # I'll refer to this as the number's "level"
x = n + 1 - 10**(q - 1) # Number of entries in the current level
c = x * (q - 1)         # Additional digits in the current level
i = 2
p = 0
while i < q:
    p += 9 * (q - i) * (10**(q - i))  # Additional digits in i levels previous
    i += 1
startFrom = currentPosition - ((n + 1) * 95 + p + c)
...

似乎应该有一个更简单的解决方案,但我没有看到。也许日志功能可以提供帮助?