Загрузка ссылочной модели в Google App Engine

В Python, скажем, у меня есть модель класса A, которая имеет ReferenceProperty b для моделирования класса B, у которого есть ReferenceProperty c для моделирования класса C.

Предполагая, что экземпляр A уже существует в хранилище данных, я могу получить его, сказав:

q = A.all()
a = q.get()

Как в этом сценарии работает загрузка объекта? Извлекается ли a.b, когда извлекается a? Извлекается ли a.b.c, когда извлекается a.b? b и c извлекаются только при первом обращении к ним? Если бы я сохранил a в кэше памяти, были бы ли также сохранены b и c? Если нет, когда они будут извлечены, когда я a вернусь из кэша памяти?

Причина, по которой я задаю эти вопросы (помимо любопытства), заключается в том, что у меня есть объект, который я хотел бы сохранить в кэше памяти, но он связан с другим объектом (который ссылается на другой объект и т. Д.), А общий размер связанные объекты могут быть больше 1 МБ.

Спасибо!


person Cameron    schedule 24.02.2010    source источник


Ответы (2)


При первом доступе к моделям будет разыменовано. Таким образом, при вызове a.b будет получено b, а при вызове a.b.c - c.

Загляните в блог Ника Джонсона, чтобы получить несколько советов о моделях memcahing: http://blog.notdot.net/2009/9/Efficient-model-memcaching

person Robert Kluin    schedule 24.02.2010
comment
Вот дополнительное обсуждение pickle vs proto_buf: groups.google. com / group / google-appengine / browse_thread / thread / - person Robert Kluin; 25.02.2010
comment
Ах да, я слышал про рассол против пб. Интересно, насколько быстро можно мариновать простую нить? - person Cameron; 25.02.2010
comment
В моих тестах травление строки значительно (в 10 раз) быстрее, чем травление очень простого экземпляра модели. - person Robert Kluin; 25.02.2010

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

person Adam Crossland    schedule 24.02.2010