在這裡插入**片
很久以前做數學建模的時候面臨了一回大檔案的讀取問題,當時沒有什麼程式設計經驗就使用如下的**進行了讀取。
with
open
(filename,
'rb'
)as fp:
for line in fp.readlines():
do_something(line)
這種**在檔案比較小時倒也沒有太大影響,但是面臨大檔案時就無解了。
分析**: (可以使用memory_profiler.profile函式對**的記憶體使用進行分析,這裡使用了裝飾器)
from memory_profiler import profile
@profile
deffunc
(filename)
:with
open
(filename,
'rb'
)as fp:
for line in fp.readlines():
#do_something(line)
pass
if __name__ ==
'__main__'
: func(
'test_file'
)
得到如下結果
line # mem usage increment line contents
====
====
====
====
====
====
====
====
====
====
====
====
3516.1 mib 16.1 mib @profile
36deffunc
(filename):37
16.1 mib 0.0 mib with
open
(filename,
'rb'
)as fp:
3818.6 mib 2.5 mib for line in fp.readlines():
39#do_something(line)
4018.6 mib 0.0 mib pass
這樣就「成功」把檔案全部載入進記憶體了。 【捂臉】
後面獲得了好友的點播,我也知道了優化方法了。
按行讀取
wiht open
('test_file'
,'rb'
)as fp:
for line in fp:
# 這裡將fp檔案物件作為乙個可迭代物件進行迭代
# do something with line
pass
讀取固定大小with
open
('test_file'
,'rb'
)as fp:
while
true
: buf = fp.read(batch_size)
if buf:
# do something with buf
pass
else
:break
實現檔案讀取的滑動視窗
通過檔案游標的移動實現
def
window_read
(filename)
:with
open
(filename,
'rb'
)as fp:
file_size = os.path.getsize(filename)
while
true
: buf = fp.read(
100)
if buf:
print
(buf)
if fp.tell(
)== file_size:
break
else
: fp.seek(-20
,1)else
:break
記憶體使用結果:
line # mem usage increment line contents
====
====
====
====
====
====
====
====
====
====
====
====
416.1 mib 16.1 mib @profile
5defwindow_read
(filename):6
16.1 mib 0.0 mib with
open
(filename,
'rb'
)as fp:
716.1 mib 0.0 mib file_size = os.path.getsize(filename)
816.1 mib 0.0 mib while
true:9
16.1 mib 0.0 mib buf = fp.read(
100)
1016.1 mib 0.0 mib if buf:
1116.1 mib 0.0 mib print
(buf)
1216.1 mib 0.0 mib if fp.tell(
)== file_size:
1316.1 mib 0.0 mib break
14else:15
16.1 mib 0.0 mib fp.seek(-20
,1)16
else:17
break
python 讀取大檔案
以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...
python讀取大檔案
最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open 函式以及read 函式來完成 f open filename,r f.read 這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將乙個10g大小的日誌檔案讀取,即...
python讀取大檔案 python讀取大檔案
python讀取檔案對各列進行索引 可以用readlines,也可以用readline,如果是大檔案一般就用readlined a in open testfile.txt r for line in a in columnssplit line.rstrip split d columnsspli...