0

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,
  })
4

0 に答える 0