GAE: Лучший способ определить, сколько из Вида хранится?

Что состоит в том, чтобы определить лучший способ, сколько моделей определенного вида находится в хранилище данных моего приложения? В документации говорится это MyKind.all().count() только незначительно лучше, чем получение всех данных и имеет предел 1 000. Это не полезно, потому что я ожидаю иметь 6000 + экземпляры MyKind сохраненный.

Существует ли лучший способ сделать это? Что, если я просто получаю ключи и считаю их?

Я использую Python.

5
задан Nick Heiner 12 July 2010 в 01:57
поделиться

4 ответа

Если приблизительный подсчет достаточно хорош, вы можете использовать API статистики:

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

5
ответ дан 13 December 2019 в 19:20
поделиться

Если вы используете только ключи, это должно быть довольно быстро, так как при этом нужно только читать индекс и фактически не извлекать никаких сущностей. Используйте курсор и цикл, пока count () не вернет меньше 1000.

3
ответ дан 13 December 2019 в 19:20
поделиться

На этот вопрос SO есть ответ (от @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 , будет использовать гораздо меньше запросов. (Обязательно используйте сегментированный счетчик или другие формы эффективных счетчиков , как объясняет поклонник App Engine!).

Денормализация - это факт жизни нереляционных БД, и при правильном выполнении может огромная разница в вашей производительности. Что касается беспокойства, которое вы выражаете по поводу DRY, просто используйте методы класса или другие формы функций для выполнения всех операций вставки и удаления ваших сущностей (например, [[за исключением рассматриваемых методов класса]], никогда не вызывают методы, такие как .put () , непосредственно на объектах, вместо этого вызывайте соответствующие методы класса!), и эти функции будут очевидным местом для поддержания денормализованных счетчиков в актуальном состоянии!

2
ответ дан 13 December 2019 в 19:20
поделиться

Храните объект счетчика для вашего приложения в базе данных и обновляйте его всякий раз, когда создаете и удаляете объекты.

1
ответ дан 13 December 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: