2017-07-12 13 views
0

私のDjangoアプリケーションの多くのビューは、出力を計算するために大きなモデル(900Mb)を使用します。このモデルを一度ロードして、すべてのビューと共有したいと思います。私がやったやり方は、views.pyにモデルをロードして、モデルをグローバル変数として使用することでした。Djangoはすべてのリクエストでより多くのメモリを占める

with open('big_model.pkl','rb') as f: 
    model = pickle.load(f) 

def view1(request): 
    out = model.compute(request) 
    ... 

def view2(request): 
    out = model.compute(request) 
    ... 

私はDjangoアプリケーションをAWS beanstalkにデプロイしました。私は私のアプリを実行しているインスタンス上でtopを実行する場合、私は1つの要求した後、次を参照してください。

Mem: 4048016k total, 2807496k used, 1240520k free,  3660k buffers 
PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND       
11530 wsgi  20 0 2817m 1.6g 30m S 0.0 41.9 0:04.63 httpd 

を、第2の要求した後、別のプロセスが表示され、1GBのメモリを占有してしまいました。

Mem: 4048016k total, 3941208k used, 106808k free,  2192k buffers 
PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND       
11530 wsgi  20 0 2817m 1.6g 29m S 0.0 41.9 0:04.63 httpd       
11532 wsgi  20 0 2817m 1.6g 29m S 0.0 41.9 0:04.32 httpd 

これはローカルマシンでは発生しません。何か案は?

答えて

1

このモジュールレベルのグローバルは、プロセス内で共有状態です。ローカルでrunserverを使用すると、複数のスレッドを持つ1つのプロセスが作成されます。 EBでは、それぞれ独自のコピーを持つ複数の独立したプロセスがある可能性があります。どのプロセスが各着信要求を処理するかは制御していません。メモリ使用量は要求ごとに増加し続けるべきではなく、各プロセスがインポート時にそのコピーを作成したときに最大にする必要があります。複数のスレッドを持つ単一のプロセスを持つようにWSGIサーバーの並行性を制限できます(どのWSGIサーバーを使用しているかによって異なります)。これにより、メモリの使用量は減りますが、サイトの容量/パフォーマンスも低下します。

関連する問題