1

クライアントの電話番号のバッチを生成しています。一致するレコードを見つけるために検索している Subscriber オブジェクトの大きな (25m+) テーブルを持っています。次に、Django の ForeignKey リレーションシップ (Subscriber オブジェクトには Customer オブジェクトへの ForeignKey があり、次に数値を含む CharField があります)。大規模な QuerySet の場合、バッチで重複した数値を取得しています。約 11 万人の購読者のリストで、約 5,000 の重複があります。

簡単なフィルターを使用して、最初の QuerySet を生成しています。

subscribers = Subscribers.objects.filter(foo='bar')

これは、バッチを生成する方法です。

batches = [
    [s.customer.number for s in subscribers[x:x + batch_size]]
    for x in xrange(0, subscriber_count, batch_size)
]

このメソッドをシェルでテストすると、問題なく動作します。本番環境でのみ失敗します。また、本番環境の小さなクエリセットにも最適です。約 50k+ のクエリセットのみが問題を抱えているようです。また、QuerySet から Subscriber オブジェクトのリストを作成しようとすると、すべてうまくいきます。

print list(subscribers)

本番環境でも正しく動作します。だからそれは

s.customer.number

何らかの形でルックアップが間違っていることがありますが、それは大きなクエリセットの場合のみです。

4

1 に答える 1

0

batches顧客番号のみが必要であることがわかります。次に、クエリセットから関連データのみを取得します

cnumbers =    ( Subscribers
                .objects
                .filter(foo='bar')
                .values_list('customer__number', flat=True)
                .distinct()
               )

チャンクを作成するには:

batches = [
           [cnumbers[x:x+batch_size] 
           for x in xrange(0, len(cnumbers), batch_size)]
          ]

アプローチで値が重複する原因は、データが原因である可能性があります。おそらく、2 人のサブスクライバーが同じ顧客を参照している可能性があります。

于 2013-06-04T07:42:37.790 に答える