2

クエリ結果セットが 900 万行まであります。

行ごとに何らかの処理を行う必要があり、コードは現在これを行っています。

query = conn.query(sql)
results = query.getresult()

for row in results: 
    # blah

よくわかりませんが、getresult()結果セット全体を引き下げていると思います。そうですか?必要に応じて結果セットのチャンクのみをワイヤ経由でプルする方法があると思いますが、pgモジュールのドキュメントでそのようなものをすぐには見ませんでした。

pgdb代わりにモジュールまたは他のアプローチでこれを行うことは可能ですか?

私の懸念は、アプリケーション マシンのメモリです。できることなら、何百万もの行を一度にメモリにロードしたくありません。

これは心配する価値がありますか?

4

4 に答える 4

3

Python データベース API 仕様に従っている場合は、カーソルを使用できます。

curs = conn.cursor()
curs.execute('select * from bigtable')

次に、curs.fetchone()またはを使用しますcurs.fetchmany(chunksize)

于 2011-09-19T20:47:43.727 に答える
2

pgdbのカーソルは反復子です

cursor = conn.cursor()
cursor.execute(sql)

for row in cursor:
   # do something with row

どこconnから作られるかpgdb.connect(...)

于 2011-09-19T20:40:44.660 に答える
0

どのように動作するかはわかりませんgetresult()が、別のオプションはPL/Python です:

PL/Python 手続き型言語を使用すると、PostgreSQL 関数を Python 言語で記述できます。

これにより、データベース内で作業できます。これはあなたがする必要があることには適していないかもしれませんが、一見の価値があります。

于 2011-09-19T20:37:39.617 に答える
0

cursor.fetchmany() を使用し、arraysize を明示的に設定して行のセットを処理し、パフォーマンスとメモリ使用率の間で必要なバランスをとってください。

cx_Oracle (これも DB-API 仕様を使用) で記述されたジョブがあり、それを使用して、20,000 レコードのバッチでネットワーク全体で数十億行のテーブルを移動します。しばらく時間がかかりますが、ソース側でもターゲット側でもサーバーのメモリを使い果たしていません。

于 2011-09-26T16:56:23.103 に答える