********************= 1****************************************====
方法一:
將檔案切分成小段,每次處理完小段內容後,釋放記憶體
這裡會使用yield生成自定義可迭代物件, 即generator, 每乙個帶有yield的函式就是乙個generator。
def read_in_block(file_path):
block_size = 1024
with open(file_path, "r") as f:
while true:
block = f.read(block_size) # 每次讀取固定長度到記憶體緩衝區
if block:
yield block
else:
return # 如果讀取到檔案末尾,則退出
def test3():
file_path = "/tmp/test.log"
for block in read_in_block(file_path):
print block
方法二:
利用open(「」, 「」)系統自帶方法生成的迭代物件
def test4():
with open("/tmp/test.log") as f:
for line in f:
print line
********************==2*********************************************
原帖子:
該文章實際上提供了集中讀取大檔案的方式,先經過測試總結如下
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
python3 讀取大檔案分解成若干小檔案
有個資料實在太大了,有1.7g,開啟慢,改檔案也慢,我們將其分解成若干個中等檔案 coding utf 8 f open 123.sql r encoding utf 8 readlist i 0i i 1filename mytest sql format i wf open filename,w...
python 3讀取檔案 Python3 檔案讀寫
python open 方法用於開啟乙個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式 1.讀取檔案 with open test json dumps.txt mode r encoding utf 8 as f seek 移動游標至指定位置 f.seek 0 read 讀取整個檔...
python 讀取大檔案
以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...