金字塔很慢,有很大的内存对象

时间:2013-04-30 13:27:34

标签: python pyramid

__init__.py的Pyramid Web框架中,我将一个100 MB的对象放入设置中。在views.py我扫描该对象。但它太慢了。我把打印放在我的视图中,我的扫描很快......延迟是在我的视图被调用之前。金字塔需要大约5秒才能调用我的视图。金字塔是否复制了设置?有没有更好的方法将内存中的对象从__init__传递到views

编辑:

__init__.py main(global_config, **settings)我有:

settings['db_info'] = huge_dictionary

并且在views.py中我有:

db_info = request.registry.settings['db_info']

从性能来看,它必须复制整个huge_dictionary。 绕过它的一种方法是将巨大的对象cPickle到磁盘,然后在视图中读回。 似乎应该有一种方法将对象保存在主存储器中。

更多编辑: 谢谢Michael Merickel!看起来Pyramid确实在每个视图调度上复制设置。 我的测试表明它的方式,金字塔正在做一个深刻的副本,而不是浅。以下所有内容均表明了这一点 同样非常慢的时间:

settings['db_info'] = big_data
settings['db_info'] = [big_data]
settings['db_info'] = {'aa' : [big_data]}

但是使用cPickle可以快速工作!

2 个答案:

答案 0 :(得分:3)

Pyramid会对您传递给配置程序的dict做一个初始副本,但它是一个浅层副本。如果您真的将100mb dict传递给配置器,那么只需将其作为父dict的键传递。

答案 1 :(得分:2)

您可以为ApplicationCreated事件使用事件订阅者,并在创建wsgi之后(但在处理任何请求之前)加载您的数据。如果您的数据不需要配置应用程序(即某些include不期望它),这可能是一个不错的选择。

另外,我选择将数据存储为注册表项而不是设置。从应用程序需要运行的数据中划分配置数据是一个很好的分离关注点,就像注册表对象之类的地图一样。

from pyramid.config import Configurator

def appcreated(event):
    reg = event.app.registry
    reg['bigdata'] = reg['dataloader'](reg.settings)


def loader(settings):
    return "THE ENORMOUS GIGANTIC DATA"


def main(global_config, **settings):
    config = Configurator(settings=settings)
    config.add_subscriber(appcreated, 'pyramid.events.ApplicationCreated')
    config.registry['loader'] = loader
    return config.make_wsgi_app()