2015-02-25 2 views
1

Я пытаюсь понять, как встроенные индексы работают в AppEngine. В документации говорится, что передача «indexed = False» в конструктор прекращает индексирование свойства, но это, похоже, не так.AppEngine - ndb - Неиндексированные свойства не работают?

У меня есть следующий код:

import webapp2 
from google.appengine.ext import ndb 

class IndexedClass(ndb.Model): 
    prop1 = ndb.IntegerProperty(indexed=True) 
    prop2 = ndb.StringProperty(indexed=True) 

class UnindexedClass(ndb.Model): 
    prop1 = ndb.IntegerProperty(indexed=False) 
    prop2 = ndb.StringProperty(indexed=False) 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     for i in range(10): 
      IndexedClass(
       prop1=i, 
       prop2="Item %s" % i 
      ).put() 
      UnindexedClass(
       prop1=i, 
       prop2="Item %s" % i 
      ).put() 

app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True) 

Если выполнить его в Гаэль и создать статистику вы получите это: enter image description here

Он сообщает те же встроенные индексы для обоего индексируемых и неиндексированных классов.

Буду очень признателен, если кто-нибудь может указать мне, что я делаю неправильно.

Аналогичное приложение развертывается на AppEngine имеет более неиндексированные свойства в модели, и here are the stats объявлен как это: -

aProperty = ndb.KeyProperty(kind='Geography', indexed=False) 

Как вы можете видеть, что мы имеем над 2M объектов с помощью 947Mb. У нас есть 40M-индексы с использованием 5Gb данных. Эти нежелательные встроенные индексы занимают в 5 раз больше места, чем сами объекты. Таким образом, мы платим в 5 раз больше за хранение, а в 10 раз больше за запись ops, чем указано в документации.

Спасибо заранее, Марк

+0

Вы не ** показываете нам индексы - вы нажали на «Datastore Viewer», ** не ** «Индексы хранилища данных». Пожалуйста, исправьте это и отредактируйте свой Q соответственно! –

+0

Это верно, мой вопрос связан со встроенными индексами. На изображении отображается автоматически созданная статистика хранилища данных. Посмотрите на столбцы 4 и 5 прилагаемого изображения. Нужно ли создавать встроенные индексы для неиндексированных свойств? Это очень важно при записи объектов в BULK по мере того, как операции записи резко возрастают. Благодарю. – marc

ответ

1

неиндексированных свойства определенно делают свою работу на практике: они не будут зарегистрированы на индексных таблицах, таким образом, вы не будете иметь возможности использовать их в проекционных запросах, ни фильтрах.

Однако вы не задумываетесь о статистике. Картина, которую вы показали там, заставила меня по-настоящему заинтриговать. Вдаваясь в мужество SDK, есть класс DatastoreStatsProcessor, который, похоже, отвечает за агрегирование результатов, которые вы видите при запуске a stats update. В методе __AgreggateTotal кажется, что он не делает никакого различия между индексированными и неиндексированными свойствами: в методе __GetPropertyIndexStat он всегда возвращает 2 для каждого свойства, что объясняет результаты, которые вы получаете после генерации статистики.

После того, как ваш проект будет развернут, стоит проверить, что вы видите Google Dev Console. Storage-> Datastore-> Панель управления. Постыдно, у меня нет какого-либо развернутого проекта, работающего с неиндексированными (или свойствами Blob или Text). Как насчет вас?

+0

Спасибо, Хосе. Согласен. Ваше первое утверждение верно. Это поведение, которое у меня есть. Проблема заключается в встроенных индексах, генерируемых для неиндексированных свойств. Я опубликовал реальный пример в вопросе, показывающем ту же самую проблему. Есть идеи? Это лишняя стоимость, которая мне не нужна. – marc

+0

Да, точно такая же проблема, с которой я столкнулся даже для 'TextProperty', и она пытается индексировать ее, из-за которой при хранении длинной строки я получаю' Значение свойства {{имя_поля} "длиннее 1048487 байт. их документация не должна произойти. –

Смежные вопросы