2011-11-19 21 views
11

में बड़े पैमाने पर अपडेट Google App Engine डेटास्टोर में इकाइयों पर बड़े पैमाने पर अपडेट करने का उचित तरीका क्या है? क्या यह संस्थाओं को पुनः प्राप्त किए बिना किया जा सकता है?Google App Engine डेटास्टोर

उदाहरण के लिए, क्या होगा GAE एसक्यूएल में कुछ इस तरह के बराबर:

UPDATE dbo.authors 
SET city = replace(city, 'Salt', 'Olympic') 
WHERE city LIKE 'Salt%'; 

उत्तर

9

वहाँ एक सीधा अनुवाद नहीं है। डेटास्टोर में वास्तव में अपडेट की कोई अवधारणा नहीं है; आप जो भी कर सकते हैं वह एक ही इकाई (कुंजी) पर एक नई इकाई के साथ पुरानी संस्थाओं को ओवरराइट कर रहा है। किसी इकाई को बदलने के लिए, आपको इसे डेटास्टोर से प्राप्त करना होगा, इसे स्थानीय रूप से संशोधित करना होगा, और फिर उसे वापस सहेजना होगा।

LIKE ऑपरेटर के बराबर भी नहीं है। जबकि कुछ चाल के साथ वाइल्डकार्ड प्रत्यय मिलान संभव है, यदि आप '% नमक%' से मेल खाना चाहते हैं तो आपको स्मृति में प्रत्येक इकाई को पढ़ना होगा और स्ट्रिंग तुलना स्थानीय रूप से करना होगा।

तो यह एसक्यूएल के रूप में काफी स्वच्छ या कुशल नहीं होने वाला है। यह सबसे वितरित ऑब्जेक्ट स्टोर्स के साथ एक ट्रेडऑफ है, और डेटास्टोर कोई अपवाद नहीं है।

ने कहा, the mapper library ऐसे बैच अपडेट की सुविधा के लिए उपलब्ध है। उदाहरण का पालन करें और अपने process समारोह के लिए कुछ इस तरह का उपयोग करें:

def process(entity): 
    if entity.city.startswith('Salt'): 
    entity.city = entity.city.replace('Salt', 'Olympic') 
    yield op.db.Put(entity) 

नक्शाकार के अलावा अन्य विकल्प हैं। सबसे महत्वपूर्ण अनुकूलन युक्ति आपके अपडेट बैच करना है; व्यक्तिगत रूप से प्रत्येक अद्यतन इकाई को वापस न सहेजें। यदि आप मैपर और उपज डालते हैं, तो यह स्वचालित रूप से संभाला जाता है।

+0

ड्रू- मैपर संदर्भ के लिए बहुत बहुत धन्यवाद- ऐसा कुछ दिखता है जिसे मैं सीखना चाहता हूं। – Yarin

2

आप क्वेरी वर्ग इस्तेमाल कर सकते हैं, http://code.google.com/appengine/docs/python/datastore/queryclass.html

query = authors.all().filter('city >', 'Salt').fetch() 
for record in query: 
    record.city = record.city.replace('Salt','Olympic') 
+2

धन्यवाद, लेकिन क्या यह सभी वस्तुओं को स्मृति में नहीं ला रहा है, और 1000 अधिकतम रिकॉर्ड सीमाओं से भी बाधित है? – Yarin

5

नहीं, यह संस्थाओं को पुनर्प्राप्त किए बिना नहीं किया जा सकता है।

'1000 अधिकतम रिकॉर्ड सीमा' जैसी कोई चीज़ नहीं है, लेकिन निश्चित रूप से किसी भी अनुरोध पर एक टाइमआउट है - और यदि आपके पास संशोधित करने के लिए बड़ी मात्रा में इकाइयां हैं, तो एक साधारण पुनरावृत्ति शायद उस पर असफल हो जाएगी। आप इसे कई संचालन में विभाजित करके और query cursor, या संभावित रूप से MapReduce framework का उपयोग कर ट्रैक करके इसे प्रबंधित कर सकते हैं।

+0

डैनियल धन्यवाद- .. शपथ ली होगी कि एक बिंदु पर अधिकतम रिकॉर्ड सीमा थी- क्या इससे छुटकारा पा लिया गया? – Yarin

+0

मेरे मामले में, मुझे प्रति "टाइमआउट" नहीं मिला, मुझे विशिष्ट त्रुटि मिली: 'इस अनुरोध को संभालने के दौरान, इस अनुरोध को संभालने वाली प्रक्रिया को बहुत अधिक स्मृति का उपयोग करने के लिए पाया गया था और इसे समाप्त कर दिया गया था। –

+0

मुझे अनुमति दें जोर देने के लिए कि MapReduce को "बहुत अधिक स्मृति" (उर्फ ** बड़ा **) और "टाइमआउट" (उर्फ ** लंबे समय से चलने वाला **) की समस्याओं को कम से कम "दोनों" हल करने के लिए डिज़ाइन किया गया है: ['यह उपयोगी है बड़ी, लंबी चल रही नौकरियां जिन्हें एकल अनुरोध के दायरे में नहीं रखा जा सकता है, जैसे कार्य: '] (https://github.com/GoogleCloudPlatform/appengine-mapreduce/wiki/1-MapReduce) –