使用插值搜索在大文本文件中查找列表的开头 - 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)
...
似乎应该有一个更简单的解决方案,但我没有看到。也许日志功能可以提供帮助?
我需要在行数未知的非常大的日志文件中找到最后一个时间戳,然后才能到达带有时间戳的行。我一次一行地向后阅读文件,除了一种情况外,这通常很快。有时,我会 运行 放入一个非常大的块(数千行),具有已知的重复模式(如下所示的一个条目)并且没有时间戳:
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)
...
似乎应该有一个更简单的解决方案,但我没有看到。也许日志功能可以提供帮助?