【发布时间】:2013-11-29 18:02:11
【问题描述】:
我正在编写一个使用远程 API 的应用程序,该 API 提供相当静态的数据(但仍然可以每天更新几次)。问题是 API 很慢,无论如何我更愿意将这些数据导入我自己的数据存储区,这样我也可以实际查询数据。
问题是结果包含大约 700 条记录,需要每 5 小时左右同步一次。这包括添加新记录、更新旧记录和删除旧记录。
我有一个可行的简单解决方案——但它像糖蜜一样慢,并且在超时之前使用了 30,000 次数据存储读取操作(在大约 500 条记录之后)。
最糟糕的是,这 700 条记录是针对单个客户的,而我这样做是为了测试。实际上,我希望为成百上千的具有相似记录数量的客户做同样的事情......你可以看到它是如何扩展的。
这是我的实体类定义:
class Group(ndb.Model):
groupid = ndb.StringProperty(required=True)
name = ndb.StringProperty(required=True)
date_created = ndb.DateTimeProperty(required=True, auto_now_add=True)
last_updated = ndb.DateTimeProperty(required=True, auto_now=True)
这是我的同步代码(Python):
currentTime = datetime.now()
groups = get_list_of_groups_from_api(clientid) #[{'groupname':'Group Name','id':'12341235'}, ...]
for group in groups:
groupid = group["id"]
groupObj = Group.get_or_insert(groupid, groupid=group["id"], name=group["name"])
groupObj.put()
staleGroups = Group.query(Group.last_updated < currentTime)
for staleGroup in staleGroups:
staleGroup.delete()
【问题讨论】:
-
您能否详细说明一下,为什么每个客户端大约需要 30,000 次读取?当只需要处理大约 700 个实体时。
-
我不知道为什么它使用 30,000 次读取操作。这是我的问题的一部分。我更希望它尽可能少。我不是故意进行 30,000 次读取操作——这是我以某种方式实现的结果:/
-
能否提供 get_list_of_groups_from_api() 代码?我怀疑你想修改它以返回更少的组......
-
它所做的只是返回一个列表中约 700 个组项的列表(这看起来像我在该行末尾的评论)。该函数对数据存储没有任何作用——只是对 json 端点的简单 Web 请求。该函数只需要 5 秒即可返回。所以在超时之前剩余的 55 秒完全是由于函数调用下面的代码中的内容。
-
你说的 remote api 是什么意思?针对远程 api `/_ah/remote_api' 运行的代码可以运行数天,因此您不会超时。
标签: python google-app-engine optimization google-cloud-datastore app-engine-ndb