2008-10-30 19 views
5

Python dünyasında göreceli olarak yeniyim, ama bu çok ileriye doğru görünüyor.Bu Google App Engine kodunu nasıl optimize edebilirim?

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)) 

pano bu CPU bir ton kullandığını bana anlatıyor:

Google bu kod optimize edilmesi gerektiğini bana bağırıyor.

Geliştirmeleri nerede arayayım?

cevap

7

burada ana havai veri deposuna birden çok bireysel koyar olduğunu. Eğer yapabiliyorsan, Andre'nin önerdiği gibi bağlantıları tek bir varlık olarak sakla. Bağlantıları her zaman bir diziye ayırabilir ve bir ListProperty'de saklayabilirsiniz.

# 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) 

Bire veri deposu gidiş-dönüş azaltacaktır ve bu gerçekten yüksek CPU kapağını öldürüyorlar gidiş-dönüş: sen her bağlantı için bir varlık ihtiyaç yaparsanız

, bunu deneyin.

3

Bana oldukça sıkı görünüyor.

Küçük bir iyileştirme yapabilecek bir şey görüyorum. Aramanız, "self.request.get ('links')" iki kere.

Yani ekleme:

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

Ve referans, "unsplitlinks" yardımcı olabilir. Bunun dışında

döngü O optimizasyonu için hedef olacağını gördüğüm tek alandır. Verileri hazırlayıp, bağlantı başına bir db eklemek yerine bir kerede db'ye eklemek mümkün mü? Ne sıklıkla bu

0

denir oluyor (I .put() komutu veritabanına bağlantıyı ekler varsayıyorum)? Bu kötü görünmüyor ... özellikle de yinelenen istekleri kaldırdıktan sonra.

2

Sen dramatik sadece veritabanındaki bir metin alanında komple self.request.get('links') depolayarak uygulaması ve veritabanı arasındaki etkileşimi azaltabilir.

  • tek put()post(self)
  • başına karma

(hiçbir mantıklı ve gerçekten uzayda kaybıdır her bağlantının, için) n-kez saklanmaz Ve kendini kurtarmak birisi aslında sayfasını çağıran textfield ayrıştırma ....

0

ListProperty'ye karşı sorgu yapabilir miyim?

şey

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

gibi ben bu işlevselliği gerekir gelecekteki planları var.

Kesinlikle kullanımını azaltmak için tek db.put() uygulamak gerekir.

+1

Evet, ListProperties havalı bir özelliğe sahip desteklemez. Eğer LinkGrouping.gql ("WHERE links =: 1", "http://www.google.com") yaparsanız, listedeki 'http://www.google.com' olan tüm grupları döndürür. –