成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優雅地處理超大文件?用流式 + yield,輕松應對巨型日志!

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

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

為什么不能一次性讀完?

最常見錯誤寫法是:

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

問題:

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

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

正確做法:流式逐行讀取

最基礎的穩健方案是:

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 的好處:

  • 不是一次性讀全部,而是懶加載,一行一行處理。
  • 保證內存占用極低,即使是 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(可以調整),然后按需處理。

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

高級版本是:

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')

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

小結

方法

適合場景

說明

.read()

 整體讀

小文件(KB/MB)

不推薦大文件

逐行 for line in f

大多數大文件場景

穩定可靠

按塊 chunk 讀取

超大文件、性能要求高

注意跨行處理

加進度顯示

體驗更好

推薦實際項目用

責任編輯:趙寧寧 來源: Ssoul肥魚
相關推薦

2025-01-20 07:10:00

LambdaJavanull

2023-05-12 12:09:38

職責鏈模式客服

2014-07-22 09:01:53

SwiftJSON

2024-01-15 08:09:44

Fluent錯誤代碼

2024-02-01 18:06:04

Python編程系統

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

客戶端操作并發請求

2023-08-29 07:35:15

2009-12-11 15:37:58

Linux日志處理

2025-02-13 09:02:04

2024-05-21 08:14:59

代碼接口依賴注入

2025-03-28 05:10:00

Spring上傳大文件

2024-05-20 08:06:42

ASP接口服務

2021-03-11 10:20:47

百度網盤存儲計算機技術

2021-06-10 09:05:43

Linux命令大文件切割

2020-10-30 11:09:30

Pandas數據代碼

2024-09-26 09:28:06

內存Spring
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女羞羞视频在线 | 国产黄色麻豆视频 | 欧美一区二区在线播放 | 久久亚洲国产精品日日av夜夜 | 成人在线视 | 伊人网伊人 | 久草新在线 | 久久亚 | 精品欧美一区二区精品久久久 | 日韩中文字幕一区二区 | 日日操视频 | 91精品国产欧美一区二区 | 久久久久av | 九九精品久久久 | 日本精品视频一区二区 | 成人免费网站www网站高清 | 亚洲91精品 | 日韩一二三区 | 国产欧美日韩综合精品一区二区 | 二区视频 | 蜜桃av一区二区三区 | 国产在线视频一区二区 | 亚洲精品一区av在线播放 | 亚洲三级在线 | 亚洲精品视频免费观看 | 精品伊人久久 | 免费国产黄网站在线观看视频 | 欧美日韩在线一区二区 | 韩国毛片一区二区三区 | 91精品国产一区 | 午夜精品影院 | 国产91成人 | 一本大道久久a久久精二百 国产成人免费在线 | 国产精品久久影院 | 台湾a级理论片在线观看 | 亚洲精品99| 久久久精品网 | 久久久久久高潮国产精品视 | 国产精品 亚洲一区 | 亚洲成人精品一区二区 | 黄网站涩免费蜜桃网站 |