Last Updated on 2021-06-21 by Clay
在使用 Python 進行資料分析的時候,尤其是在進行自然語言處理 (NLP) 的任務時,我們很難避免跟一些過大的檔案打交道。但是我們的資料若是太大、大到我們一次全部載入記憶體便會發生報錯,那麼我們究竟該怎麼處理這些太大的檔案呢?
我想在 Python 中,比較常用的方式大致上分成以下兩種:
- 使用 with 逐行讀入
- 使用 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)