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