1

Pyramid Web フレームワークで__init__.py 、100 MB のオブジェクトを設定に入れました。そのviews.pyオブジェクトをスキャンします。しかし、それはとても遅いです。プリントをビューに入れましたが、スキャンは高速です...ビューが呼び出される前に遅延が発生します。Pyramid は、ビューが呼び出されるまでに約 5 秒かかります。Pyramid は設定をコピーしていますか? メモリ内オブジェクトを から に渡すより良い方法はあり__init__ますviewsか?

編集:

__init__.py main(global_config, **settings)私は持っています:

settings['db_info'] = huge_dictionary

そしてviews.pyには次のものがあります:

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

パフォーマンスから判断すると、huge_dictionary 全体をコピーしているに違いありません。これを回避する 1 つの方法は、巨大なオブジェクトをディスクに cPickle してから、ビューで読み戻すことです。オブジェクトをメインメモリに保持する方法があるはずです。

詳細編集: ありがとう、マイケル・メリケル! Pyramid は実際にビューのディスパッチごとに設定をコピーしているようです。私のテストによると、Pyramid は浅いコピーではなく、深いコピーを行っています。次のすべては、同じ非常に遅い時間を示しています。

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

しかし、cPickle を使用するとすぐに機能します。

4

2 に答える 2

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 に答える