我在Python中使用Google App Engine。我的数据库中有5000人。整个5000人对象列表占用300 MB内存。
我一直在尝试使用blobcache将这个存储在内存中,这是一个[这里] [1]编写的模块。
我遇到了pickle“OutOfMemory”问题,我正在寻找一个解决方案,包括将这5000个对象存储到数据库中,然后一次性检索它们。
我的模特看起来像这样。
class PersonDB(db.Model):
serialized = db.BlobProperty()
pid = db.StringProperty()
每个人都是一个具有许多属性和方法的对象,因此我决定挑选每个人对象并将其存储为序列化字段。 pid只允许我通过他们的id查询这个人。我的人看起来像这样
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()
如何在App Engine方法中一次检索所有5000个这些对象?
我的想法是做这样的事情
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 :(得分:2)
您不应该同时在内存中拥有所有5000个用户。只检索你需要的那个。
答案 1 :(得分:0)
对于这个数据大小,为什么不使用blobstore和memcache?
在表现方面(从最高到最低):
查看今年的Google IO视频,有一个很棒的使用blobstore来完成这类事情。对于某些用例,DB存在显着的性能(和成本)损失。
(对于迂腐的读者来说,最后三个读取性能实际上是相同的,但写入时间/成本存在显着差异)
答案 2 :(得分:0)
您还可以检查项目性能appengine https://github.com/ocanbascil/PerformanceEngine