代码之家  ›  专栏  ›  技术社区  ›  systempuntoout

googleappengine:光标与偏移

  •  20
  • systempuntoout  · 技术社区  · 14 年前

    1.光标

    q = Person.all()
    last_cursor = memcache.get('person_cursor')
    if last_cursor:
        q.with_cursor(last_cursor)
    people = q.fetch(100)
    cursor = q.cursor()
    memcache.set('person_cursor', cursor)
    

    2.抵销

    q = Person.all()
    offset = memcache.get('offset')
    if not offset:
       offset = 0
    people = q.fetch(100, offset = offset)
    memcache.set('offset', offset + 100)
    

    阅读 Google documentation 开销 查询偏移量。

    1 回复  |  直到 14 年前
        1
  •  31
  •   Alex Martelli    14 年前

    虽然很难精确可靠地测量,但如果在返回足够大的一组Person实体时,光标没有在offset方法周围运行环,我会感到惊讶。作为 the docs 说得很清楚很明确,

    数据存储获取偏移量+限制 应用程序的结果。第一个 偏移结果不会被 数据存储本身。

    fetch()方法跳过第一个 偏移结果,然后返回其余结果 (限制结果)。

    查询具有性能 对应的特征 与偏移量加成线性关系 极限。

    O(偏移+限制) 是使用偏移量获取的big-O性能。如果总的来说(比如在多个计划任务上),您要获取一百万个项目,一次获取1000个项目,当您获取最后1000个项目(偏移量为999000)时,数据存储会这样做 跳过前99.9万个(即使fetch不返回它们),因此对性能的影响将是惊人的。

    O(极限) ,只要偏移量足够大,经过的时间就应该比使用偏移量获得的时间任意好。