Нужен способ подсчета объектов в хранилище данных GAE, которые удовлетворяют определенному условию? (более 1000 субъектов) - PullRequest
4 голосов
/ 04 февраля 2010

Я создаю приложение на GAE, которое должно отчитываться о происходящих событиях. Событие имеет тип, и мне также нужно отчитываться по типу события.

Например, скажем, есть события A, B и C. Они происходят периодически в случайном порядке. Пользователь входит в систему и создает набор сущностей, к которым могут быть отнесены эти события. Когда пользователь возвращается, чтобы проверить состояние, мне нужно иметь возможность определить, сколько событий A, B и / или C произошло за определенный промежуток времени, скажем, за день или месяц.

Лимит 1000 - это то, как я обычно это делаю. Мне не нужно извлекать все сущности и представлять их пользователю, но мне нужно показать общее количество для определенного диапазона дат. Есть предложения?

Я немного питон / GAE Noob ...

Ответы [ 6 ]

7 голосов
/ 04 февраля 2010

App Engine не является реляционной базой данных, и вы не сможете быстро делать подсчеты на лету, как это. Наилучший подход - обновлять счетчики во время записи, а не генерировать их во время чтения.

При генерации счетчиков есть два основных подхода, которые хорошо масштабируются с App Engine для минимизации конфликтов при записи:

  1. Сохранять счет в Memcache или локальной памяти и периодически сбрасывать. Это самое простое решение, но оно может быть нестабильным, и возможна потеря данных.
  2. Используйте Sharded Counter . Этот подход немного более надежен, но более сложен. Вы не сможете легко сортировать по количеству, но вы также можете периодически периодически сбрасывать в другое индексированное поле счетчика и сортировать по нему.
3 голосов
/ 03 ноября 2010

Результаты запросов количества хранилищ данных () и смещения для всех запросов хранилища данных больше не ограничены 1000.

Начиная с версии 1.3.6

0 голосов
/ 11 июня 2014

Этот пост довольно старый, но я хотел бы предоставить полезную ссылку. App Engine теперь предлагает встроенный API для доступа к статистике хранилища данных:

Для Python,

from google.appengine.ext.db import stats

global_stat = stats.GlobalStat.all().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count

Для Java

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;

// ...
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity globalStat = datastore.prepare(new Query("__Stat_Total__")).asSingleEntity();
Long totalBytes = (Long) globalStat.getProperty("bytes");
Long totalEntities = (Long) globalStat.getProperty("count");

Также возможно фильтровать номера сущностей только для определенного вида. Взгляните на эту ссылку:

https://developers.google.com/appengine/docs/python/datastore/stats https://developers.google.com/appengine/docs/java/datastore/stats

0 голосов
/ 30 октября 2010

Подойдет ли вам решение с использованием курсоров (как показано ниже)? Я лично использую этот метод для подсчета количества записей в сценарии, аналогичном вашему, и еще не видел никаких проблем с ним (хотя я работаю по расписанию, так как постоянные запросы к хранилищу данных довольно сильно обременяют квоту процессора). ).

def count(query): 
  i = 0 
  while True: 
    result = query.fetch(1000) 
    i = i + len(result) 
    if len(result) < 1000: 
      break 
    cursor = query.cursor() 
    query.with_cursor(cursor) 
  return i 
0 голосов
/ 04 февраля 2010

Это звучит очень похоже на вопрос, который я задал на StackOverflow.

Как получить отличительное значение одной из моих моделей в Google App Engine Мне нужно было знать, как получить отличительные значения для сущностей в моих моделях, и для этого потребуется более 1000 эта модель.

Надеюсь, это поможет.

0 голосов
/ 04 февраля 2010

Мой подход заключается в том, чтобы иметь агрегатную модель или модели для отслеживания типов событий, дат и количества. Я не на 100% как вы должны смоделировать это с учетом ваших требований.

Затем я бы запускал отложенные задачи, чтобы асинхронно обновлять соответствующие агрегатные модели всякий раз, когда пользователь делает что-то, вызывающее событие.

Статья Ника Джонсона * Работа с фоном с отложенной библиотекой содержит гораздо больше информации и предоставляет платформу, которая может оказаться полезной для агрегации, о которой вы говорите.

...