Pregunta

Estoy construyendo un directorio para encontrar torneos de atletismo en GAE con web2py y un extremo delantero Flex. El usuario selecciona una ubicación, un radio, y un máximo fecha a partir de un conjunto de opciones. Tengo una versión básica de esta consulta implementado, pero es ineficiente y lento. Una manera en que sé que puedo mejorar es por condensación las muchas consultas individuales que estoy usando para ensamblar los objetos en consultas a granel. Me acabo de enterar de que era posible. Pero también estoy pensando en un más amplio rediseño que utiliza Memcache.

El principal problema es que no puedo consultar el almacén de datos por ubicación GAE porque no permitirá que varias instrucciones comparación numérica (<, <=,> =,>) En una consulta. Ya estoy usando uno para la fecha, y que iba a necesitar DOS para comprobar tanto la latitud y la longitud, por lo que es un no ir. Actualmente, mis algoritmo es similar al siguiente:

1.) Consulta por fecha y seleccione

2.) Use la función de destino desde el módulo de la distancia a geopy para encontrar el max y min latitud y longitudes para la distancia suministrado

3.) Loop a través de resultados y eliminar todos con lat / lng fuera max / min

4.) Loop través de la función de nuevo y el uso distancia para comprobar exacta distancia, porque el paso 2 incluirá algunas áreas fuera de la radio. resultados Eliminar distancia fuera suministrado (es este 2/3/4 combinación inefficent?)

5.) Montar muchos-a-muchos listas y adjuntar a los objetos (aquí es donde I necesidad de cambiar a las operaciones a granel)

6.) Volver al cliente

Aquí está mi plan para usar memcache .. quiero saber si estoy muy lejos en la izquierda en este campo ya que tengo experiencia previa con ningún Memcache o servidor el almacenamiento en caché en general.

-Mantenga una lista en la memoria caché llena de objetos "geo" que representan todos mis datos. Estos tienen cinco propiedades: latitud, longitud, event_id, EVENT_TYPE (en previsión de expandirse más allá de torneos), y fecha de inicio. Esta lista se ordenará por fecha.

-también a mantener un diccionario de punteros en la memoria caché, que representan el inicio y los índices finales en la memoria caché para todos los periodos de tiempo mis usos de aplicaciones (próxima semana, 2 semanas, mes, 3 meses, 6 meses, año, 2 años).

-tienen una tarea programada que actualiza los punteros a las 12 am todos los días.

-Añadir nuevas inserciones a la caché, así como el almacén de datos; actualizar punteros.

Con este diseño, el algoritmo podría tener el siguiente aspecto:

1.) Utilizan punteros para rebanar trozo apropiado de la lista basada en fecha proporcionada.

2-4.) Igual que el algoritmo anterior, excepto con los objetos geo

5.) Operación Uso mayor para seleccionar torneos completos utilizando geo restante objetos event_ids

6.) Montar muchos-a-manys

7.) Volver al cliente

Pensamientos en este enfoque? Muchas gracias por su lectura y todos los consejos que puede dar.

-Dane

¿Fue útil?

Solución

Usted podría estar interesado por geohash, lo que le permite hacer una consulta de la desigualdad siguiente:

  

latitud SELECT, longitud, título a partir de   myMarkers DONDE geohash> =: sw_geohash   Y geohash <=: ne_geohash

Para consultar este artículo fino que apareció en este mes de Google App Engine Aplicación Comunidad de actualización del motor entrada en el blog.

Como una nota en su diseño propuesto, no se olvide que las entidades en Memcache no tienen ninguna garantía de permanecer en la memoria, y que no se puede tener ellos "ordenados por fecha".

Otros consejos

GeoModel es el mejor que he encontrado. Usted puede ver cómo mi GAE de aplicaciones retorno consultas geoespaciales. Por ejemplo la India http consulta es con cc (código de país) opcional usando la biblioteca geomodelo lat=20.2095231&lon=79.560344&cc=IN

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top