10

के साथ इकाइयों के बैच को प्राप्त करने, संशोधित करने और रखने का सबसे प्रभावी तरीका मेरे पास कुछ बैच ऑपरेशंस हैं जो मैं करता हूं। दुर्भाग्य से यह कभी-कभी 400-500 इकाइयों को अपडेट करने के लिए हमेशा के लिए लेता है। मेरे पास सभी इकाई कुंजी हैं, मुझे उन्हें प्राप्त करने, संपत्ति अपडेट करने और उन्हें डेटास्टोर में सहेजने और उन्हें बचाने में 40-50 सेकंड तक लग सकते हैं जो मैं नहीं ढूंढ रहा हूं।मेरे ऐप में ndb

बीमार अपने मॉडल को आसान बनाने में समझाने के लिए मुझे क्या करना है (जो वैसे भी बहुत सरल है):

class Entity(ndb.Model): 
    title = ndb.StringProperty() 

keys = [key1, key2, key3, key4, ..., key500] 

entities = ndb.get_multi(keys) 

for e in entities: 
    e.title = 'the new title' 

ndb.put_multi(entities) 

हो रही है और बदलाव भी अधिक समय नहीं लगता। मैंने get_async को एक टास्कलेट में प्राप्त करने का प्रयास किया और जो भी संभव हो, जो केवल तभी बदलता है जब फोरलोप अधिक समय लेता है।

लेकिन क्या वास्तव में मुझे परेशान करती है कि एक निराली 50seconds तक का समय लगता है ...

समय की एक सभ्य राशि में इस आपरेशन (रों) करने के लिए सबसे कारगर तरीका है क्या। बेशक मुझे पता है कि यह इकाई की जटिलता जैसे कई कारकों पर निर्भर करता है लेकिन जो समय लगता है वह वास्तव में स्वीकार्य सीमा से अधिक है।
मैंने पहले ही एसिंक ऑपरेशंस, टास्कलेट्स की कोशिश की है ...

उत्तर

8

मुझे आश्चर्य है कि 50 या 100 इकाइयों के छोटे बैचों को तेज करना होगा। अगर आप इसे किसी कार्य में बनाते हैं आइए उन कार्यलेटों को समवर्ती रूप से चलाने का प्रयास करें।

मैं यह देखने के लिए Appstats के साथ यह देखने की भी सिफारिश करता हूं कि यह कुछ आश्चर्यजनक दिखाता है या नहीं।

अंततः यह मानते हुए कि यह एचआरडी का उपयोग करता है, आप पाते हैं कि प्रति बैच इकाई समूहों की संख्या पर एक सीमा है। यह सीमा बहुत कम है। इसे उठाने का प्रयास करें।

+1

सभी इकाइयां एक ही इकाई में हैं समूह और कुछ परीक्षणों के बाद मुझे यह कहना है कि इकाइयों को एक स्थगित कार्य में 50 से बैचिंग करने के लिए एक टास्कलेट का उपयोग करना इस ऑपरेशन को बहुत तेज बनाता है। मैं पूर्ण अपडेट के लिए 5-10 सेकेंड के बारे में बात कर रहा हूं जो अभी भी मेरे मन में नहीं है लेकिन 50 सेकंड से काफी बेहतर है। – aschmid00

+1

मुझे यह आश्चर्यजनक लगता है, अगर वे सभी एक ही समूह में हैं, तो अलग-अलग बैच नहीं होने पर आपको लगभग 1 लिखने/दूसरे/समूह की सीमा तक पहुंचने में मदद मिलेगी? – Alexis

+0

1 बैच/दूसरा लगता है कि वह क्या प्राप्त कर रहा है ... –

0

मैपरेडस के लिए डिज़ाइन किया गया था। आप एक ही समय में सभी इकाइयों को एक साथ प्राप्त करने और संशोधित करके, यह तेजी से कर सकते हैं, कई सर्वर उदाहरणों में स्केल किए गए हैं। यद्यपि अधिक लागत का उपयोग करके आपकी लागत बढ़ जाती है।

+0

ठीक है लेकिन यह एक ऑन डिमांड ऑपरेशन है। यकीन नहीं है कि मैप्रिडस मेरे प्रश्न के लिए एक औसत है। लेकिन मैं गलत हो सकता हूं – aschmid00

+0

जब आप "मांग पर" कहते हैं, तो मुझे लगता है कि आपका मतलब है "HTTP अनुरोध शुरू हुआ?"। यह आपको मैड्रिडस का उपयोग करने से नहीं रोकता है। हालांकि, जब सब कुछ पूरा हो जाता है तो परिणामों की जांच करना थोड़ा परेशानी होती है, लेकिन असंभव नहीं है। – dragonx

+0

हां वे http अनुरोध में शामिल हैं। और मुझे यह जांचने की ज़रूरत है कि कार्रवाई/ऑपरेशन सफल हुआ या नहीं। – aschmid00

0

मैं यह मानने जा रहा हूं कि आपके पास इकाई डिज़ाइन है जो आप चाहते हैं (यानी मैं आपसे नहीं पूछूंगा कि आप क्या करने की कोशिश कर रहे हैं और शायद आपके पास एक समूह की बजाय एक बड़ी इकाई होनी चाहिए छोटे जिन्हें आपको हर समय अपडेट करना होगा)। क्योंकि यह बहुत अच्छा नहीं होगा। (=

क्या होगा यदि आपने कार्य कतार का उपयोग किया था? आप कई कार्य बना सकते हैं और प्रत्येक कार्य यूआरएल को उस कुंजी को पैरामीटर कर सकता है जो अद्यतन करने के लिए ज़िम्मेदार है और संपत्ति और मूल्य जो सेट किया जाना चाहिए। इस तरह काम टूट गया है प्रबंधनीय हिस्सों में और उपयोगकर्ता के अनुरोध पृष्ठभूमि में काम करते समय तुरंत लौट सकते हैं? क्या यह काम करेगा?

+0

मुझे लगता है * MapReduce API मूल रूप से आपके लिए यह करता है।यह आपके काम को लेता है, इसे कई कार्यों में बैच करता है, फिर कार्यों को समानांतर में जारी करता है, ताकि यह तेज़ी से पूरा हो जाए। – dragonx

+0

इकाई डिज़ाइन चर्चा से बाहर है और हां मैंने कार्यों को स्थापित करने के बारे में सोचा है, लेकिन फिर मेरे पास अन्य मुद्दे होंगे जैसे कि यह नहीं पता कि ऑपरेशन मुश्किल हो गया है या नहीं, सभी इकाइयां एक ही इकाई समूह में हैं और पुट कर रही हैं) बैचों में विवादों के कारण हो सकते हैं ... मैं अभी भी समझ नहीं पा रहा हूं कि कैसे एक बैच इकाइयों के समूह (और मैं दस लाख इकाइयों के बारे में बात नहीं कर रहा हूं) में लगभग एक मिनट लग सकता है। ये पृष्ठभूमि कार्य नहीं हैं लेकिन उपयोगकर्ता द्वारा किए गए कार्यों को इसलिए मुझे यह जानने की ज़रूरत है कि कार्य विफल हो या तुरंत सफल हो जाएं। – aschmid00

+0

ऐपस्टैट्स का उपयोग करने पर जीवीआर की नोक शायद आपके लिए फायदेमंद है। जब आप अपनी संस्थाओं में से एक डालते हैं तो कितने इंडेक्स लिखे जा रहे हैं? कितने डीबी लिखते हैं? शायद थोड़ी देर हो सकती है, लेकिन इस आलेख को देखें कि इसमें आपकी एक इकाई को रखने में कुछ समय लग सकता है: https://developers.google.com/appengine/articles/life_of_write –

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