我正在寻找一种获取数据库大小的方法。现在,我在我的数据存储模型中有一个名为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(...)
,但我不确定。
有什么想法吗?
感谢。
答案 0 :(得分:4)
实时汇总数据并使用Memcache。
我过去所做的是创建一个QuotaManagementService
,当我创建或销毁某些资源时,我会调用它。
在每次插入/删除操作时,您都会递增/递减该资源的计数。
使用GAE的一个简单方法是使用MemcacheService,它甚至可以使用inc()/dec()
方法来操作计数。您也可以执行此异步操作,以便它不会影响延迟。
由于Memcache只是一个内存缓存,你只需要persist the information some how。您可能希望定期将值存储在数据存储区中,也可以从后台任务中存储。或者,您可以在更新应用程序时重新创建它。
您还可以将创建/删除事件添加到Google Analytics中,这样您就可以转到信息中心,查看已拨打了多少其他详细信息,您也不必为此编写大量代码。< / p>
您可以创建一个Decorator
来自动inc/dec
计数,甚至不用代码管理它。
Memcache写入是免费的,所以我不认为如果频繁发生,我会将每个事件写入DataStore
计数器。
以下是使用DataStore
直接代替Memcache
high volume writes to a counter的示例代码。