簡介:
分析大型日誌檔案時,通常需要檢索最後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中文網其他相關文章!