【问题标题】:GAE/P: Efficiently fetching large number of entities by keyGAE/P:通过键有效地获取大量实体
【发布时间】:2015-11-01 15:55:39
【问题描述】:

在应用引擎中,您可以像这样查询实体:

for x in MyEntity.query().iter():
    x.do_something()

当您执行此操作时,ndb 代码会负责高效地批量获取实体,以最大程度地减少到数据存储的往返次数。

在我的情况下,我想做同样有效的批处理,但我已经有一个键列表,所以我不妨使用它们来避免较慢的查询。我想这样做:

for x in iter_entities(key_list):
    x.do_something()

函数iter_entities() 将在我需要时分批获取实体。自己写这个并不难,但我可能做不到谷歌的伟大人物,如果我不需要,为什么要重新发明轮子!

有没有办法编写一个构建在 ndb 迭代器之上的函数 iter_entities()

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    如果您使用异步 tasklet 进行个人实体处理,则 NDB 将负责批量获取,这样的事情应该可以工作:

    @ndb.tasklet
    def do_something(key):
      x = yield key.get_async()
      x.do_something()
    
    futs = []
    for key in key_list:
      futs.append(do_something(key))
    
    ndb.Future.wait_all(futs)
    

    【讨论】:

    • 谢谢,看起来很完美。自动批处理很棒。在我的do_something() 中,我将使用taskqueue.Queue().add() 对任务进行排队。你知道自动批处理器是否也可以批处理这些?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多