yield在我們讀取大數(shù)據(jù)時(shí)是必用的一個(gè)函數(shù)呵扛,它可以幫我們規(guī)避內(nèi)存溢出等問題,那么在哪些環(huán)節(jié)我們需要用到它计福,及為何它能幫我們?cè)诒姸鄨?chǎng)景中解決內(nèi)存溢出問題豌鹤。
我們先看下面的示例
def csv_reader(file):
file = open(file, encoding='utf-8')
result = file.read().split("\n")
return result
if name == 'main':
csv_gen = csv_reader("test.txt")
row_count = 0
for row in csv_gen:
row_count += 1
print(f"Row count is {row_count}")
上面的例子通過read直接將內(nèi)容一次性加載到內(nèi)存,當(dāng)數(shù)據(jù)非常大時(shí)鸭廷,內(nèi)存直接會(huì)溢出枣抱,導(dǎo)致整個(gè)主機(jī)崩潰。
我們?cè)倏聪旅娴睦?br>
def csv_reader(file_name):
for row in open(file_name, "r", encoding='utf-8'):
yield row
if name == 'main':
csv_gen = csv_reader("test.txt")
row_count = 0
for row in csv_gen:
row_count += 1
print(f"Row count is {row_count}")
這個(gè)例子通過yield函數(shù)返回一個(gè)生成器對(duì)象辆床,每次只讀取一行數(shù)據(jù)佳晶,所以對(duì)內(nèi)存幾乎沒什么影響,open函數(shù)也是一個(gè)生成器,一行一行的讀取數(shù)據(jù)