批处理大型Django QuerySet时重复值

时间:2013-06-03 19:48:50

标签: python django list-comprehension django-queryset

我正在生成批量的客户电话号码。我有一个大的(25m +)订阅者对象表,我正在搜索找到匹配的记录,然后通过Django的ForeignKey关系查找每个对象的数字(Subscriber对象有一个到Customer对象的ForeignKey,然后有一个包含数字的CharField。对于大型QuerySet,我在批量中获得重复的数字。在大约110,000个订阅者的列表中,我得到大约5k个重复。

我正在使用直接过滤器生成初始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)
]

当我在shell中测试这个方法时,它工作得很好;只有在生产中它才会失败。它也适用于生产中较小的QuerySet。只有大约50k +的QuerySets似乎有问题。此外,当我尝试从QuerySet创建一个Subscriber对象列表时,一切都很好:

print list(subscribers)

即使在生产中也能正常工作。

似乎就好了
s.customer.number

偶尔会以某种方式执行查找错误,但仅适用于大型QuerySet。

1 个答案:

答案 0 :(得分: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)]
          ]

您的方法中重复值的原因可能是由于数据,也许您有两个订阅者引用同一个客户。