我正在建立一个目录,用于在GAE上寻找体育比赛 web2py和Flex前端。用户选择位置,半径和最大值 来自一组选择的日期。我已经实现了这个查询的基本版本,但它确实如此 效率低,速度慢。我知道可以改进的一种方法是冷凝 我用来组装对象的许多单独查询 批量查询。我刚刚了解到这是可能的。但我也在考虑使用memcache进行更广泛的重新设计。
主要问题是我无法按位置查询数据存储区 因为GAE不允许多个数字比较语句 (<,< =,> =,>)在一个查询中。我已经使用了一个日期,我需要 两个检查纬度和经度,所以这是不行。目前, 我的算法看起来像这样:
1。)按日期查询并选择
2。)使用geopy的距离模块中的目标函数来查找 所提供距离的最大和最小纬度和经度
3.。)循环结果并删除所有lat / lng在max / min之外
4。)再次循环并使用距离函数来检查确切的 距离,因为步骤2将包括半径之外的一些区域。 删除超出所提供距离的结果(这是2/3/4组合 inefficent?)
5.。)组合多对多列表并附加到对象(这是我的地方 需要切换到批量操作)
6。)返回客户
这是我使用memcache的计划..让我知道我是否离开了 因为我之前没有使用memcache或服务器的经验 缓存一般。
- 在缓存中保存一个列表,其中包含代表所有内容的“地理对象” 我的数据。它们有五个属性:纬度,经度,event_id, event_type(期待扩展到锦标赛之外),以及 开始日期。此列表将按日期排序。
- 还要在缓存中保留一个指针的字典,表示开头 并在我的应用程序使用的所有日期范围的缓存中结束索引(下一步 一周,两周,一个月,三个月,六个月,一年,两年)。
- 有一个计划任务,每天早上12点更新指针。
- 向缓存和数据存储添加新插入;更新 指针。
使用此设计,算法现在看起来像:
1。)使用指针基于切掉适当的列表块 提供日期。
2-4。)与上述算法相同,除了地理对象
5.使用批量操作使用剩余的地理位置选择完整的锦标赛 对象'event_ids
6。)组装多对象
7.)返回客户
关于这种方法的想法?非常感谢阅读和任何建议 可以给。
-Dane
答案 0 :(得分:2)
GeoModel是我发现的最好的。您可以查看我的GAE app如何返回地理空间查询。例如,印度http查询是使用地理模型库lat=20.2095231&lon=79.560344&cc=IN
答案 1 :(得分:1)
您可能会对geohash
感兴趣,这样您就可以执行这样的不等式查询:
选择纬度,经度,标题FROM myMarkers WHERE geohash> =:sw_geohash AND geohash< =:ne_geohash
查看本月Google App Engine this fine article博客文章中提到的App Engine Community Update。
作为您提议的设计的注释,不要忘记Memcache中的实体不能保证留在内存中,并且您不能将它们“按日期排序”。