python 大文件以行為單位讀取方式比對


先前需要做一個使用python讀取大文件(大於1G),並逐條存入內存進行處理的工作。做了很多的嘗試,最終看到了如下的文章。

http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python

 

該文章實際上提供了集中讀取大文件的方式,先經過測試總結如下

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億B 4.07s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM