【问题标题】:How to best design a date/geographic proximity query on GAE?如何在 GAE 上最好地设计日期/地理邻近查询?
【发布时间】:2010-03-26 18:28:42
【问题描述】:

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

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

1.) 按日期查询并选择

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

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

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

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

6.) 返回客户端

这是我使用 memcache 的计划。如果我在左边,请告诉我 对此字段,因为我之前没有使用内存缓存或服务器的经验 一般缓存。

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

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

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

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

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

1.) 使用指针根据 提供日期。

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

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

6.) 组装多对多

7.) 返回客户端

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

-丹麦人

【问题讨论】:

    标签: python google-app-engine caching google-cloud-datastore web2py


    【解决方案1】:

    GeoModel 是我找到的最好的。你可以看看我的 GAE app 如何返回地理空间查询。例如,印度 http 查询带有可选的 cc(国家代码),使用地理模型库 lat=20.2095231&lon=79.560344&cc=IN

    【讨论】:

    • 谢谢拉尔森。我也会研究 GeoModel 以获得指导。
    【解决方案2】:

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

    选择纬度、经度、标题 FROM myMarkers WHERE geohash >= :sw_geohash AND geohash

    查看本月 Google App Engine App Engine Community Update 博客文章中精选的 this fine article

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

    【讨论】:

    • 太好了,我会检查 geohash。看起来正是我需要的。也很高兴知道有关 memcache 的信息。知道为什么不能对它们进行排序吗?我希望 memcache 实体能够保存基本的数据结构,如列表,可以排序,但我猜它没那么简单。
    • 关于 memcache[1]:“一般来说,应用程序不应期望缓存值始终可用。” -- 如果您存储列表的pickle 版本,那么存储在这个memcache 实例中的内容将被排序。但是您不能像处理数据存储查询那样对各种 memcache 实体进行“排序”。但是,您可以为您的 memcache 实体命名以帮助您检索它们。不知道这对你的计划是否有帮助。 [1]:code.google.com/intl/fr/appengine/docs/python/memcache/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多