首頁 >後端開發 >Python教學 >如何有效率地檢索大文件的最後N行?

如何有效率地檢索大文件的最後N行?

Patricia Arquette
Patricia Arquette原創
2024-11-30 10:39:10438瀏覽

How to Efficiently Retrieve the Last N Lines of a Large File?

取得檔案的最後N 行,模擬「尾部」

簡介:

分析大型日誌檔案時,通常需要檢索最後N 行以進行分頁或檢查。這就提出瞭如何有效地使用偏移量尾部日誌檔案的問題。

候選解1:

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此方法對平均行長度進行假設,並逐漸向後尋找,直到找到足夠的行。由於最初的估計,它可能需要多次尋找,可能會導致效能損失。

候選解 2:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn