2008-10-30 16 views
5

Soy relativamente nuevo en el mundo de las pitones, pero esto parece muy sencillo.¿Cómo puedo optimizar este código de Google App Engine?

Google está gritando a mí que este código debe ser optimizado:

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

El salpicadero me está diciendo que esto es usar una tonelada de CPU.

¿Dónde debo buscar mejoras?

Respuesta

7

La tara principal aquí es la cantidad de puestos individuales múltiples en el almacén de datos. Si puede, almacene los enlaces como una sola entidad, como sugiere Andre. Siempre puede dividir los enlaces en una matriz y almacenarlos en ListProperty.

Si necesita una entidad para cada enlace, intente lo siguiente:

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

se reducirá el almacén de datos de ida y vuelta a uno, y es de ida y vuelta los que realmente están matando a su casquillo de la CPU.

3

Parece bastante apretado para mí.

Veo una cosa que puede hacer una pequeña mejora. Su llamada, "self.request.get ('links')" dos veces.

por lo que añadir:

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

y hacer referencia a "unsplitlinks" podría ayudar.

Aparte de eso, el bucle es la única área que veo que sería un objetivo para la optimización. ¿Es posible preparar los datos y luego agregarlos a la base de datos de una vez, en lugar de agregar una base de datos por enlace? (Supongo que el comando .put() agrega el enlace a la base de datos)

0

¿Con qué frecuencia se llama esto? Esto no se ve tan mal ... especialmente después de eliminar la solicitud duplicada.

2

Puede reducir drásticamente la interacción entre su aplicación y la base de datos simplemente almacenando el self.request.get('links') completo en un campo de texto en la base de datos.

  • único put() por post(self)
  • el hash no se almacena n veces (por cada enlace, que no tiene sentido y es realmente un desperdicio de espacio)

Y te salvas el análisis del campo de texto cuando alguien realmente llama a la página ....

0

¿Puedo buscar contra ListProperty?

Algo así como

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

tengo planes de futuro en el que iba a necesitar esa funcionalidad.

Definitivamente implementaré el único db.put() para reducir el uso.

+1

Sí, propiedadeslista tienen una función interesante. Si haces LinkGrouping.gql ("WHERE links =: 1", "http://www.google.com"), devolverá todos los grupos que tengan 'http://www.google.com' en su lista. –