Nano Hash - криптовалюты, майнинг, программирование

SQLAlchemy-Marshmallow медленно запрашивает и сериализует в JSON

Я немного новичок в этом, поэтому, если кто-то может мне помочь, это было бы здорово.

Итак, у меня есть несколько моделей, настроенных в SQLAlchemy для приложения Flask, над которым я работаю. Я заполнил базу данных (в настоящее время SQLite) некоторыми поддельными данными, пока я создаю приложение, и я немного удивлен, насколько медленным является один из моих вызовов.

У меня есть таблица в БД под названием Меню. В меню есть дочерние, разделы, у которых есть дочерние, пункты. как это:

  • Menu
    • Sections
      • Items

Объект, который я запрашиваю, это 1 меню, в котором есть 4 раздела, каждый из которых имеет 10 элементов.

В моем маршруте Flask я запрашиваю БД, используя Menu.query.get(id) и сериализую его в JSON с зефиром.

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

Итак, мой вопрос (ы): я глуп, беспокоясь о 250 мс? В чем причина медлительности? - Плохой дизайн схемы? - SQLite / Использование базы данных SQL? - Что-то другое?

Любая помощь будет принята с благодарностью.

Кроме того. Изначально у меня было еще 2 уровня глубже (элементы имеют параметры, у которых есть выбор), но это занимало около полной секунды, поэтому я переместил их в отдельную конечную точку, когда пользователь запрашивает определенный элемент.


Ответы:


1

Я бы согласился, что 250 мс — это лишнее, учитывая, что все локально. Я ожидаю, что причина медлительности заключается в том, что для построения JSON выполняется несколько запросов SQL.

Установка SQLALCHEMY_ECHO = True в конфигурации SQLAlchemy покажет вам генерируемые SQL-запросы и подтвердит это.

Вы не предоставили свои модели БД, но вы можете обнаружить, что ваши отношения загружаются лениво, и поэтому для каждого объекта в дереве создается новый запрос SQL. Дополнительную информацию можно найти в разделе Техники загрузки отношений документации SQLAlchemy. .

Установка lazy='joined' для дочернего отношения (т. е. Меню -> Раздел и Раздел -> Элементы) приведет к тому, что дочернее отношение будет загружено с готовностью с использованием JOIN вместо SELECT по умолчанию.

14.07.2016
  • они лениво загружаются. Я перейду на присоединенный и посмотрю, есть ли улучшения. Спасибо. 15.07.2016
  • Вот это да. это конечно помогло. до 50-75 мс при этом изменении. просто любопытно, есть ли недостатки у жадной загрузки по сравнению с ленивой? 15.07.2016
  • База данных будет выполнять JOIN, поэтому будет выполнять больше работы, но если вы знаете, что данные требуются для запроса, то это наиболее эффективный способ получить данные (по сравнению с выполнением отдельного «ленивого» запроса). В качестве альтернативы вы можете использовать по умолчанию ленивую загрузку и использовать параметр joinload() для запросов, к которым вы хотите присоединиться. 18.07.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..