我建立一个目录上找到GAE运动比赛用的web2py和一个Flex前端。 用户选择一个位置,半径,并从一组选择的最大日期。 我有这样的查询执行的基本版本,但它是低效的和缓慢的。 我知道我可以改进的一种方式是通过冷凝我使用组装物体进入批量查询许多单独的查询。 我刚刚得知是可能的。 但我也想利用内存缓存更广泛的重新设计。
主要的问题是,我无法通过位置查询数据存储区,因为GAE将不允许多个数值比较语句(<,<=,> =,>)在一个查询。 我已经使用一个日期,而我需要两个检查经度和纬度,所以这是一个没有去。 目前,我的算法是这样的:
1。)按照日期和选择查询
2。)从geopy的距离模块使用目的地函数来找到最大和最小纬度和经度为供给的距离
3.)循环通过的结果,并删除所有与最大/最小外纬度/经度
4.)通过再次和使用距离函数循环来检查精确的距离,因为步骤2将包括半径之外一些区域。 除去供给距离之外的结果(这是2/3/4组合inefficent?)
5.)组装多对许多列表和附加到对象(这是在我需要切换到批量操作)
6.)返回到客户端
这是我使用的memcache计划..让我知道,如果我在左外野的出路这是我与一般的内存缓存或服务器缓存没有现成的经验。
- 保持在充满代表我的所有数据“地理对象”缓存列表。 其中有5个属性:纬度,经度,EVENT_ID,EVENT_TYPE(扩大超出了比赛的预期),和起始日期。 这份名单按日期排序。
- 也保持指针的字典中,表示在缓存中的起点和终点指标为所有的日期范围缓存我的应用程序使用(下一个周,2周,月,3个月,6个月,年,2年)。
- 具备一个计划任务,在凌晨零点更新指针。
- 添加新的插入到缓存以及数据存储; 更新指针。
采用这种设计,算法现在看起来像:
1)使用指针来切掉根据提供的日期列表的适当块。
2-4。)同上的算法,除了与地理对象
5.)使用批量操作用剩余的地理对象的event_ids以选择完整比赛
6.)组装多到manys
7)返回到客户端
这种方法的思考? 非常感谢阅读,你可以给任何意见。
-Dane