先前需要做乙個使用python讀取大檔案(大於1g),並逐條存入記憶體進行處理的工作。做了很多的嘗試,最終看到了如下的文章。
該文章實際上提供了集中讀取大檔案的方式,先經過測試總結如下
1. for line in filehandle:
該方式是最快速的。而且python虛擬機器在內部幫助我們對buffer進行管理,記憶體佔用量小,且不差錯。
2. fileinput方式
該方式實際效果較慢,但是也有buffer管理功能
3. (自己摸索和嘗試的)使用file.read(sizehint)的方式進行區塊讀取
該方法是三者中最慢的,而且需要自己去控制記憶體和選擇需要的區域,所以在讀到的buffer之後,還需要進行拆分工作,比較麻煩,而且容易出錯。最無奈的是,使用下來(我的環境是2.6和2.7),sizehint作用較小,原來覺得如果sizehint是1024,則每次在記憶體中只會駐留1024b的內容,但是實際上不是這樣的,在度過一次1024b之後,再次讀取1024b的時候,儘管已經對之前的buf進行了del操作,但是該1024b仍然存留於記憶體中,所以記憶體越吃越大,最終memoryerror。
4. file.readline和file.readlines
和read類似,只適用於小檔案。
結論:在使用python進行大檔案讀取時,應該返璞歸真,使用最簡單的方式,交給直譯器,就管好自己的工作就行了。
附,實測資料(這裡的資料是我的程式的實際運**況,在程式中其實讀了兩個差不多大小的檔案,並做了一定邏輯處理,所以絕對值是沒有意義的,但是相對比較值很能夠說明情況)
1. 大檔案(>1.4g)
所使用的方式
size_hint
所使用時間
for i in open(...)
/103.382492s
fileinput
/131.525755s
file.read和buffer控制2億b
報錯:memoryerror
2. 小檔案(西遊記的txt,大約1.4m)
所使用的方式
size_hint
所使用時間
for i in open(...)
/2.11s
fileinput
/4.22s
file.read和buffer控制
2億b4.07s
python 大檔案以行為單位讀取方式比對
先前需要做乙個使用python讀取大檔案 大於1g 並逐條存入記憶體進行處理的工作。做了很多的嘗試,最終看到了如下的文章。該文章實際上提供了集中讀取大檔案的方式,先經過測試總結如下 1.for line in filehandle 該方式是最快速的。而且python虛擬機器在內部幫助我們對buffe...
以行為單位讀寫檔案
每次讀取一行,可以用fgets char string intn file stream 只要n大於字元最多行的字元數,每次都會讀取整行。每次寫入一行,可以用int fputs const char string file stream 如果使用 size t fwrite const void b...
python 按行讀大檔案的方法
這裡的大檔案指一次讀的話會使記憶體爆掉的檔案,所以我們需要一行一行地讀。乙個名為123的txt檔案,裡面分別按行存了三個數字 1 2和3。with open 123.txt as f for line in f print line.strip 輸出12 3 with open 123.txt as...