Python 根据数据存储筛选大型数据集的最佳方法
我目前正在实现一个web服务,提供游戏的社交功能。这个游戏的一个特点是能够管理朋友列表。用户可以添加的好友取决于他在自己选择的外部社交网络(目前为Facebook或Twitter)上的联系人 系统的当前行为如下所示:Python 根据数据存储筛选大型数据集的最佳方法,python,google-app-engine,Python,Google App Engine,我目前正在实现一个web服务,提供游戏的社交功能。这个游戏的一个特点是能够管理朋友列表。用户可以添加的好友取决于他在自己选择的外部社交网络(目前为Facebook或Twitter)上的联系人 系统的当前行为如下所示: 客户端应用程序使用社交网络(Facebook或Twitter)API检索玩家的联系人列表 每个联系人都有一个唯一的标识符(即,他来自的社交网络及其在此社交网络上的标识符,例如“Tw12345”) 客户端将所有这些标识符的列表发送到GAE上托管的游戏web服务 web服务检查每个标
- 客户端应用程序使用社交网络(Facebook或Twitter)API检索玩家的联系人列表
- 每个联系人都有一个唯一的标识符(即,他来自的社交网络及其在此社交网络上的标识符,例如“Tw12345”)
- 客户端将所有这些标识符的列表发送到GAE上托管的游戏web服务
- web服务检查每个标识符是否有与其自己的数据库中匹配的用户
- 它返回一个标识符列表,过滤后只包含那些在游戏数据库中也有匹配项的标识符
如果你们中有人有过这种与电视机有关的麻烦的经历,我会很高兴听到的!谢谢 我认为它非常慢,因为您正在为正在查找的每个用户进行查询。使用好键名可以避免这样做 对于数据库中的每个用户,插入其密钥名称设置为社交网络唯一标识符的实体。这些实体可以是您正在使用的相同实体,也可以是为此目的创建的新“索引”实体
当发送标识符列表时,只需对该实体的所有键名执行批量获取操作,以确定它们是否存在-例如,通过执行
MyKind.get\u by\u key\u name(键名)
感谢您提出的有趣问题。如果我理解正确,你想知道哪些元素是两组的成员,即既是联系人又是玩家。如果这确实是您想要的,那么找到2个集合的公共元素应该是可行的。如果我没有弄错的话,您的Web服务可以将两个列表作为输入和输出,无论两个列表中的元素是什么。不过,我可能对需求有误解,如果您发布一些实际的编码工作,我们可能会为您提供更多帮助+1无论如何,对于一个我觉得真实而有趣的问题。不幸的是,我已经在使用基于密钥的访问。最大的问题是,因为我没有办法在一个查询中“分组”多个用户,所以我不得不对每个潜在用户执行一个查询。有了一个标准的推特账户,它可以达到非常高的水平。Mine会导致~300个datastore\u v3.Get
调用。@Tyn-Get不是查询,您可以对任意数量的记录执行一次批处理获取-使用带有列表的Get\u by\u key\u name
,或带有键列表的db.Get
。没有必要单独做。对!我不知道get\u by\u key\u name
可以获取密钥列表。这样做要好得多,但仍然非常慢,因为根据Appstats,它仍然在为列表中的每个项目生成一个数据存储。不过,谢谢@Tyn它会为列表中的每个实体组生成一个get
,但是它们都是并行执行的(应该由appstats显示),所以它应该非常快。我不确定它是否真的是并行执行的,它在appstats中看起来很奇怪,执行起来仍然需要很多时间(大约300个键需要3000毫秒)。下面是它的外观: