[英]Memory issues with splitting lines in huge files in Python
我正在嘗試從磁盤讀取一個大文件(〜2GB),並將每一行拆分為多個字符串:
def get_split_lines(file_path):
with open(file_path, 'r') as f:
split_lines = [line.rstrip().split() for line in f]
return split_lines
問題是,它試圖在內存中分配數十個GB。 我發現如果以以下方式更改代碼不會發生這種情況:
def get_split_lines(file_path):
with open(file_path, 'r') as f:
split_lines = [line.rstrip() for line in f] # no splitting
return split_lines
即,如果我不分線,則內存使用會急劇下降。 有什么辦法可以解決這個問題,也許是一些聰明的方法來存儲分割行而不填滿主存儲器?
感謝您的時間。
拆分之后,您將擁有多個對象:一個元組和一些字符串對象。 除了組成原始字符串的實際字符集之外,每個對象都有自己的開銷。
與其將整個文件讀入內存,不如使用生成器。
def get_split_lines(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.rstrip.split()
for t in get_split_lines(file_path):
# Do something with the tuple t
這並不妨礙您編寫類似
lines = list(get_split_lines(file_path))
如果確實需要將整個文件讀入內存。
最后,我最終存儲了一條剝離線的列表:
with open(file_path, 'r') as f:
split_lines = [line.rstrip() for line in f]
而且,在算法的每次迭代中,我都只是即時重新計算了分割線:
for line in split_lines:
split_line = line.split()
#do something with the split line
如果您能夠像我一樣將所有行都保留在內存中,並且必須多次瀏覽所有文件,則此方法比@chepner提出的方法要快得多,因為您只需讀取一次文件行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.