python讀取幾千萬行的大表記憶體問題

2021-07-30 00:16:24 字數 887 閱讀 2522

python導資料的時候,需要在乙個大表上讀取很大的結果集。

如果用傳統的方法,python的記憶體會爆掉,傳統的讀取方式預設在記憶體裡快取下所有行然後再處理,記憶體容易溢位

解決的方法:

1)使用sscursor(流式游標),避免客戶端占用大量記憶體。(這個cursor實際上沒有快取下來任何資料,它不會讀取所有所有到記憶體中,它的做法是從儲存塊中讀取記錄,並且一條一條返回給你。)

2)使用迭代器而不用fetchall,即省記憶體又能很快拿到資料。

import mysqldb.cursors

conn = mysqldb.connect(host='ip位址', user='使用者名稱', passwd='密碼', db='資料庫名', 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是沒有快取的游標,結果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成乙個cursor也不行的。

如果需要幹別的,請另外再生成乙個連線物件。

2. 每次讀取後處理資料要快,不能超過60s,否則mysql將會斷開這次連線,也可以修改 set net_write_timeout = xx 來增加超時間隔。

MySQL 對於千萬級的大表的優化?

第一 優化你的sql和索引 第二 加快取,memcached,redis 第三 以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四 如果以上都做了還是慢,不要想著去做切分,mysq...

千萬級的大表!MySQL這樣優化更好

對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...

千萬級的大表!MySQL這樣優化更好

對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...