我的Django应用程序的许多视图使用大型模型(900Mb)来计算其输出。我想加载此模型一次并与所有视图共享。我这样做的方法是在views.py
中加载模型,然后将模型用作全局变量。
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)
...
我在AWS beanstalk上部署了我的Django应用程序。如果我在运行我的应用的实例上运行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
在第二个请求之后,出现另一个进程并占用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
这不会发生在我的本地计算机上。有什么想法吗?
答案 0 :(得分:1)
此模块级别global是进程内的共享状态。在本地使用runserver
,您将拥有一个包含多个线程的进程。在EB上,您可能有多个独立的流程,每个流程都有自己的副本。您无法控制哪个进程将处理每个传入请求。内存使用情况不应该随着每个请求继续增加,而应该在每个进程在导入时创建其副本时最大化。您可以将WSGI服务器的并发性限制为具有多个线程的单个进程(如何依赖于您正在使用的WSGI服务器)。这会降低您的内存使用量,但也会降低您的网站容量/性能。