欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決python讀取幾千萬行的大表內(nèi)存問題

 更新時間:2018年06月26日 08:54:49   作者:Lucky-zhou  
今天小編就為大家分享一篇解決python讀取幾千萬行的大表內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Python導數(shù)據(jù)的時候,需要在一個大表上讀取很大的結(jié)果集。

如果用傳統(tǒng)的方法,Python的內(nèi)存會爆掉,傳統(tǒng)的讀取方式默認在內(nèi)存里緩存下所有行然后再處理,內(nèi)存容易溢出

解決的方法:

1)使用SSCursor(流式游標),避免客戶端占用大量內(nèi)存。(這個cursor實際上沒有緩存下來任何數(shù)據(jù),它不會讀取所有所有到內(nèi)存中,它的做法是從儲存塊中讀取記錄,并且一條一條返回給你。)

2)使用迭代器而不用fetchall,即省內(nèi)存又能很快拿到數(shù)據(jù)。

import MySQLdb.cursors

conn = MySQLdb.connect(host='ip地址', user='用戶名', passwd='密碼', db='數(shù)據(jù)庫名', port=3306,
   charset='utf8', cursorclass = MySQLdb.cursors.SSCursor)
cur = conn.cursor()
cur.execute("SELECT * FROM bigtable");
row = cur.fetchone()
while row is not None:
 do something
 row = cur.fetchone()

cur.close()
conn.close()

需要注意的是,

1、因為SSCursor是沒有緩存的游標,結(jié)果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成一個cursor也不行的。

如果需要干別的,請另外再生成一個連接對象。

2、 每次讀取后處理數(shù)據(jù)要快,不能超過60s,否則mysql將會斷開這次連接,也可以修改 SET NET_WRITE_TIMEOUT = xx 來增加超時間隔。

以上這篇解決python讀取幾千萬行的大表內(nèi)存問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論