有效地查找实体数量Google App Engine

时间:2014-08-04 15:56:14

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

我正在寻找一种获取数据库大小的方法。现在,我在我的数据存储模型中有一个名为query_all的类方法,它正是这样做的:它查询该模型的所有实体并返回它们。

在我的代码中,我这样称呼:

query = MyModel.query_all(ndb.Key('MyModel', '*defaultMyModel'))
count = query.count()
return 'Database size: {}'.format(count)

现在这样可行,但由于我的数据库非常大(它有大约10,000个实体),每次我调用它都会占用我的数据存储小操作配额的20%(我每天可以做0.05万次操作)。 / p>

有没有办法让我更有效地做到这一点?我认为导致问题的.count()而不是query_all(...),但我不确定。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:4)

请勿使用数据存储区进行报告:

实时汇总数据并使用Memcache

当我想跟踪某些消耗品资源时:

我过去所做的是创建一个QuotaManagementService,当我创建或销毁某些资源时,我会调用它。

在每次插入/删除操作时,您都会递增/递减该资源的计数。

使用GAE的一个简单方法是使用MemcacheService,它甚至可以使用inc()/dec()方法来操作计数。您也可以执行此异步操作,以便它不会影响延迟。

由于Memcache只是一个内存缓存,你只需要persist the information some how。您可能希望定期将值存储在数据存储区中,也可以从后台任务中存储。或者,您可以在更新应用程序时重新创建它。

Google Analytics

您还可以将创建/删除事件添加到Google Analytics中,这样您就可以转到信息中心,查看已拨打了多少其他详细信息,您也不必为此编写大量代码。< / p>

无论哪种方式,这都可以通过Python

非常透明

您可以创建一个Decorator来自动inc/dec计数,甚至不用代码管理它。

Memcache写入是免费的,所以我不认为如果频繁发生,我会将每个事件写入DataStore计数器。

以下是使用DataStore直接代替Memcache high volume writes to a counter的示例代码。