4

Postgres にかなり大きなテーブル (20M+) があります。それに対して未加工の Django クエリを実行しようとしています。

tweets = TweetX.objects.raw("SELECT * from twitter_tweet").using("twittertest")

RawQuerySet をすばやく取得しますが、その結果を繰り返し処理しようとすると、停止します。

for tweet in tweets:
   #do stuff

メモリは着実に増加しているため、データセット全体が転送されていると思われます。.raw結果セットを一度に転送せずに反復処理できるように、データベース カーソルを取得する方法はありますか?

4

1 に答える 1

5

django/postgres にデータベース カーソルを使用させるのはかなり難しいようです。代わりに、すべてをフェッチしてから、クライアント側の反復子 (カーソルと呼ばれる) をその上に置きます。

ここで、db カーソルを明示的に作成するソリューション 見つけました。唯一の欠点は、django モデルに適合しなくなったことです。

from django.db import connections

conn = connections['twittertest']
# This is required to populate the connection object properly
if conn.connection is None:
    cursor = conn.cursor()        

cursor = conn.connection.cursor(name='gigantic_cursor')
cursor.execute("SELECT * from twitter_tweet")

for tweet in cursor:
    #profit
于 2013-08-22T15:59:08.600 に答える