1

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

编辑:

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

settings['db_info'] = huge_dictionary

在views.py中我有:

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

从性能来看,它一定是在复制整个huge_dictionary。解决它的一种方法是将巨大的对象 cPickle 到磁盘,然后在视图中读回它。似乎应该有一种方法可以将对象保留在主内存中。

更多编辑:谢谢你迈克尔梅里克!看起来 Pyramid 确实在复制每个视图调度的设置。我的测试表明,Pyramid 正在做一个深拷贝,而不是浅拷贝。以下所有内容都显示了相同的非常慢的时间:

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

但是使用 cPickle 效果很快!

4

2 回答 2

3

Pyramid 确实对您传递给配置器的 dict 做了一个初始副本,但它是一个浅拷贝。如果您确实将 100mb dict 传递给配置器,那么只需将其作为父 dict 的键传递。

于 2013-04-30T19:59:37.583 回答
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()
于 2014-02-18T19:21:51.960 回答