编程语言
首页 > 编程语言> > python-确定数据集中是否存在一组键的最佳方法

python-确定数据集中是否存在一组键的最佳方法

作者:互联网

我已经预先计算了几百个相同模型的密钥:

candidate_keys = [db.Key(...), db.Key(...), db.Key(...), ...]

其中一些键引用数据存储中的实际实体,而有些则不.我想确定哪些键确实对应于实体.

不必知道实体中的数据,只需知道它们是否存在即可.

一种解决方案是使用db.get():

keys_with_entities = set()
for entity in db.get(candidate_keys):
  if entity:
    keys_with_entities.add(entity.key())

但是,此过程将从存储中获取所有实体数据,这是不必要且昂贵的.

第二个想法是对key_name使用带有IN过滤器的查询,以30个块为单位手动获取以符合IN伪过滤器的要求.但是,IN过滤器不允许仅键查询.

有没有更好的办法?

解决方法:

App Engine数据存储区不直接支持IN过滤器;它们是在客户端库中实现的一种便利.包含30个值的IN查询将转换为每个值对应30个相等查询,从而产生30个常规查询!

由于往返时间以及什至仅键查询的开销,我怀疑您会发现,仅尝试一次批量获取所有实体是最有效的.但是,如果实体很大,则可以进行进一步的优化:对于插入的每个实体,请插入一个空的“存在”实体作为该实体的子代,并在查询中使用它.例如:

foo = AnEntity(...)
foo.put()
presence = PresenceEntity(key_name='x', parent=foo)
presence.put()
...
def exists(keys):
  test_keys = [db.Key.from_path('PresenceEntity', 'x', parent=x) for x in keys)
  return [x is not None for x in db.get(test_keys)]

标签:google-app-engine,google-cloud-datastore,python
来源: https://codeday.me/bug/20191210/2101745.html