Улучшение производительности Graphql (graphene-django) для 4 уровней вложенных списков

Я использую Django 4 с graphene-Django 3 и мне нужно структурировать ответ, который должен состоять из 4 уровней списков и нижнего уровня - словаря. Вот реализация

Вот запрос graphql:

inspectSensorFailureBySystem(){
 failureSensors{
  anomalyType
  failureSensors{
    spectra{
      name
      spectraZ {
        Id
        collectionName
        rpmDetected
        anomaly
        values
        valuesNames
        sidebands
        
      }
    }
  }
}

Результатом этого запроса является:

{
 "data": {
   "inspectSensorFailureBySystem": [
     {
       "failureSensors": [
         {
        "anomalyType": "spectra",
        "failureSensors": [
          {
            "spectra": {
              "name": [
                "15339-envelope_spectra",
                "15339-envelope_spectra_timedomain",
                "15339-spectra_timedomain",
                "15339-spectra"
              ],
              "spectraZ": [
                [
                  [
                    {
                      "Id": "628bd17db4aff3060810a726",
                      "collectionName": "spectrum",
                      "rpmDetected": -1,
                      "anomaly": -1,
                      "values": [],
                      "valuesNames": [],
                      "sidebands": []
                    },
                    ...
                    {
                      "Id": "62e8d3119aa606584e88b228",
                      "collectionName": "timedomain",
                      "rpmDetected": 1256,
                      "anomaly": 1,
                      "values": [
                        261.1224,
                        522.2448,
                        783.3672,
                        1044.4896,
                        1305.612,
                        1566.7344,
                        1827.8568,
                        2088.9792,
                        2872.3464,
                        3133.4688
                      ],
                      "valuesNames": [
                        1,
                        2,
                        3,
                        4,
                        5,
                        6,
                        7,
                        8,
                        11,
                        12
                      ],
                      "sidebands": []
                        }
                      ]
                    ]
                  ]
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Данные поступают непосредственно из построчного списка словарей (spectra_z), который разбирается в предыдущем резольвере, и он работает довольно быстро (менее 0.2s). Таким образом, получение данных из базы данных, а затем разбор из строки в нужные вложенные списки и конечные словари происходит очень быстро.

Но после того, как резольвер завершает работу и я передаю результат движку GraphGL, GraphGL требуется более 30 секунд, чтобы разобрать данный результат и отправить окончательный ответ.

С другой стороны, если я просто получаю строгированные значения из базы данных (spectra_z) и просто передаю их как строку (без вложенных списков), очевидно, что GraphGL отвечает очень быстро.

Я не эксперт в GraphGL и хотел бы знать, как я могу ускорить graphene-Django, чтобы разобрать этот ответ быстрее (так как 30 секунд для получения ответа неприемлемо). Существуют ли какие-нибудь параметры для ускорения или какие-нибудь хитрости?

Я бы предложил следующее:

  1. Определите резольвер для spectra, который просто возвращает массив имен
  2. Определите резольвер для spectraZ, который просто возвращает список spectraZ
  3. .
  4. Определите отдельные резольверы для всех полей объекта spectraZ. Это позволит избежать длинной серии операторов if, в которых вы, по сути, разрешаете одно поле за каждый проход по ключам
  5. .
  6. Пусть GraphQL соберет все результаты в возвращаемый объект

В этом есть дополнительное преимущество - не нужно вычислять все вложенные поля, если клиент запрашивает не все из них. В данном случае, даже если вам нужны только имена, все остальное также будет вычислено.

Вернуться на верх