如果直接對(duì)大文件對(duì)象調(diào)用 read() 方法,會(huì)導(dǎo)致不可預(yù)測(cè)的內(nèi)存占用。好的方法是利用固定長(zhǎng)度的緩沖區(qū)來(lái)不斷讀取文件內(nèi)容。即通過(guò)yield。
在用Python讀一個(gè)兩個(gè)多G的txt文本時(shí),天真的直接用readlines方法,結(jié)果一運(yùn)行內(nèi)存就崩了。
還好同事點(diǎn)撥了下,用yield方法,測(cè)試了下果然毫無(wú)壓力。咎其原因,原來(lái)是readlines是把文本內(nèi)容全部放于內(nèi)存中,而yield則是類似于生成器。
代碼如下:
def open_txt(file_name): with open(file_name,'r+') as f: while True: line = f.readline() if not line: return yield line.strip()
調(diào)用實(shí)例:
for text in open_txt('aa.txt'): print text例二:
目標(biāo) txt 文件大概有6G,想取出前面1000條數(shù)據(jù)保存于一個(gè)新的 txt 文件中做余下的操作,雖然不知道這樣做有沒(méi)有必要但還是先小數(shù)據(jù)量測(cè)試一下吧。參考這個(gè)帖子:我想把一個(gè)list列表保存到一個(gè)Txt文檔,該怎么保存 ,自己寫了一個(gè)簡(jiǎn)單的小程序。
====================================================
import datetimeimport picklestart = datetime.datetime.now()print "start--%s" % (start)fileHandle = open ( 'train.txt' )file2 = open('s_train.txt','w') i = 1while ( i < 10000 ): a = fileHandle.readline() file2.write(''.join(a)) i = i + 1fileHandle.close() file2.close()print "done--%s" % ( datetime.datetime.now() - start)if __name__ == '__main__': pass====================================================
pickle 這個(gè)庫(kù)大家說(shuō)的很多,官網(wǎng)看看,后面可以好好學(xué)習(xí)一下。
新聞熱點(diǎn)
疑難解答
圖片精選