django と postgres で書かれた Web サーバーに測定値をプッシュする測定プログラムがあります。現在、djangoフォームを介してこの更新を行っています。しかし、私が見つけたのは、フォーム インターフェイスがかなり遅いということです。スクリプトを設定すると、フォームから 100 件のレコードをアップロードするのに 7 ~ 8 秒かかり、VM の CPU が固定されます。20 または 30 の測定システムがサーバーに更新される可能性があり、それぞれが 1 秒あたり 15 測定で実行されるため、更新速度が機能しません。
最初は django ORM を使用して作成しましたが、SQL 文字列を自分で作成するために書き直しました。どちらも同じように遅いです。次に、データベースの更新を完全にコメントアウトしましたが、それでもかなり遅いです。したがって、フォーム インターフェイスがボトルネックになっていると思います。
質問:
- これはまだ開発中なので、まだ「python manage.py runserver」を使用しています。wsgi (または何でも) はこれを高速化しますか?
- プログラムによる単一レコードのdjangoへの更新のベストプラクティスは何ですか?
問題のフォームのモデルは次のとおりです。
class MeasurementForm(forms.Form):
RunKey = forms.CharField()
MeasureTime = forms.CharField()
CaliperValue = forms.CharField()
CaliperToleranceStatus = forms.CharField()
IOFieldName = forms.CharField(required=False)
IOFieldValue = forms.CharField(required=False)
ToleranceStatus = forms.CharField()
Count = forms.CharField(required=False)
そして、これが実際に更新を行うためのコードです。ただし、実際の更新はコメントアウトされています。
def entermeasurement(request):
if request.method == 'POST': # If the form has been submitted...
form = MeasurementForm(request.POST) # A form bound to the POST data
response = HttpResponse(mimetype='text/plain')
if form.is_valid(): # All validation rules pass
raws = form.cleaned_data['CaliperValue'].split(",")
vals = []
for v in raws:
if "null" in unicode.lower(v):
vals.append(None)
else:
vals.append(v)
# insert a measurement record.
cursor = connection.cursor()
# print ("presql")
# get number of records removed given the date.
sqlstring = """insert into bwmeasures_measurements
("RunKey_id",
"MeasureTime",
"CaliperValue",
"CaliperToleranceStatus",
"IOFieldName",
"IOFieldValue",
"ToleranceStatus")
values
( """
"""
sqlstring = sqlstring + \
str(form.cleaned_data['RunKey']) + \
", timestamp'" + \
str(dateutil.parser.parse(form.cleaned_data['MeasureTime'])) + \
"', '" + \
postgresarray(vals) + \
"', '" + \
postgresarray(form.cleaned_data['CaliperToleranceStatus'].split(",")) + \
"', '" + \
postgresarray(quodstrings(form.cleaned_data['IOFieldName'])) + \
"', '" + \
postgresarray(quodstrings(form.cleaned_data['IOFieldValue'])) + \
"', '" + \
str(form.cleaned_data['ToleranceStatus']) + \
"')"
"""
# print(sqlstring)
#print("would update here!")
#cursor.execute(sqlstring)
#transaction.commit_unless_managed()
'''
# Django ORM way of doing the insert.
measurement = Measurements()
measurement.RunKey = ProductionRuns.objects.get(id=int(form.cleaned_data['RunKey']))
measurement.MeasureTime = dateutil.parser.parse(form.cleaned_data['MeasureTime'])
measurement.CaliperValue = vals
measurement.CaliperToleranceStatus = form.cleaned_data['CaliperToleranceStatus'].split(",")
measurement.IOFieldName = quodstrings(form.cleaned_data['IOFieldName'])
measurement.IOFieldValue = quodstrings(form.cleaned_data['IOFieldValue'])
measurement.ToleranceStatus = int(form.cleaned_data['ToleranceStatus'])
measurement.save()
'''
# indicate success
response.write("saved\n")
response.write(measurement.id)
# Process the data in form.cleaned_data
return response
else:
response.write("failed")
response.write(str(form.errors))
return response
else:
form = MeasurementForm() # An unbound form
return render(request, 'entermeasurement.html', {
'form': form,
})