【发布时间】:2014-12-22 21:00:31
【问题描述】:
这是我目前的方法:
def delete_up_to_10000(query):
for i in range(10):
keys = query.fetch(1000, keys_only=True, deadline=40, batch_size=1000)
ndb.delete_multi(keys)
我的问题是,是否可以在不实际获取键的情况下删除查询结果?这不应该是可能的吗?
以下是围绕我当前解决方案的几个决策点:
- 我决定一次不超过 1000 个以减少内存使用量。
- 我在各种 CRON 任务中每分钟调用此方法几次。
- 根据数据的年龄和数据类型,我对可以安全删除的数据进行了某些查询 - 我目前有数十亿个实体。
- 我希望几年后,数据的清除速度仍会比写入数据存储区的速度更快 - 因此将删除速度设置为当前写入速度的 100 倍左右。李>
【问题讨论】:
-
keys only 查询的结果是keys。
-
是的 - 但对我来说似乎仍然需要向 megastore / bigtable 询问密钥列表,然后告诉 megastore / bigtable 删除这些项目 - 似乎我可以节省一些网络告诉 megastore / bigtable 删除它从查询中找到的任何内容,而不是报告回来
-
考虑在每次循环中使用
delete_multi_async- 将所有生成的Futures保存在一个列表中,并在循环之后将Future.wait_all保存在它们上(如果你甚至需要它!-)。它应该会提高您的吞吐量。 -
谢谢@AlexMartelli 我已经切换到 fetch_page 虽然我可以使用 _async 版本 - 我认为同步版本的吞吐量应该没问题。我已将我当前的解决方案放在下面的答案中。
标签: python google-app-engine google-cloud-datastore app-engine-ndb