Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mendapatkan Kembali N Baris Terakhir Fail Besar dengan Cekap?
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.
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.
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.
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!