29

मैं Google ऐप इंजन समूहों पर कई उपयोगकर्ताओं (Fig1, Fig2, Fig3) पर पढ़ रहा हूं, यह पता नहीं लगा सकता कि उनकी बिलिंग रिपोर्ट में डेटास्टोर की उच्च संख्या कहां से आती है।
जैसा कि आप जानते हैं, Datastore reads इस बजट के ऊपर 50K ऑपरेशंस/दिन तक सीमित हैं, आपको भुगतान करना होगा।कितने डेटास्टोर प्रत्येक Fetch, गणना और क्वेरी संचालन का उपभोग करते हैं?

50K ऑपरेशंस बहुत सारे संसाधनों की तरह लगता है, लेकिन असल में, ऐसा लगता है कि प्रत्येक ऑपरेशन (क्वेरी, एंटिटी लांच, गिनती ..), कई डेटास्टोर को छुपाता है।

क्या यह संभव है एपीआई या कुछ अन्य दृष्टिकोण के माध्यम से पता करने के लिए, कितने डेटास्टोर आम RPC.get, RPC.runquery कॉल के पीछे छिपा रहे होते?

Appstats इस मामले में बेकार लगता है क्योंकि यह केवल आरपीसी विवरण देता है और छिपी हुई पढ़ाई लागत नहीं देता है।

इस तरह एक साधारण मॉडल के बाद: डेटासंग्रह में

class Example(db.Model): 
    foo = db.StringProperty()  
    bars= db.ListProperty(str) 

और संस्थाओं, मैं संचालन इस तरह की लागत में दिलचस्पी रखता हूँ:

items_count = Example.all(keys_only = True).filter('bars=','spam').count() 

items_count = Example.all().count(10000) 

items = Example.all().fetch(10000) 

items = Example.all().filter('bars=','spam').filter('bars=','fu').fetch(10000) 

items = Example.all().fetch(10000, offset=500) 

items = Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd') 
+0

मुझे लगता है कि लौटाई गई प्रत्येक इकाई एक पठन है, यदि आपके पास रेफ प्रोप है तो पहली बार जब आप इसे एक्सेस करते हैं तो भी पढ़ा जाता है। ध्यान दें कि fetch (X) का मतलब यह नहीं है कि यदि काउंटी बहुत अधिक है तो एक्स इकाइयां वापस आती हैं तो यह थोक में काम करेगी और प्रत्येक थोक डेटा को पढ़ने (थोक आकार) के रूप में गिना जाएगा। मुझे नहीं पता कि डेटा पढ़ने के संबंध में गिनती (एक्स) कैसे काम करती है, इसे एक पठन के रूप में गिना जाना चाहिए, लेकिन यह एक इच्छापूर्ण सोच है। –

उत्तर

10

http://code.google.com/appengine/docs/billing.html#Billable_Resource_Unit_Cost देखें। एक क्वेरी आपको 1 इकाई को पढ़ी गई प्रत्येक इकाई के लिए 1 प्लस 1 पढ़ी जाती है। "रिटर्न" में ऑफसेट या गिनती से छोड़ी गई संस्थाएं शामिल हैं। ताकि 1001 इनमें से प्रत्येक के लिए पढ़ता है:

Example.all(keys_only = True).filter('bars=','spam').count() 
Example.all().count(1000) 
Example.all().fetch(1000) 
Example.all().fetch(1000, offset=500) 

इन के लिए, का आरोप लगाया पढ़ने संख्या 1 प्लस संस्थाओं की संख्या कि फिल्टर से मेल है:

इसके बजाय आप गिनती का उपयोग करने का
Example.all().filter('bars=','spam').filter('bars=','fu').fetch() 
Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd').fetch() 

डेटास्टोर में गिनती को संग्रहीत करने पर विचार करना चाहिए, यदि आपको दूसरी बार एक बार गिनती को अपडेट करने की आवश्यकता है तो sharded। http://code.google.com/appengine/articles/sharding_counters.html

जब भी संभव हो तो आपको ऑफ़सेट के बजाय कर्सर का उपयोग करना चाहिए।

+0

मुझे आपके द्वारा पोस्ट किए गए लिंक में कोई संदर्भ नहीं दिखाई दे रहा है, जिसकी कीमत प्रति इकाई 1 पढ़ी गई है, वास्तव में मुझे डेटास्टोर पढ़ने का कोई उल्लेख नहीं दिखाई देता है। –

+0

ओह, मैंने गलत लिंक चिपकाया। मैंने इसे अब – ribrdb

3

बस सुनिश्चित करने के लिए:

मैं लगभग यकीन है:

Example.all().count(10000) 

यह एक छोटा सा डेटासंग्रह परिचालन (संस्थाओं, केवल कुंजी लाने के लिए कोई ज़रूरत नहीं) का उपयोग करता है, तो यह 1 माना जाएगा + 10,000 (अधिकतम) छोटे परिचालन पढ़ें।

+0

तय कर दिया है आप सही हैं - उपरोक्त अभिव्यक्ति से "छोटे ऑपरेशन" प्रभावित होते हैं, न कि "ऑपरेशन पढ़ें"। बस एक जीएई परियोजना पर जांच की। –