Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mendapatkan Kembali N Baris Terakhir Fail Besar dengan Cekap?

Bagaimana untuk Mendapatkan Kembali N Baris Terakhir Fail Besar dengan Cekap?

Patricia Arquette
Patricia Arquetteasal
2024-11-30 10:39:10445semak imbas

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

Dapatkan N Baris Terakhir Fail, Mensimulasikan 'Ekor'

Pengenalan:

Apabila menganalisis fail log yang besar, selalunya perlu mendapatkan semula N baris terakhir untuk penomboran atau pemeriksaan. Ini menimbulkan persoalan tentang cara mengekori fail log dengan offset dengan cekap.

Penyelesaian Calon 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

Penilaian:

Ini pendekatan membuat andaian tentang purata panjang garisan dan secara berperingkat mencari ke belakang sehingga ia menemui garisan yang mencukupi. Disebabkan anggaran awal, ia mungkin perlu mencari beberapa kali, yang mungkin akan dikenakan penalti prestasi.

Penyelesaian Calon 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:])

Penjelasan:

Kaedah ini berundur melalui blok fail demi blok sehingga ia menemui bilangan baris baharu yang dikehendaki. Ia tidak membuat andaian tentang panjang baris dan dibaca dari awal jika fail terlalu kecil untuk diundur.

Perbandingan:

Penyelesaian Calon 2 secara amnya lebih cekap dan mantap daripada Penyelesaian Calon 1 , kerana ia tidak bergantung pada anggaran dan membaca fail secara berurutan. Ini adalah pendekatan yang lebih dipercayai untuk mengekori fail log dengan offset.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Kembali N Baris Terakhir Fail Besar dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn