Skip to content

[Python] 使用 open() 開啟大檔案時避免記憶體錯誤的方法

Last Updated on 2021-06-21 by Clay

在使用 Python 進行資料分析的時候,尤其是在進行自然語言處理 (NLP) 的任務時,我們很難避免跟一些過大的檔案打交道。但是我們的資料若是太大、大到我們一次全部載入記憶體便會發生報錯,那麼我們究竟該怎麼處理這些太大的檔案呢?

我想在 Python 中,比較常用的方式大致上分成以下兩種:

  1. 使用 with 逐行讀入
  2. 使用 read([size]) 控制批次讀入的資料大小

這樣一來,我們就能避免記憶體容量不夠的問題了。噢、或者,直接多買一兩條記憶體也沒關係啦 XDDD!


報錯的情境

首先我來紀錄一下可能報錯的情境:

text = open('data.txt', 'r', encoding='utf-8').read().split('\n')

for line in text:
    print(line)



這裡的作法在處理小檔案時,我個人覺得相當方便,畢竟讀取進來時的 "text" 本身就是儲存著一行行的句子。但是在處理大檔案時,這卻會一次將所有的資料一次載入到記憶體,給予記憶體比較大的負擔。

最慘的情況,是直接超過記憶體的大小,直接報錯。


with 開啟文本

來說說看第一個方法,『使用 with 逐行讀入』。這是一個相當方便的方法,也不會對記憶體造成過大的負擔。

with open('text.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line)



我們可以看到,在讀取大文件時,這種開啟的方法明顯開啟速度快很多、也不會報錯。


控制 read([size])

那既然使用 "with" 開啟的作法就很好了,那麼為什麼還要使用 read([size]) 呢?

這是因為有些時候,我們的文本中可能並沒有『換行符號』。糟糕的是,那使用 "with" 讀入就跟直接一口氣讀取全部沒有兩樣。

正因為可能有這樣的情境,所以在必要時使用 read([size]) 來控制一次讀入的數量是很有必要的。

with open('text.txt', 'r', encoding='utf-8') as f:
    for chunk in iter(lambda: f.read(1024), ''):
        print(chunk)




Read More

Tags:

Leave a Reply