盖伊:最好的方法来确定有多少种是存储?

2024-09-29 21:42:30 发布

您现在位置:Python中文网/ 问答频道 /正文

确定我的应用程序数据存储中有多少种特定型号的最佳方法是什么?文档说MyKind.all().count()只比检索所有数据稍微好一点,限制为1000。这没有什么帮助,因为我希望存储6000多个MyKind实例。你知道吗

有没有更好的办法?如果我拿到钥匙,数一数呢?你知道吗

我在用Python。你知道吗


Tags: 数据实例方法文档应用程序countall钥匙
3条回答

如果近似计数足够好,可以使用统计API:

http://code.google.com/appengine/docs/python/datastore/stats.html

如果只执行键,那么应该非常快,因为这只需要读取索引,实际上并不获取任何实体。使用游标和循环,直到count()返回的值小于1000。你知道吗

This SO question有一个答案(通过@jgeewax)几乎是正确的(错误的退出条件,正如我在这里所评论的)。这是一个固定的…:

class MyModel(db.Expando):
    @classmethod
    def count_all(cls):
        """
        Count *all* of the rows (without maxing out at 1000)
        """
        count = 0
        query = cls.all().order('__key__')

        while True:
            current_count = query.count()
            if current_count == 0: return count
            count += current_count

            if current_count == 1000:
                last_key = query.fetch(1, 999)[0].key()
                query = query.filter('__key__ > ', last_key)

        return count

当然,性能问题在于,这将使用一个对数据存储的实际查询来表示每1000个条目——通过保持一个实际计数来反规范化事物,正如@Chris所建议的,这将使用更少的查询。(请务必使用sharded counter或其他形式的efficient counters作为appengine Fan的解释!)。你知道吗

使用非关系数据库时,反规范化是一个事实,如果操作得当,会对您的性能产生巨大的影响。至于您对DRY表示的担忧,只需使用类方法或其他形式的函数来执行实体的所有put和remove(即,[[除了有问题的类方法之外]],从不直接调用实体上的.put()等方法,而是调用相应的类方法!),这些函数将是保持非规范化计数器最新的明显位置!你知道吗

相关问题 更多 >

    热门问题