web-dev-qa-db-ja.com

MySQLDB SScursorを効率的に使用する方法は?

大規模な結果セット(数十万行、場合によってはそれ以上)を処理する必要があります。
残念ながら、一度に(起動時に)取得する必要があります。

私はできるだけ少ないメモリを使用してそれを行おうとしています。
SOを見て、SSCursorを使用することが私が探しているものである可能性があることがわかりましたが、それでも正確な方法がわかりません。それらを使用してください。

ベースカーソルまたはSScursorからfetchall()を実行するのは同じですか(メモリ使用量の観点から)?
sscursorから行を1つずつ(または数ずつ)「ストリーミング」できますか?はいの場合は、
そうするための最良の方法は何ですか?

31
Sylvain

Otto Allmendingerの回答に同意しますが、Denis Otkidachのコメントを明示するために、Ottoのfetch()関数を使用せずに結果を反復処理する方法を次に示します。

import MySQLdb.cursors
connection=MySQLdb.connect(
    Host="thehost",user="theuser",
    passwd="thepassword",db="thedb",
    cursorclass = MySQLdb.cursors.SSCursor)
cursor=connection.cursor()
cursor.execute(query)
for row in cursor:
    print(row)
32
unutbu

大きな結果セットをフェッチするときは、必ずSSCursorを使用してください。私が同じような問題を抱えていたとき、それは私にとって大きな違いをもたらしました。次のように使用できます。

_import MySQLdb
import MySQLdb.cursors

connection = MySQLdb.connect(
        Host=host, port=port, user=username, passwd=password, db=database, 
        cursorclass=MySQLdb.cursors.SSCursor) # put the cursorclass here
cursor = connection.cursor()
_

これで、cursor.execute()を使用してクエリを実行し、カーソルをイテレータとして使用できます。

編集:不要な自家製イテレータを削除しました。Denisに感謝します。

11

または、接続オブジェクトの外部でSSCursorを使用することもできます(すでに接続を定義していて、すべての接続でSSCursorをカーソルクラスとして使用したくない場合は非常に重要です)。

import MySQLdb
from MySQLdb.cursors import SSCursor # or you can use SSDictCursor

connection = MySQLdb.connect(
        Host=host, port=port, user=username, passwd=password, db=database)
cursor = SSCursor(connection)
cursor.execute(query)
for row in cursor:
    print(row)   
0
Yuda Prawira