如何讀取大文件,例如內存只有4G,如何讀取一個大小為8G的文件?
很顯然4G內存要一次性的加載大小為8G的文件是不現實的,遇到這種情況必須要考慮多次讀取和分批次處理。
在Python中讀取文件可以先通過open函數獲取文件對象,在讀取文件時,可以通過read方法的size參數指定讀取的大小,也可以通過seek方法的offset參數指定讀取的位置,這樣就可以控制單次讀取數據的字節數和總字節數。
除此之外,可以使用內置函數iter將文件對象處理成迭代器對象,每次只讀取少量的數據進行處理,代碼大致寫法如下所示。
with open('...', 'rb') as file: for data in iter(lambda: file.read(2097152), b''): pass 在Linux系統上,可以通過split命令將大文件切割為小片,然后通過讀取切割后的小文件對數據進行處理。
例如下面的命令將名為filename的大文件切割為大小為512M的多個文件。
split -b 512m filename 如果愿意, 也可以將名為filename的文件切割為10個文件
命令如下所示。 split -n 10 filename
擴展:外部排序跟上述的情況非常類似,由于處理的數據不能一次裝入內存,只能放在讀寫較慢的外存儲器(通常是硬盤)上。“排序-歸并算法”就是一種常用的外部排序策略。
在排序階段,先讀入能放在內存中的數據量,將其排序輸出到一個臨時文件,依此進行,將待排序數據組織為多個有序的臨時文件,然后在歸并階段將這些臨時文件組合為一個大的有序文件,這個大的有序文件就是排序的結果。