偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何優(yōu)雅地處理超大文件?用流式 + yield,輕松應(yīng)對(duì)巨型日志!

開(kāi)發(fā)
面對(duì)超大文件(幾十 GB 的日志),你還在一行一行慢慢讀?其實(shí)高手更喜歡用流式處理 + yield,不僅優(yōu)雅,還能讓內(nèi)存占用低得嚇人!

面對(duì)超大文件(幾十 GB 的日志),你還在一行一行慢慢讀?其實(shí)高手更喜歡用流式處理 + yield,不僅優(yōu)雅,還能讓內(nèi)存占用低得嚇人!

為什么不能一次性讀完?

最常見(jiàn)錯(cuò)誤寫法是:

with open('huge.log', 'r', encoding='utf-8') as f:
    data = f.read()  # ?

問(wèn)題:

  • .read() 會(huì)把整個(gè)文件內(nèi)容加載到內(nèi)存!
  • 文件一旦超過(guò)內(nèi)存大小,程序直接 OOM(內(nèi)存溢出)。

所以,處理大文件的核心是:永遠(yuǎn)不要一次性讀完!

正確做法:流式逐行讀取

最基礎(chǔ)的穩(wěn)健方案是:

def read_file_line_by_line(filepath: str):
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            yield line.rstrip('\n')  # 用 yield 每次返回一行

怎么用?

for line in read_file_line_by_line('huge.log'):
    if 'ERROR' in line:
        print(line)

yield 的好處:

  • 不是一次性讀全部,而是懶加載,一行一行處理。
  • 保證內(nèi)存占用極低,即使是 100GB 也沒(méi)問(wèn)題!

更高效的方式:按塊(chunk)讀取 + yield

逐行讀取有點(diǎn)慢?那可以分塊讀取,然后用 yield:

def read_file_in_chunks(filepath: str, chunk_size: int = 1024 * 1024):
    with open(filepath, 'r', encoding='utf-8') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

每次讀 1MB(可以調(diào)整),然后按需處理。

注意:如果按塊讀取,可能存在行被切斷的問(wèn)題,通常需要自己補(bǔ)全一行。

高級(jí)版本是:

def read_file_by_line_efficient(filepath: str, buffer_size: int = 1024*1024):
    withopen(filepath, 'r', encoding='utf-8') as f:
        buffer = ''
        whileTrue:
            chunk = f.read(buffer_size)
            ifnot chunk:
                break
            buffer += chunk
            while'\n'in buffer:
                line, buffer = buffer.split('\n', 1)
                yield line
        if buffer:
            yield buffer

這段代碼解決了跨塊的半行問(wèn)題!

進(jìn)階版:加個(gè)實(shí)時(shí)進(jìn)度顯示!

如果你想邊讀邊看到進(jìn)度,可以這樣做:

import os

def read_file_with_progress(filepath: str):
    total_size = os.path.getsize(filepath)
    read_size = 0

    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            read_size += len(line.encode('utf-8'))
            progress = (read_size / total_size) * 100
            print(f'\r讀取進(jìn)度:{progress:.2f}%', end='')
            yield line.rstrip('\n')

每處理一行,更新一次進(jìn)度,體驗(yàn)感拉滿!

小結(jié)

方法

適合場(chǎng)景

說(shuō)明

.read()

 整體讀

小文件(KB/MB)

不推薦大文件

逐行 for line in f

大多數(shù)大文件場(chǎng)景

穩(wěn)定可靠

按塊 chunk 讀取

超大文件、性能要求高

注意跨行處理

加進(jìn)度顯示

體驗(yàn)更好

推薦實(shí)際項(xiàng)目用

責(zé)任編輯:趙寧寧 來(lái)源: Ssoul肥魚(yú)
相關(guān)推薦

2025-01-20 07:10:00

LambdaJavanull

2023-05-12 12:09:38

職責(zé)鏈模式客服

2014-07-22 09:01:53

SwiftJSON

2024-02-01 18:06:04

Python編程系統(tǒng)

2024-01-15 08:09:44

Fluent錯(cuò)誤代碼

2024-10-14 11:08:53

程序異常延遲

2024-09-26 10:51:51

2022-07-25 11:33:48

Python大文件

2025-01-13 00:26:53

2022-08-03 08:41:30

客戶端操作并發(fā)請(qǐng)求

2023-08-29 07:35:15

2009-12-11 15:37:58

Linux日志處理

2025-10-28 01:00:00

NestJSCSVJSON

2025-03-28 05:10:00

Spring上傳大文件

2025-02-13 09:02:04

2024-05-21 08:14:59

代碼接口依賴注入

2024-05-20 08:06:42

ASP接口服務(wù)

2021-06-10 09:05:43

Linux命令大文件切割

2021-03-11 10:20:47

百度網(wǎng)盤存儲(chǔ)計(jì)算機(jī)技術(shù)

2020-10-30 11:09:30

Pandas數(shù)據(jù)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)