Решение для хранения 300 МБ в памяти для Google App Engine

1

Я использую 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))

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

  • 0
    «Когда я храню все 5000 человек одновременно в своей базе данных, я получаю ошибку Server 500» - какую конкретную ошибку вы получаете?
  • 0
    Ошибка: ошибка сервера. Сервер обнаружил ошибку и не смог выполнить ваш запрос. Если проблема сохраняется, сообщите о своей проблеме и укажите это сообщение об ошибке и запрос, который ее вызвал.
Показать ещё 4 комментария
Теги:
google-app-engine
google-cloud-datastore
memcached

3 ответа

2

У вас не должно быть сразу 5000 пользователей в памяти. Только извлеките тот, который вам нужен.

0

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

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню