1

我正在使用 web2py 和 Flex 前端构建一个目录,用于在 GAE 上查找运动锦标赛。用户从一组选项中选择位置、半径和最大日期。我实现了这个查询的基本版本,但它效率低且速度慢。我知道我可以改进它的一种方法是将我用来将对象组装成批量查询的许多单独的查询压缩。我刚刚了解到这是可能的。但我也在考虑利用内存缓存进行更广泛的重新设计。

主要问题是我无法按位置查询数据存储,因为 GAE 不允许在一个查询中使用多个数值比较语句 (<,<=,>=,>)。我已经在使用一个日期,我需要两个来检查纬度和经度,所以这是不行的。目前,我的算法如下所示:

1.) 按日期查询并选择

2.) 使用 geopy 距离模块中的目标函数来查找提供距离的最大和最小纬度和经度

3.) 遍历结果并删除所有在 max/min 之外的 lat/lng

4.) 再次循环并使用距离函数来检查确切的距离,因为第 2 步将包括半径之外的一些区域。删除提供距离之外的结果(这 2/3/4 组合是否无效?)

5.)组装多对多列表并附加到对象(这是我需要切换到批量操作的地方)

6.) 返回给客户

这是我使用 memcache 的计划.. 让我知道我是否在左侧字段中出路,因为我一般没有使用 memcache 或服务器缓存的经验。

- 在缓存中保留一个列表,其中包含代表我所有数据的“地理对象”。它们有五个属性:纬度、​​经度、event_id、event_type(预计会扩展到锦标赛之外)和 start_date。此列表将按日期排序。

-还在缓存中保留一个指针字典,这些指针表示我的应用程序使用的所有日期范围(下周、2 周、月、3 个月、6 个月、年、2 年)的缓存中的开始和结束索引。

- 有一个计划任务,每天上午 12 点更新指针。

- 向缓存和数据存储添加新的插入;更新指针。

使用这种设计,算法现在看起来像:

1.) 使用指针根据提供的日期切出适当的列表块。

2-4.) 与上述算法相同,除了地理对象

5.) 使用批量操作使用剩余地理对象的 event_ids 选择完整的锦标赛

6.) 组装多对多

7.) 返回给客户

对这种方法的想法?非常感谢您的阅读以及您可以提供的任何建议。

-丹麦人

4

2 回答 2

2

GeoModel是我发现的最好的。您可以查看我的 GAE应用程序如何返回地理空间查询。例如,印度 http 查询是使用 geomodel 库的可选 cc(国家代码)lat=20.2095231&lon=79.560344&cc=IN

于 2010-03-28T21:48:47.803 回答
1

您可能对 感兴趣geohash,它使您能够执行如下的不等式查询:

从 myMarkers 中选择纬度、经度、标题 geohash >= :sw_geohash AND geohash <= :ne_geohash

查看本月 Google App Engine App Engine 社区更新博客文章中精选的这篇精彩文章。

作为对您提出的设计的说明,不要忘记 Memcache 中的实体不能保证保留在内存中,并且您不能让它们“按日期排序”。

于 2010-03-29T12:29:08.183 回答