在Google App Engine中为内存存储300MB的解决方案

时间:2011-06-30 20:32:02

标签: python google-app-engine memcached google-cloud-datastore

我在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))

感谢您的帮助,我已经坚持了一段时间!!

3 个答案:

答案 0 :(得分:2)

您不应该同时在内存中拥有所有5000个用户。只检索你需要的那个。

答案 1 :(得分:0)

对于这个数据大小,为什么不使用blobstore和memcache?

在表现方面(从最高到最低):

  • 本地实例内存(您的数据集太大)
  • memcache(将你的数据分成几个键,你应该没事,而且速度非常快!)
  • blobstore + memcache(坚持到blobstore而不是DB)
  • db + memcache(持久化到db)

查看今年的Google IO视频,有一个很棒的使用blobstore来完成这类事情。对于某些用例,DB存在显着的性能(和成本)损失。

(对于迂腐的读者来说,最后三个读取性能实际上是相同的,但写入时间/成本存在显着差异)

答案 2 :(得分:0)

您还可以检查项目性能appengine https://github.com/ocanbascil/PerformanceEngine