Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据数据存储筛选大型数据集的最佳方法_Python_Google App Engine - Fatal编程技术网

Python 根据数据存储筛选大型数据集的最佳方法

Python 根据数据存储筛选大型数据集的最佳方法,python,google-app-engine,Python,Google App Engine,我目前正在实现一个web服务,提供游戏的社交功能。这个游戏的一个特点是能够管理朋友列表。用户可以添加的好友取决于他在自己选择的外部社交网络(目前为Facebook或Twitter)上的联系人 系统的当前行为如下所示: 客户端应用程序使用社交网络(Facebook或Twitter)API检索玩家的联系人列表 每个联系人都有一个唯一的标识符(即,他来自的社交网络及其在此社交网络上的标识符,例如“Tw12345”) 客户端将所有这些标识符的列表发送到GAE上托管的游戏web服务 web服务检查每个标

我目前正在实现一个web服务,提供游戏的社交功能。这个游戏的一个特点是能够管理朋友列表。用户可以添加的好友取决于他在自己选择的外部社交网络(目前为Facebook或Twitter)上的联系人

系统的当前行为如下所示:

  • 客户端应用程序使用社交网络(Facebook或Twitter)API检索玩家的联系人列表
  • 每个联系人都有一个唯一的标识符(即,他来自的社交网络及其在此社交网络上的标识符,例如“Tw12345”)
  • 客户端将所有这些标识符的列表发送到GAE上托管的游戏web服务
  • web服务检查每个标识符是否有与其自己的数据库中匹配的用户
  • 它返回一个标识符列表,过滤后只包含那些在游戏数据库中也有匹配项的标识符
这显然不太好用,因为大多数用户的联系人列表都很大。服务器花费大量时间检查数据库,以筛选具有匹配游戏帐户的联系人

现在,我很难弄明白如何才能更有效地进行工作。由于标识符不遵循任何给定的顺序,因此我不能使用整数操作来选择数据库中的用户。另外,我不能依靠Twitter或Facebook来进行过滤,因为他们的API不支持这一点

我想到了一个系统,它使用某种memcached数据树来存储“已知”标识符列表(因为查询只需要知道有匹配的用户,而不需要知道到底是哪个用户匹配),但我担心一旦清除缓存,它就要花很长时间来建立


如果你们中有人有过这种与电视机有关的麻烦的经历,我会很高兴听到的!谢谢

我认为它非常慢,因为您正在为正在查找的每个用户进行查询。使用好键名可以避免这样做

对于数据库中的每个用户,插入其密钥名称设置为社交网络唯一标识符的实体。这些实体可以是您正在使用的相同实体,也可以是为此目的创建的新“索引”实体


当发送标识符列表时,只需对该实体的所有键名执行批量获取操作,以确定它们是否存在-例如,通过执行
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毫秒)。下面是它的外观: