自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

為什么不能一次性讀完?

最常見錯誤寫法是:

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

問題:

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

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

正確做法:流式逐行讀取

最基礎(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 也沒問題!

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

逐行讀取有點慢?那可以分塊讀取,然后用 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)整),然后按需處理。

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

高級版本是:

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

這段代碼解決了跨塊的半行問題!

進階版:加個實時進度顯示!

如果你想邊讀邊看到進度,可以這樣做:

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讀取進度:{progress:.2f}%', end='')
            yield line.rstrip('\n')

每處理一行,更新一次進度,體驗感拉滿!

小結(jié)

方法

適合場景

說明

.read()

 整體讀

小文件(KB/MB)

不推薦大文件

逐行 for line in f

大多數(shù)大文件場景

穩(wěn)定可靠

按塊 chunk 讀取

超大文件、性能要求高

注意跨行處理

加進度顯示

體驗更好

推薦實際項目用

責(zé)任編輯:趙寧寧 來源: Ssoul肥魚
相關(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錯誤代碼

2022-07-25 11:33:48

Python大文件

2024-10-14 11:08:53

程序異常延遲

2024-09-26 10:51:51

2025-01-13 00:26:53

2022-08-03 08:41:30

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

2023-08-29 07:35:15

2009-12-11 15:37:58

Linux日志處理

2025-03-28 05:10:00

Spring上傳大文件

2024-05-21 08:14:59

代碼接口依賴注入

2025-02-13 09:02:04

2024-05-20 08:06:42

ASP接口服務(wù)

2021-03-11 10:20:47

百度網(wǎng)盤存儲計算機技術(shù)

2021-06-10 09:05:43

Linux命令大文件切割

2024-09-26 09:28:06

內(nèi)存Spring

2020-10-30 11:09:30

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

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