Google App Engine ndb.delete_multi()效率如何?

时间:2014-08-04 20:19:15

标签: python python-2.7 google-app-engine google-cloud-datastore app-engine-ndb

我正在努力清理我的~100,000个实体的数据库,我的计划是将它放在一个使用ndb.delete_multi()一次删除200的任务中,然后再次递归调用自己,直到没有实体离开。

现在,我还没有递归,所以我可以手动运行几次代码并检查错误,配额使用等。代码是:

entities = MyModel.query_all(ndb.Key('MyModel', '*defaultMyModel')).fetch(200)
key_list = ndb.put_multi(entities)
ndb.delete_multi(key_list)

所有query_all()都会查询MyModel并返回所有内容。

我通过评论事物和运行方法做了一些测试,看起来前两行占用了预期的写入量(~200)。

运行第三行ndb.delete_multi(),占我每日写入额度50,000的约8%,因此大约有4000次写入 - 这是我认为应该做的次数的20倍。

我还确保key_list只包含200个带日志记录的密钥。

关于为什么会占用这么多写的任何想法?我使用的方法错了吗?或者只是使用了大量的内存?在这种情况下,有没有办法让我更有效地做到这一点?

感谢。

2 个答案:

答案 0 :(得分:4)

删除实体时,数据存储区必须从索引中为每个索引属性以及每个自定义索引删除实体和记录。写入次数与您使用的删除方法无关。

答案 1 :(得分:2)

您的代码示例效率极低。如果要删除大量实体,而不是需要批量处理,但是,您应该使用keys_only查询检索数据,然后删除:

from google.appengine.ext import ndb

ndb.delete_multi(
    MyModel.query().fetch(keys_only=True)
)

关于写操作的数量(请参阅Andrei的答案),请确保仅模型中需要编制索引的字段“启用索引”。