Soy bastante nuevo en Google App Engine y Python, pero acabo de lanzar mi primer sitio del mundo real con él. Pero ahora tengo problemas con una ruta que está usando significativamente más tiempo de CPU (y API CPU) que las otras rutas. Lo he reducido a una única búsqueda de almacén de datos que está causando el problema: Carvings.all().fetch(1000)

Debajo del panel de App Engine, informa "1040cpu_ms 846api_cpu_ms" de manera bastante confiable para cada solicitud a esa ruta. Parece que esto puede ser la fuente de cierta falta de respuesta que mi cliente ha experimentado con el sitio en general.

Así que no puedo entender qué es tan costoso sobre esta consulta. Aquí está el modelo de datos relacionados:

class Carving(db.Model):
    title = db.StringProperty(required=True)
    reference_number = db.StringProperty()
    main_category = db.StringProperty()
    sub_category = db.StringProperty()
    image = db.ReferenceProperty(CarvingImage)
    description = db.TextProperty()
    price = db.FloatProperty()
    size = db.StringProperty()
    material = db.StringProperty()
    added_at = db.DateTimeProperty(auto_now_add=True)
    modified_at = db.DateTimeProperty(auto_now=True)

En otros lugares de la aplicación, cuando saco este modelo del almacén de datos, hago más filtros y supongo que es por eso que no están causando ningún problema. Pero el número total de entidades para este modelo está por encima de 90 y no puedo imaginar por qué esto es tan costoso.

0
donut 12 dic. 2009 a las 07:46

4 respuestas

La mejor respuesta
  • Memcache, si aún no lo ha hecho, y especialmente si se van a buscar las mismas tallas una y otra vez. Si solo tienes 90 en total, me imagino que todos estarían en el caché bastante rápido, y entonces deberías ser dorado.

  • ¿Necesitas todas las propiedades de las tallas? Por ejemplo, si solo está mostrando una lista de tallas, podría tener una Entidad separada que era algo así como CarvingSummary que solo tenía unas pocas propiedades. Esto significaría que su esquema fue desnormalizado, pero a veces ese es el precio que paga por la velocidad.

Además, supongo que esta no es la primera página que el usuario siempre encontrará. Si ese fuera el caso, podría ser la nube girando una nueva instancia.

2
Peter Recore 12 dic. 2009 a las 05:29

Podría ser la imagen (y / o la propiedad Text) la que se está demorando en cargar y ordenar en los objetos, dependiendo de cuán grandes sean esas propiedades.

Primer premio: solo use el memcache como otros dicen. Entonces la sobrecarga se incurre solo en el primer golpe.

Segundo premio: no estoy seguro de con qué frecuencia se cambian sus imágenes y cuántas puede tener, pero podría considerar cargarlas como archivos estáticos y simplemente vincularlas en su HTML. Entonces sería solo un HTTP GET del navegador, una sobrecarga mucho menor.

0
Richard Watson 14 dic. 2009 a las 05:21

¿Realmente necesitas 1000 entidades? El tiempo de CPU aumenta más o menos linealmente con la cantidad de resultados recuperados, por lo que si realmente no necesita todos los resultados, puede estar perdiendo mucho tiempo buscando y decodificando.

0
Nick Johnson 12 dic. 2009 a las 15:02

A veces obtendrá un mejor rendimiento si realiza una consulta indexada, en lugar de una consulta de "todos" los elementos del modelo.

Además, considere usar memcache.

0
dmazzoni 12 dic. 2009 a las 05:13