【发布时间】:2015-08-17 06:29:07
【问题描述】:
以前的人在我们的 Google App Engine 应用程序中制造了一些问题。目前,该应用正在使用 NULL 值保存实体,但如果我们可以清理所有这些值会更好。
这里是 ndb.Modal:
class Day(ndb.Model):
date = ndb.DateProperty(required=True, indexed=True)
items = ndb.StringProperty(repeated=True, indexed=False)
reason = ndb.StringProperty(name="cancelled", indexed=False)
is_hole = ndb.ComputedProperty(lambda s: not bool(s.items or s.reason))
不知何故,我们需要删除所有Days,其中is_hole 是true。
大约有 4 000 000 个实体,其中应该在服务器上删除大约 2 000 000 个。
到目前为止的代码
我认为最好先用这段代码计算我们应该删除多少实体:
count = Day.query(Day.is_hole != False).count(10000)
这(限制为 10 000)大约需要 5 秒才能运行。没有限制,它会变成DeadLineException。
为了删除,我试过这个代码:
ndb.delete_multi([key for key in Day.query(Day.is_hole != False).fetch(10000, keys_only=True)])
这(有限制)大约需要 30 秒。
问题
我怎样才能更快删除所有Day where is_hole != False?
(我们使用的是 Python)
【问题讨论】:
-
如果您不介意它运行更长时间,您可以通过 remote_api 和基于您已有的游标来完成。这样它就可以随心所欲地运行,只需确保每次往返都使用可以在 60 秒内完成的批量大小。
标签: google-app-engine google-cloud-datastore app-engine-ndb