简介:
分析大型日志文件时,通常需要检索最后 N 行以进行分页或检查。这就提出了如何有效地使用偏移量尾部日志文件的问题。
def tail(f, n, offset=0): avg_line_length = 74 to_read = n + offset while 1: try: f.seek(-(avg_line_length * to_read), 2) except IOError: f.seek(0) pos = f.tell() lines = f.read().splitlines() if len(lines) >= to_read or pos == 0: return lines[-to_read:offset and -offset or None] avg_line_length *= 1.3
评估:
This该方法对平均行长度进行假设,并逐渐向后查找,直到找到足够的行。由于最初的估计,它可能需要多次寻找,可能会导致性能损失。
def tail(f, lines=20): BLOCK_SIZE = 1024 f.seek(0, 2) block_end_byte = f.tell() lines_to_go = lines block_number = -1 blocks = [] while lines_to_go > 0 and block_end_byte > 0: if (block_end_byte - BLOCK_SIZE > 0): f.seek(block_number * BLOCK_SIZE, 2) blocks.append(f.read(BLOCK_SIZE)) else: f.seek(0, 0) blocks.append(f.read(block_end_byte)) lines_found = blocks[-1].count('\n') lines_to_go -= lines_found block_end_byte -= BLOCK_SIZE block_number -= 1 all_read_text = ''.join(reversed(blocks)) return '\n'.join(all_read_text.splitlines()[-lines:])
解释:
此方法逐块回溯文件,直到找到所需数量的换行符。它不会对行长度做出假设,如果文件太小而无法回溯,则会从头开始读取。
候选解决方案 2 通常比候选解决方案 1 更高效、更稳健,因为它不依赖于估计并按顺序读取文件。这是一种更可靠的使用偏移量来跟踪日志文件的方法。
以上是如何高效检索大文件的最后N行?的详细内容。更多信息请关注PHP中文网其他相关文章!