2008-10-30 30 views
5

Tôi tương đối mới với thế giới python, nhưng điều này có vẻ rất thẳng về phía trước.Tôi làm cách nào để tối ưu hóa mã Google App Engine này?

Google đang la hét với tôi rằng mã này cần phải được tối ưu hóa:

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

Các bảng điều khiển là nói cho tôi rằng điều này là sử dụng một tấn của CPU.

Tôi nên tìm cải tiến ở đâu?

Trả lời

7

Chi phí chính ở đây là nhiều cá nhân đặt vào kho dữ liệu. Nếu bạn có thể, lưu trữ các liên kết như là một thực thể duy nhất, như Andre gợi ý. Bạn luôn có thể tách các liên kết thành một mảng và lưu trữ nó trong một ListProperty.

Nếu bạn cần một thực thể cho mỗi liên kết, hãy thử này:

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

Nó sẽ làm giảm roundtrips kho dữ liệu để một, và đó là roundtrips rằng đang thực sự giết chết nắp CPU cao của bạn.

3

Trông khá chặt chẽ với tôi.

Tôi thấy một điều có thể cải thiện nhỏ. Gọi điện thoại của bạn, "self.request.get ('links')" hai lần.

Vì vậy, nói thêm:

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

Và tham khảo, "unsplitlinks" có thể giúp đỡ.

Khác với vòng lặp là khu vực duy nhất tôi thấy sẽ là mục tiêu để tối ưu hóa. Có thể chuẩn bị dữ liệu và sau đó thêm nó vào db cùng một lúc, thay vì thực hiện thêm db cho mỗi liên kết? (Tôi giả sử lệnh .put() thêm liên kết vào cơ sở dữ liệu)

0

Mức độ thường xuyên này được gọi là bao nhiêu? Điều này không có vẻ xấu ... đặc biệt là sau khi xóa yêu cầu trùng lặp.

2

Bạn có thể giảm đáng kể tương tác giữa ứng dụng và cơ sở dữ liệu bằng cách chỉ lưu trữ toàn bộ self.request.get('links') trong trường văn bản trong cơ sở dữ liệu.

  • chỉ có một put() mỗi post(self)
  • băm không được lưu trữ n-lần (đối với mỗi liên kết, mà làm cho không có ý nghĩa và thực sự là một sự lãng phí không gian)

Và bạn tiết kiệm cho mình phân tích cú pháp của trường văn bản khi ai đó thực sự gọi trang ....

0

Tôi có thể truy vấn đối với ListProperty không?

Something như

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

tôi có kế hoạch tương lai mà tôi sẽ cần chức năng đó.

Tôi chắc chắn sẽ triển khai đơn db.put() để giảm mức sử dụng.

+1

Vâng, ListProperties có một tính năng mát mẻ. Nếu bạn làm LinkGrouping.gql ("WHERE links =: 1", "http://www.google.com"), nó sẽ trả về tất cả các nhóm có 'http://www.google.com' trong danh sách của họ. –

0

không/bạn không thể sử dụng một cái gì đó như "links.contains ('http://www.google.com')" GQL không hỗ trợ này

Các vấn đề liên quan