JDO в GoogleAppEngine: как эффективно извлечь подмножество полей из огромного количества записей - PullRequest
0 голосов
/ 15 сентября 2011

Я столкнулся с небольшой проблемой масштабируемости. Я использую JDO для запроса моего хранилища данных. Мне нужно получить все ключи данного объекта (такие ключи имеют тип Long). Учитывая, что в моем хранилище данных такая сущность имеет 1.000.000 записей, мне нужно получить их очень эффективным способом, чтобы зациклить этот набор в фоновой задаче.

Какой самый эффективный способ сделать это?

А что если мне понадобится не только ключ, но и другое поле? Допустим, у меня есть объект с именем TPImage:

    Long idPic; //this is my key
    String title; //this is the field I want to retrieve together with the key
    ... // other properties

Как я могу получить idPic и заголовок в одном эффективном запросе?

Что-то вроде

    Query q = new Query("select idPic, title from " + TPImage.class.getName());

но эффективнее?

Большое спасибо!

Bye cghersi

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Проблема масштабирования в том, что вам нужны все ключи, а не то, что вы не можете получить их достаточно эффективно.Независимо от того, какую систему вы используете, это всегда будет как минимум O (n).

Вместо того, чтобы пытаться предварительно выбирать все, вы должны выполнять свою работу в пакетном режиме и использовать курсоры для эффективного получения следующего набора результатов.

Если вам нужно поле из модели, вы должны извлечь весь экземпляр модели - они хранятся в виде сериализованных больших двоичных объектов, поэтому нет способа извлечь только одно поле.

0 голосов
/ 16 сентября 2011

Ваш вопрос состоит из 2 частей.Для первой части, получающей только ключи, вы можете указать, что запрос должен возвращать ключи только при его создании, установив для параметра keys_only значение True.см. здесь: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

Это несколько поможет, поскольку вы не получаете всю сущность.Тем не менее, это, вероятно, не поможет вам достаточно, если вы хотите обработать 1 000 000 одновременно.В таком случае, воспользуйтесь советом Ника и прекратите работу.

...