2012-06-26 13 views
7

पर डेटास्टोर में बड़ी संख्या में इकाइयों को अपडेट करना मैं एक विशिष्ट प्रकार की सभी इकाइयों पर एक छोटा सा ऑपरेशन करना चाहता हूं और उन्हें डेटास्टोर में फिर से लिखना चाहता हूं। वर्तमान में मेरे पास इस तरह की 20,000 इकाइयां हैं लेकिन एक समाधान चाहते हैं जो किसी भी राशि तक स्केल करेगा।Google App Engine

मेरे विकल्प क्या हैं?

उत्तर

4

mapper का उपयोग करें - यह मैपरेडस ढांचे का हिस्सा है, लेकिन आप केवल पहला घटक, मानचित्र चाहते हैं, क्योंकि अगर आप बसस्टोर इकाइयों को आसानी से बदल रहे हैं तो आपको शफल/कम चरण की आवश्यकता नहीं है।

+0

मैं वास्तव में पहले से ही ऐसा pipelining इन आपरेशनों में एक अच्छा विचार की तरह लग MapReduce ढांचे का उपयोग कर रहा हूँ। मेरी चिंता है कि कई समान एकल() संचालन समानांतर में चल रहे हैं। प्रदर्शन मुद्दे से परे मैं डेटास्टोर टाइमआउट के बारे में चिंतित हूं क्योंकि कई संस्थाएं इकाई समूह साझा करती हैं। क्या पाइपलाइन के लिए वैसे भी है और अभी भी कुल डाल() एस है? –

+0

नक्शा-कम एपीआई एक उत्परिवर्तन पूल के माध्यम से बैच डेटास्टोर संचालन के लिए अनुमति देता है। http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython –

3

डैनियल सही है, लेकिन यदि आप नक्शाकार साथ गंदगी नहीं करना चाहता, कि तुम यह कर सकते हैं अपने अनुप्रयोग के लिए एक और पुस्तकालय को जोड़ने के लिए deferred library कि एसडीके 1.2 के बाद से शामिल किया गया है का उपयोग कर Task Queues या और भी आसान का उपयोग कर की आवश्यकता है .3।

20.000 इकाइयां यह नाटकीय नहीं है और मुझे लगता है कि यह कार्य नियमित आधार पर नहीं किया जा रहा है (लेकिन अगर ऐसा होता है, तो यह संभव है)।

यहाँ एक उदाहरण NDB का उपयोग कर और आस्थगित पुस्तकालय (आप आसानी से कर सकते डीबी का उपयोग कर, लेकिन अगर आप पहले से ही इसे प्रयोग नहीं कर रहे हैं वैसे भी NDB को बदलने पर विचार हैं) है। यह एक सुंदर सीधे आगे रास्ता है, लेकिन समय समाप्ति के बारे में ज्यादा देखभाल के बिना:

def update_model(limit=1000): 
    more_cursor = None 
    more = True 
    while more: 
    model_dbs, more_cursor, more = Model.query().fetch_page(limit, start_cursor=more_cursor) 
    for model_db in model_dbs: 
     model_db.updated = True 
    ndb.put_multi(model_dbs) 
    logging.info('### %d entities were updated' % len(model_dbs)) 

class UpdateModelHandler(webapp2.RequestHandler): 
    def get(self): 
    deferred.defer(update_model, _queue='queue') 
    self.response.headers['Content-Type'] = 'text/html' 
    self.response.out.write('The task has been started!') 
+1

इस दृष्टिकोण के बारे में मेरी मुख्य चिंता उदाहरण स्मृति सीमा को मार रही है क्योंकि सभी मॉडलों को लिखने से पहले स्मृति में संग्रहीत किया जाता है (मैंने पहले ये किया था) । एक कर्सर पास करके मॉडल के दिए गए नंबर के बाद update_model कार्य को एक और update_model कार्य करना संभव है। –

+0

@ टॉमरवेलर मुझे नहीं लगता कि यह जरूरी है, यह एक घुसपैठ परीक्षण नहीं है और इसे अपने ऐप पर अपनाना बहुत आसान है .. इसलिए इसे एक शॉट दें और हमें – Lipis

+1

"155.32 एमबी के साथ मुलायम निजी मेमोरी सीमा से अधिक कुल 1 अनुरोधों की सेवा के बाद "। मेरे पास प्रति इकाई 10 केबी पर औसतन 18,000 इकाइयां हैं। यह एक अनुमानित विफलता है क्योंकि मूल फ्रंटएंड उदाहरण में 128 एमबी मेमोरी है और मैं 180 एमबी के डेटा को लोड करने की कोशिश कर रहा हूं। मुझे 155 तक पहुंचने के लिए एपेंगीन का अच्छा लगा है :) –