我的django网络应用程序保留了内存中的旧图像数据.每次提交后如何清除



我已经构建了一个django应用程序,该应用程序要求用户输入,然后使用numpymatplotlib.pyplot生成图形并将其显示在我的网页中。我不是将数据保存到磁盘,而是使用iobase64将其保存到内存中,这可能是问题的一部分。在第一次提交时,我会得到这样的东西,这正是我想要的,但在随后的提交中,我从未摆脱旧的图表,最终得到这样这样的东西。

这是我的views.py文件:

from django.shortcuts import render
from .forms import NNInput
import numexpr as ne
import numpy as np
import matplotlib.pyplot as plt
import io
import base64
from PIL import Image
from .FeedForwardNN import FFNN
# Create your views here.

def ffnn(request):
if request.method == 'POST':
form = NNInput(request.POST)
if form.is_valid():
cd = form.cleaned_data
net = FFNN(1, 1, [cd['n'] for i in range(cd['m'])])
x = np.arange(-1, 1, .001)
x.shape = (x.shape[0], 1)
untrained = net.evaluate(x)
fig_untrained = plt.figure(1)
plt.xlabel('x- axis')
plt.ylabel('y-axis')
plt.title('Pre-Training NN (green) vs function')
y = ne.evaluate(cd['func'])
plt.plot(x, y, 'r', x, untrained, 'g')
buf = io.BytesIO()
fig_untrained.savefig(buf, format='png')
im = Image.open(buf)
buf2 = io.BytesIO()
im.save(buf2, format='png')
im_str = base64.b64encode(buf2.getvalue()).decode()
data_uri = 'data:image/png;base64,'
data_uri += im_str
context = dict()
context['data1'] = data_uri
epochs, history = net.train_mini_batches(x, y, .001, 200, .01)
fig_loss = plt.figure(2)
plt.xlabel('Epochs')
plt.ylabel('Mean Squared Error')
plt.title('Loss')
plt.plot(epochs, history, 'b')

buf3 = io.BytesIO()
fig_loss.savefig(buf3, format='png')
im2 = Image.open(buf3)
buf4 = io.BytesIO()
im2.save(buf4, format='png')
im_str2 = base64.b64encode(buf4.getvalue()).decode()
data_uri2 = 'data:image/png;base64,'
data_uri2 += im_str2
context['data2'] = data_uri2
trained = net.evaluate(x)
fig_trained = plt.figure(3)
plt.xlabel('x-axis')
plt.ylabel('y-axis')
plt.title('Post-Training NN (green) vs function')
plt.plot(x, y, 'r', x, trained, 'g')
buf5 = io.BytesIO()
fig_trained.savefig(buf5, format='png')
im3 = Image.open(buf5)
buf6 = io.BytesIO()
im3.save(buf6, format='png')
im_str3 = base64.b64encode(buf6.getvalue()).decode()
data_uri3 = 'data:image/png;base64,'
data_uri3 += im_str3
context['data3'] = data_uri3
return render(request, 'my_feedforward_nn/posttraining.html', context)
else:
form = NNInput(initial={'m':1, 'n':64, 'func':'(exp(-x)-exp(x))*x**3'})
context = dict()
context = {
'form': form,
}
return render(request, 'my_feedforward_nn/feedforwarddefault.html', context)

这是我的训练后.html文件

{% extends 'base.html' %}
{% block content %}
<img src={{ data1 }} alt="" height="250" ,width="250">
<img src={{ data2 }} alt="" height="250" ,width="250">
<img src={{ data3 }} alt="" height="250" ,width="250">
{% endblock content %}

我在另一个应用程序中有一些类似的代码,但没有同样的问题。事实证明,不同之处在于代码,每次绘制函数时,我都会调用plt.figure(),而不是plt.figure(n),n是1、2或3。更改为plt.figure()解决了我的问题,但我现在想知道是否所有打开的数字都存在,并可能导致内存问题。