Решение для хранения 300 МБ в памяти для Google App Engine - PullRequest
1 голос
/ 01 июля 2011

Я использую Google App Engine в Python.У меня есть 5000 человек в моей базе данных.Весь список объектов на 5000 человек занимает 300 МБ памяти.

Я пытался сохранить это в памяти, используя blobcache, модуль, написанный [здесь] [1].

Ясталкиваюсь с проблемами OutOfMemory и ищу решение, которое включает в себя сохранение этих 5000 объектов в базу данных и последующее извлечение их всех сразу.

Моя личная модель выглядит следующим образом.

class PersonDB(db.Model):
    serialized = db.BlobProperty()
    pid = db.StringProperty()

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

class Person():
    def __init__(self, sex, mrn, age):
       self.sex = sex;
       self.age = age; #exact age
       self.record_number = mrn;
       self.locations = [];

    def makeAgeGroup(self, ageStr):
       ageG = ageStr
       return int(ageG)

    def addLocation(self, healthdistrict):
        self.locations.append(healthdistrict) 

Когда я сохраняю все 5000 человек одновременно в своей базе данных, я получаю ошибку Server 500.Кто-нибудь знает почему?Мой код для этого выглядит следующим образом:

   #People is my list of 5000 people objects
def write_people(self, people):
    for person in people:
        personDB = PersonDB()
        personDB.serialized = pickle.dumps(person)
        personDB.pid = person.record_number
        personDB.put()

Как мне получить все 5000 этих объектов одновременно в моем методе App Engine?

Моя идея состоит в том, чтобы сделать что-то подобное

def get_patients(self):
    #Get my list of 5000 people back from the database
    people_from_db = db.GqlQuery("SELECT * FROM PersonDB")
    people = []
    for person in people_from_db:
        people.append(pickle.loads(person.serialized))

Спасибо за помощь заранее, я застрял на этом некоторое время !!

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

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

0 голосов
/ 08 июля 2011

Вы также проверите приложение производительности проекта https://github.com/ocanbascil/PerformanceEngine

0 голосов
/ 03 июля 2011

Для данных такого размера, почему бы не использовать blobstore и memcache?

С точки зрения производительности (от наивысшего к низшему):

  • локальная память экземпляра (ваш набор данныхслишком большой)
  • memcache (разделите ваши данные на несколько ключей, и все будет в порядке, и это очень быстро!)
  • blobstore + memcache (сохраняется в хранилище blobs, а не в DB)
  • db + memcache (сохраняются в db)

Посмотрите видео Google IO этого года, есть отличный способ использовать хранилище BLOB-объектов именно для такого рода вещей.В некоторых случаях используется значительное снижение производительности (и стоимости), связанное с БД.

(для педантичных ридеров производительность чтения последних трех будет практически одинаковой, но существуют значительные различия ввремя записи / стоимость)

...