2011-09-17 8 views
10

एक कार्य के भीतर, मैं एक प्रश्न के साथ वस्तुओं के संग्रह पर पुनरावृत्ति कर रहा हूं। क्वेरी से प्रत्येक इकाई प्राप्त करने के बाद, मैं एक यूआरएल अनुरोध भी कर रहा हूं।समाप्त हो चुके प्रश्न और एपेंगेन

BadRequestError: The requested query has expired. Please restart it with the last cursor to read more results. 

एक प्रश्न एक बार आप इसे बनाने पर पट्टा क्या है: इन वस्तुओं में से एक बड़ी संख्या में दोहराने के बाद, मैं निम्नलिखित त्रुटि दिखाई दे रही?

उत्तर

7

यह समस्या आपकी समस्या पर कुछ प्रकाश डाला सकता है: https://code.google.com/p/googleappengine/issues/detail?id=4432

Even though offline requests can currently live up to 10 minutes (and background instances can live forever) datastore queries can still only live for 30 seconds. We plan to improve this, but since a 'consistent' view of the data is only preserved for a limit period of time, there is an upper bound to how long a query can last (which is < 10 minutes).

...

Instead of running a single long query, consider fetching batches from the query using query cursors.

0

सरल अपने अनुक्रम में प्रत्येक तत्व के लिए defered कार्य बनाने। उदाहरण के साथ अच्छा लेख है कि इसे सही तरीके से कैसे करें "Background work with the deferred library"।

1

मैंने ऐसा करने के लिए एक सरल सहायक लिखा - आप इसे बैच_साइज, क्वेरी के लिए ऑब्जेक्ट क्लास, और कॉलबैक जो क्वेरी में तत्वों को संभालते हैं।

(ध्यान दें, मैं 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) 
+0

गिनती करने के लिए() और स्पष्ट रूप से शेष बाहर काम की कोई जरूरत नहीं थी - [: ] टुकड़ा एक शेष प्रश्न वापस कर देगा और आप उस लूप में पहचान सकते हैं और जब ऐसा तोड़ सकते हैं। मैंने स्पष्ट रूप से यह स्पष्ट करने के लिए लिखा कि मैं क्या कर रहा था। –

संबंधित मुद्दे