python 大檔案以行為單位讀取方式比對

2022-05-14 11:55:05 字數 1196 閱讀 1413

先前需要做乙個使用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...