0

私は約 3000 万のエントリを持つデータベースを持っていますが、これは非常に多く、より大きなデータベース エントリでの作業に問題があること以外は何も期待していません。

しかし、py-postgresql と.prepare()ステートメントを使用して、「」ベースでエントリを取得できることを願っています。yieldしたがって、データベースからの結果だけでメモリがいっぱいになるのを避けることができます。

これは私がこれまでに持っているものです:

import postgresql
user = 'test'
passwd = 'test
db = postgresql.open('pq://'+user+':'+passwd+'@192.168.1.1/mydb')
results = db.prepare("SELECT time time FROM mytable")
uniqueue_days = []
with db.xact():
    for row in result():
        if not row['time'] in uniqueue_days:
            uniqueue_days.append(row['time'])

print(uniqueue_days)

if not row['time'] in uniqueue_days:メモリ不足になる前に、result()ループする前にすべての結果を取得する可能性があることを考えると、それほど奇妙ではありませんか? ライブラリpostgresqlを「ページング」するか、ラウンドごとに60kの結果をバッチダウンする方法、またはクエリを作り直してより多くの作業を行う方法はありますか?

前もって感謝します!

編集:データベースの日付はUnixタイムスタンプであることに言及する必要があります。リスト%Y-%m-%dに追加する前に、それらをフォーマットに変換するつもりuniqueue_daysです。

4

2 に答える 2

3

より適切にサポートされているpsycopg2拡張機能を使用している場合は、クライアント カーソルに対してループを使用するか、サーバー側ポータルを使用してカーソルを戻すようにfetchone、一度に 1 行だけ取​​得することができます。psycopg2

py-postgresql が同様のものをサポートしていない場合は、常に明示的DECLAREにデータベース側にカーソルを置きFETCH、そこから徐々に行を進めることができます。ドキュメントには、py-postgresqlがプロトコルレベルでこれを自動的に実行できることを示唆するものは何もありませんpsycopg2

通常、データベース ドライバを簡単に切り替えることができますがpy-postgresql、Python DB-API に従っていないようです。そのため、テストするにはさらにいくつかの変更が必要になります。私はまだそれをお勧めします。

于 2014-02-05T11:21:20.880 に答える