pythonが数千万行を読み出す大きなテーブルメモリの問題を解決

1007 ワード

Pythonがデータを導く場合は、大きなテーブルに大きな結果セットを読み込む必要があります.
従来の方法ではPythonのメモリが爆発し、従来の読み取り方式ではメモリにすべてのローをキャッシュして処理するのがデフォルトで、メモリがオーバーフローしやすい
解決方法:
1)SSCursor(ストリーミングカーソル)を使用して、クライアントが大量のメモリを消費しないようにする.(このcursorは実際にはデータをキャッシュしていません.メモリにすべてを読み込むことはありません.メモリブロックからレコードを読み出し、1つずつ返します.)
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、毎回読み取った後にデータを処理するのは速くて、60 sを超えてはいけなくて、さもなくばmysqlは今度の接続を切断して、SET NET_を修正することができますWRITE_TIMEOUT=xxで超時間間隔を増やします.