为googleappengin存储300MB内存的解决方案

2024-10-04 01:37:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我一直试图用blobcache将这个存储在内存中,blobcache是一个写在[here][1]的模块。在

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

我的人体模型是这样的。在

class PersonDB(db.Model):
    serialized = db.BlobProperty()
    pid = db.StringProperty()

每个person都是一个对象,它有许多相关的属性和方法,所以我决定pickle每个person对象并将其存储为序列化字段。pid允许我通过id查询此人

^{pr2}$

当我一次将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个对象?在

我的想法是做这样的事

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

提前谢谢你的帮助,我已经在这个问题上耽搁了一段时间!!在


Tags: 对象方法内存from数据库dbmypeople
3条回答

你也要检查一个项目的执行情况 https://github.com/ocanbascil/PerformanceEngine

您不应该同时在内存中存储所有5000个用户。只取回你需要的那个。在

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

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

  • 本地实例内存(数据集太大)
  • memcache(把你的数据分成几个键,你应该没事,而且速度很快!)在
  • blobstore+memcache(持久化到blobstore而不是DB)
  • 数据库+内存缓存(持久到数据库)

看看今年的Google IO视频,有一个很好的关于使用blobstore的视频。在某些用例中,与DB相关联的性能(和成本)损失很大。在

(对于迂腐型读者,后三种阅读方式的阅读效果基本相同,但在写作时间/成本上存在显著差异)

相关问题 更多 >