मैंने ऐसा करने के लिए एक सरल सहायक लिखा - आप इसे बैच_साइज, क्वेरी के लिए ऑब्जेक्ट क्लास, और कॉलबैक जो क्वेरी में तत्वों को संभालते हैं।
(ध्यान दें, मैं djangoappengine और इसलिए Django क्वेरी प्रारूप का उपयोग कर रहा है - लेकिन आप सूट करने के लिए इसे संशोधित कर सकते हैं।)
def loop_over_objects_in_batches(batch_size, object_class, callback):
logging.info("Calling batched loop with batch_size: %d, object_class: %s, callback: %s" % (batch_size, object_class, callback))
num_els = object_class.objects.all().count()
num_loops = num_els/batch_size
remainder = num_els - num_loops * batch_size
offset = 0
while offset < num_loops * batch_size:
logging.info("Processing batch (%d:%d)" % (offset, offset+batch_size))
query = object_class.objects.all()[offset:offset + batch_size]
for q in query:
callback(q)
offset = offset + batch_size
if remainder:
logging.info("Processing remainder batch (%d:-)" % offset)
query = object_class.objects.all()[offset:]
for q in query:
callback(q)
स्रोत
2012-01-23 13:42:14
गिनती करने के लिए() और स्पष्ट रूप से शेष बाहर काम की कोई जरूरत नहीं थी - [: ] टुकड़ा एक शेष प्रश्न वापस कर देगा और आप उस लूप में पहचान सकते हैं और जब ऐसा तोड़ सकते हैं। मैंने स्पष्ट रूप से यह स्पष्ट करने के लिए लिखा कि मैं क्या कर रहा था। –