Как увеличить производительность формирования html с помощью шаблонизатора Jinja2?
У меня маловато опыта в разработке ПО. Не в смысле наклепать скрипт с интерфейсом, а в смысле спроектировать достаточно сложное приложение и потом его воплотить. Ну это преамбула.
Итак, разрабатываю веб-приложение, стоит задача взять за период времени (как правило месяц) события и отобразить их с поминутной детализацией. Событий может быть около 1000, к каждому привязаны времЕнные интервалы, этих интервалом может быть очень много, пока я оперирую примерно 2000 записей дат для каждого события. Таблица "События" связана связью "многие-ко-многим" (через третью таблицу) с таблицей "Дата-Время". В таблицах "События" и "Дата-Время" записи уникальны. То есть одна и тажа дата привязана может быть к разным событиям. Дата и время хранятся в формате datetime.
Для разработки веб-приложения использую - Python, Flask, SQLAlchemy. Шаблонизатор Jinja2. БД - PostgreSQL.
Делаю запрос средствами SQLAlchemy, в нём join'ами собираю в кучу таблицы и фильтрую по нужному промежутку дат.
Отдаю его результат шаблонизатору. В шаблонизаторе 4(!) вложенных один в другой цикла разбирают этот запрос в зависимости от событий, времени, даты и строят сетку событий. Причём полностью запрос обходится дважды в самом верхнем цикле и в самом нижнем. В общем всё плохо.
Основная проблема в том, что сетка событий должна выдаваться только с помощью html и css, без задействования JavaScript. И при этом она обновляется каждые 10-15 секунд.
Исходный файл получается объёмом от 130 до 180 мегабайт. Причём примерно на 70% состоит из пустых строк, отступов и прочего невидимого мусора. После натравливания на него django-htmlmin он уменьшился до приемлемых 1,5 мб. Причём минификация требует тоже порядочно времени.
Основная проблема в этой цепочке, то что генерация html с помощью jinja2 занимает просто нереальное количество времени.
Что вообще можно сделать в данной ситуации? Изменить подход непосредственно к решению задачи? Если да, то как это должно выглядеть?
Ну и касательно генерации html, можно тут что-то сделать, может быть как-то уйти от этого жуткого конвейера циклов?
Отвечу сам себе. :-) Два года уже прошло всё-таки.
1. Использовать в шаблоне конструкции шаблонных выражений в таком виде:
{%- if bla-bla -%}
То есть ставим тире после и перед знаком процента. Это убирает пустые строки и отступы.
2. Минификатор в мусор. Реально от него только тормоза, хотя если кэшироваться то в принципе выигрыша можно добиться.
3. Разбирать в шаблоне только очень простые запросы. Сложные и с большим количеством уровней вложения превращать в JSON и разбирать яваскриптом на клиентской стороне.