37

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

私はできるだけ少ないメモリを使用してそれをやろうとしています。
SO をSSCursor見ると、私が探しているのは using かもしれないことがわかりましたが、それらを正確に使用する方法はまだよくわかりません。

fetchall()ベースカーソルまたはSScursorからの実行は同じですか(メモリ使用量に関して) ?

sscursor から行を 1 つずつ (または数つずつ) 'ストリーミング' できますか? できる場合、最も効率的な方法は何ですか?

4

3 に答える 3

36

私は 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)
于 2009-11-27T12:13:11.393 に答える
16

大きな結果セットをフェッチするときは、必ず 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に感謝します!

于 2009-11-27T11:52:28.070 に答える