2008-10-30 11 views
5

मैं अजगर की दुनिया के लिए अपेक्षाकृत नया हूं, लेकिन यह बहुत सीधे आगे लगता है।मैं इस Google ऐप इंजन कोड को कैसे अनुकूलित कर सकता हूं?

गूगल मुझ पर चिल्ला कि इस कोड अनुकूलित करने की आवश्यकता है है:

class AddLinks(webapp.RequestHandler): 
    def post(self): 
      # Hash the textarea input to generate pseudo-unique value 
      hash = md5.new(self.request.get('links')).hexdigest() 

      # Seperate the input by line 
      allLinks = self.request.get('links').splitlines() 

      # For each line in the input, add to the database 
      for x in allLinks: 
       newGroup = LinkGrouping() 
       newGroup.reference = hash 
       newGroup.link = x 
       newGroup.put() 

      # testing vs live 
      #baseURL = 'http://localhost:8080' 
      baseURL = 'http://linkabyss.appspot.com' 

      # Build template parameters 
      template_values = { 
       'all_links': allLinks, 
       'base_url': baseURL, 
       'reference': hash, 
      } 

      # Output the template 
      path = os.path.join(os.path.dirname(__file__), 'addLinks.html') 
      self.response.out.write(template.render(path, template_values)) 

डैशबोर्ड मुझे बता रहा है कि यह CPU के एक टन का उपयोग कर रहा है।

मुझे सुधारों को कहां देखना चाहिए?

उत्तर

7

यहां मुख्य ओवरहेड डेटास्टोर को एकाधिक व्यक्ति डालता है। यदि आप कर सकते हैं, लिंक को एक इकाई के रूप में स्टोर करें, जैसा कि आंद्रे सुझाव देता है। आप हमेशा लिंक को सरणी में विभाजित कर सकते हैं और उसे सूचीप्रोपर्टी में संग्रहीत कर सकते हैं।

आप प्रत्येक लिंक के लिए एक इकाई की आवश्यकता है, तो यह प्रयास करें:

# For each line in the input, add to the database 
groups = [] 
for x in allLinks: 
    newGroup = LinkGrouping() 
    newGroup.reference = hash 
    newGroup.link = x 
    groups.append(newGroup) 
db.put(groups) 

यह एक करने के लिए डेटासंग्रह roundtrips कम हो जाएगा, और यह roundtrips कि वास्तव में अपने उच्च CPU टोपी की हत्या कर रहे हैं।

3

मुझे बहुत तंग लग रहा है।

मुझे एक चीज दिखाई देती है जो एक छोटा सुधार कर सकती है। आपका कॉलिंग, "self.request.get ('link')" दो बार।

तो जोड़ने:

unsplitlinks = self.request.get('links') 

और संदर्भित, "unsplitlinks" मदद कर सकता है।

इसके अलावा लूप एकमात्र क्षेत्र है जो मुझे लगता है कि अनुकूलन के लिए एक लक्ष्य होगा। क्या डेटा प्रतिलिपि करना संभव है और फिर प्रति लिंक एक डीबी जोड़ने के बजाय इसे एक बार में डीबी में जोड़ना संभव है? (मुझे लगता है कि .put() कमांड डेटाबेस को लिंक जोड़ता है)

0

इसे कितनी बार बुलाया जा रहा है? यह बुरा नहीं दिखता है ... विशेष रूप से डुप्लिकेट अनुरोध को हटाने के बाद।

2

डेटाबेस में टेक्स्ट फ़ील्ड में पूर्ण self.request.get('links') को संग्रहीत करके आप अपने ऐप और डेटाबेस के बीच बातचीत को नाटकीय रूप से कम कर सकते हैं।

  • केवल एक put() प्रति post(self)
  • हैश

(हर कड़ी है, जो कोई मतलब नहीं है और वास्तव में अंतरिक्ष की बर्बादी है के लिए) संग्रहीत नहीं है एन-बार और तुम अपने आप को बचाने के लिए टेक्स्टफील्ड की पार्सिंग जब कोई वास्तव में पृष्ठ को कॉल करता है ....

0

क्या मैं ListProperty के खिलाफ पूछताछ कर सकता हूं?

कुछ

तरह
SELECT * FROM LinkGrouping WHERE links.contains('http://www.google.com') 

मैं भविष्य की योजनाओं जहां मुझे लगता है कि कार्यक्षमता की आवश्यकता होगी है।

मैं निश्चित रूप से उपयोग को कम करने के लिए एकल db.put() को लागू करूंगा।

+1

हाँ, ListProperties एक शांत सुविधा का समर्थन नहीं। यदि आप LinkGrouping.gql ("जहां लिंक = 1", "http://www.google.com") करते हैं, तो यह उन सभी समूहों को वापस कर देगा जिनके पास उनकी सूची में 'http://www.google.com' है। –

0

नहीं/आप की तरह कुछ का उपयोग नहीं कर सकते हैं "links.contains ('http://www.google.com')" GQL इस

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