Техническое. Почему Скиур иногда подтормаживает

Буквально несколько дней назад удалось выявить в Скиуре довольно неприятный баг и, частично его исправить. Проблема оказалась в том что мои предыдущие предположения что сервис подтормаживает на прогоне страницы по базе регулярных выражений, конечно были справедливы, но в значительной степени эту проблему удалось решить ещё раньше введя предварительную фильтрацию выражений  по принципам которые я у себя же тут в блоге описывал. Не универсальное решение, но всё же вполне оптимальное.

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

Сейчас проблема решилась выносом кода подгрузки выражений из общей части в те участки где без базы выражений никак не обойтись — распознавание веб-страницы, во всех же случаях подгрузки данных из кеша более выражения не подгружаются. Загвоздка же в том что простого решения у этой проблемы нет.

В то же время есть варианты:

— либо компилировать выражения в C или Python код и подключить как уже готовые модули

— либо разрабатывать специальный сериализатор для регулярных выражений для Python ибо готовых нет

— либо выносить всю логику распознавания в отдельный сервер/сервис и обрабатывать все страницы в несколько потоков где выражения предварительно подгружены (самый простой способ)

— либо использовать для разбора веб-страниц не Python, а язык умеющий регулярные выражения сериализовывать

— либо отказаться от регулярных выражений и использовать иные правила анализа текстов.

Часть решений сугубо технические, часть алгоритмические. Какой подход проще уже понятно, непонятно какой лучше.

Как бы то ни было, есть и плюсы. Ключевой из которых в том что запас ускорения у Скиура ещё где-то 1000% и промышленный его вариант сможет быть очень быстрым.

About This Author

  • suvit

    unmashalled — это unmarshalled?
    А чем плохо при старте сервера сделать re.compile для всех выражений, и просто хранить их в памяти или их очень много?

  • http://ivan.begtin.name ivbeg

    > unmashalled – это unmarshalled?
    Да, это опечатка.

    Решить всё хранение невозможно поскольку в веб сервере множество сессий разделяемых между различными экземплярами веб сервера. В свою очередь процессы веб сервера живут лишь ограниченное число запросов после чего отмирают.

    Отсюда и загвоздка в том что хранить в памяти можно, либо через сериализацию в Memcached что не помогает по причинам что я описал ранее, либо в рамках отдельного управляемого сервера.

  • suvit

    Да, разобрался. А pickle действительно просто сохраняет некомпилированное выражение.

Яндекс.Метрика