先前須要作一個使用python讀取大文件(大於1G),並逐條存入內存進行處理的工做。作了不少的嘗試,最終看到了以下的文章。python
http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python測試
該文章實際上提供了集中讀取大文件的方式,先通過測試總結以下spa
1. for line in fileHandle:內存
該方式是最快速的。並且python虛擬機在內部幫助咱們對buffer進行管理,內存佔用量小,且不差錯。get
2. fileinput方式input
該方式實際效果較慢,可是也有buffer管理功能虛擬機
3. (本身摸索和嘗試的)使用file.read(sizeHint)的方式進行區塊讀取io
該方法是三者中最慢的,並且須要本身去控制內存和選擇須要的區域,因此在讀到的buffer以後,還須要進行拆分工做,比較麻煩,並且容易出錯。最無奈的是,使用下來(個人環境是2.6和2.7),sizeHint做用較小,原來以爲若是sizeHint是1024,則每次在內存中只會駐留1024B的內容,可是實際上不是這樣的,在度過一次1024B以後,再次讀取1024B的時候,儘管已經對以前的buf進行了del操做,可是該1024B仍然存留於內存中,因此內存越吃越大,最終MemoryError。table
4. file.readline和file.readlinesfile
和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 |