2013-06-03 33 views
1

我正在生成客戶端的批次電話號碼。我有一大堆(25m +)的Subscriber對象表,我正在尋找匹配的記錄,然後通過Django的ForeignKey關係查找每個對象的數字(Subscriber對象具有Customer對象的ForeignKey,然後有一個包含數字的CharField)。對於大型查詢集,我在批次中獲取重複的數字。在約11萬用戶列表中,我獲得了大約5k個副本。批量處理大型Django查詢集時重複值

我生成具有簡單明瞭濾波器的初始查詢集:

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) 
] 

當我測試在殼該方法中,它的工作原理正好;只有在生產中它纔會失敗。它也適用於生產中較小的QuerySet。只有QueryKets約50k +似乎有問題。此外,當我嘗試只創建一個從QuerySet的認購對象的列表,一切都很正常:

print list(subscribers) 

正常工作,即使是在生產。因此,它似乎像

s.customer.number 

以某種方式做查找錯誤的偶然,但僅適用於大型查詢集。

回答

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)] 
      ] 

在你的方法重複值的原因可能是由於數據,也許你有兩個用戶參考同一客戶。

+0

這工作。我很好奇爲什麼Django無法處理正常查找,但只要它正常工作。 另外,我不需要.distinct()調用。沒有這個,它工作得很好。 – user1706411