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

Python 为Google App Engine存储300MB内存的解决方案,python,google-app-engine,memcached,google-cloud-datastore,Python,Google App Engine,Memcached,Google Cloud Datastore,我正在使用Python中的Google应用程序引擎。我的数据库里有5000人。5000人对象的整个列表占用300 MB的内存 我一直试图使用blobcache(一个[here][1]编写的模块)将其存储在内存中 我遇到了pickle“OutOfMemory”问题,正在寻找一种解决方案,将这5000个对象存储到一个数据库中,然后立即检索它们 我的个人模型是这样的 class PersonDB(db.Model): serialized = db.BlobProperty() pid

我正在使用Python中的Google应用程序引擎。我的数据库里有5000人。5000人对象的整个列表占用300 MB的内存

我一直试图使用blobcache(一个[here][1]编写的模块)将其存储在内存中

我遇到了pickle“OutOfMemory”问题,正在寻找一种解决方案,将这5000个对象存储到一个数据库中,然后立即检索它们

我的个人模型是这样的

class PersonDB(db.Model):
    serialized = db.BlobProperty()
    pid = db.StringProperty()
每个person都是一个具有许多属性和方法的对象,因此我决定对每个person对象进行pickle,并将其存储为序列化字段。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) 
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人同时存储到我的数据库中时,我得到一个服务器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()
如何在appengine方法中一次检索所有5000个对象

我的想法是这样做

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) 
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个用户。只检索您需要的数据。

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

在性能方面(从最高到最低):

  • 本地实例内存(您的数据集太大)
  • memcache(将数据划分为多个键,这样应该很好,而且速度非常快!)
  • blobstore+memcache(持久化到blobstore而不是DB)
  • db+memcache(持久化到db)
看看今年的谷歌IO视频,有一个关于使用blobstore来做这类事情的很棒的视频。对于某些用例,DB会带来显著的性能(和成本)损失


(对于学究式的读者来说,最后三个版本的读取性能实际上是相同的,但在写入时间/成本方面存在显著差异)

您还需要检查appengine的项目性能

“当我将所有5000人同时存储到我的数据库中时,我收到一个服务器500错误”-您收到的具体错误是什么?错误:服务器错误服务器遇到错误,无法完成您的请求。如果问题仍然存在,请报告您的问题,并说明此错误消息和导致此问题的查询。但是,当我查看应用程序的统计信息时,我可以看到有my PersonDB的实例。然而,我无法判断是否所有5000人都被添加到了我的数据库中。我该如何验证呢?我指的是日志中的错误——Python报告的错误、消息stacktrace等。为什么?为什么你认为你一次需要全部5000个内存?为什么您认为对对象进行pickle并保存它们是一个好主意,而不是使用GAE提供的非常好的工具(例如
db.Expando
)呢?为什么?为什么?