Я использую 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))
Спасибо за помощь заранее, я застрял на этом какое-то время!
У вас не должно быть сразу 5000 пользователей в памяти. Только извлеките тот, который вам нужен.
Вы также можете проверить производительность проекта appheng https://github.com/ocanbascil/PerformanceEngine
Для такого размера данных, почему бы не использовать blobstore и memcache?
С точки зрения производительности (от наивысшего до самого низкого):
Просмотрите видеоролики Google IO с этого года, есть отличная возможность использовать blobstore для такого рода вещей. Для некоторых случаев использования существует значительная производительность (и стоимость), связанная с БД.
(для педантичных читателей показатели чтения последних трех будут практически одинаковыми, но есть существенные различия в времени записи/стоимости)