Domanda

Sto costruendo una directory per trovare tornei sportivi sulla GAE con web2py e un front-end Flex. L'utente seleziona una posizione, un raggio, e un massimo data da un insieme di scelte. Ho una versione base di questa query implementato, ma è inefficiente e lento. Un modo so di poter migliorare sia condensando le molte singole query che sto usando per assemblare gli oggetti in query di massa. Ho appena saputo che era possibile. Ma sto anche pensando a una più ampia riprogettazione che memcache utilizza.

Il problema principale è che non riesco a interrogare l'archivio dati per posizione perché GAE non permetterà più istruzioni confronto numerico (<, <=,> =,>) In una query. Sto già utilizzando uno per la data, e avrei bisogno Da due a controllare sia latitudine e longitudine, quindi è un no go. Attualmente, il mio algoritmo simile a questo:

1.) Query per data e selezionare

2.) Utilizzare la funzione di destinazione dal modulo di distanza di geopy per trovare il max e min di latitudine e longitudine per la distanza in dotazione

3.) Loop attraverso i risultati e rimuovere il tutto con lat / lng esterno max / min

4.) Loop attraverso nuovamente e utilizzare la distanza esatta funzione per controllare distanza, perché step 2 includerà alcune aree esterne del raggio. Rimuovere risultati all'esterno distanza fornito (è questa combinazione 2/3/4 inefficent?)

5.) Assemblare molti-a-molti elenchi e allegare agli oggetti (questo è dove ho necessario passare ad operazioni di massa)

6.) Torna al client

Ecco il mio piano per l'utilizzo di memcache .. fatemi sapere se sto via d'uscita a sinistra campo su questo come non ho alcuna esperienza precedente con memcache o il server caching in generale.

-Tenere una lista nella cache piena di "oggetti geo" che rappresentano tutto i miei dati. Questi hanno cinque proprietà: latitudine, longitudine, event_id, event_type (in previsione di espansione oltre i tornei), e data d'inizio. Questo elenco verrà ordinato per data.

-Anche mantenere un dict di puntatori nella cache che rappresentano l'inizio e gli indici finali nella cache per tutte le informazioni gamme miei usi app (prossima settimana, 2 settimane, mese, 3 mesi, 6 mesi, anno, 2 anni).

-Avere un'operazione pianificata che aggiorna i puntatori tutti i giorni alle 00:00.

nuovi inserti -Aggiungere alla cache, così come l'archivio dati; aggiornare puntatori.

Con questo disegno, l'algoritmo potrebbe apparire come:

1). Utilizzare puntatori a tagliare via appropriata pezzo di lista sulla base di data in dotazione.

2-4.) Come sopra algoritmo, se non con gli oggetti geo

5.) Usando un'operazione di massa per selezionare tornei completi utilizzando restante geo event_ids degli oggetti

6.) Assemblare molti-a-manys

7). Ritorno a cliente

pensieri su questo approccio? Molte grazie per la lettura e qualche consiglio voi può dare.

-Dane

È stato utile?

Soluzione

Si potrebbe essere interessato da geohash, che consente di fare una query di disuguaglianza in questo modo:

  

latitudine SELECT, longitudine, titolo FROM   myMarkers WHERE geohash> =: sw_geohash   E geohash <=: ne_geohash

Date un'occhiata a questo articolo bel che è stato descritto in Google App Engine di questo mese App Engine Community Aggiornamento post del blog.

Come nota sul vostro disegno proposto, non dimenticare che le entità in Memcache non hanno alcuna garanzia di rimanere nella memoria, e che non si può avere a loro "scelte per data".

Altri suggerimenti

GeoModel è il migliore che ho trovato. Si può guardare come il mio GAE app tornare query geospaziali. Per esempio l'India interrogazione http è con cc opzionale (codice del paese) utilizzando geomodel lat=20.2095231&lon=79.560344&cc=IN biblioteca

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top