Я занимаюсь разработкой приложения пространственного ранжирования с использованием GeoDjango + PostGIS.По сути, он извлекает все геометрические фигуры в ограничивающем поле запроса, вычисляет оценку сходства с помощью созданной мной пользовательской функции, а затем возвращает фигуры с самыми высокими показателями.
В настоящее время время обхода в каждомзапрос очень медленныйЗапуск профилировщика показывает, что узкое место происходит из threadsafe.py
, которые вызываются операциями GEOSGeometry
(т.е. пересекаются, объединяются, содержатся и т. Д.) Внутри моей функции подобия.Вот пример результата профилировщика из одного запроса.Похоже, что потокобезопасный характер GEOSGeometry
является причиной проблемы с производительностью.В отдельности операция, занимающая 40 мс, не кажется большой проблемой, но поскольку число форм, сравниваемых с запросом, обычно велико, т. Е. ~ 1000 фигур, операция 40 мс добавляет до 40 сек.
Поэтому мой вопрос заключается в том, как я могу оптимизировать функцию, чтобы минимизировать время выполнения заказа.Вот некоторые из моих первоначальных идей:
- Отключите / не проверяйте безопасность безопасности
GEOSGeometry
, так как эти объекты являются временными и не передаются другим потокам.Это было бы идеальным случаем, если это возможно, так как большая часть времени, потраченного сейчас, находится в threadsafe.py
- Использование другого API геометрии, который не является безопасным.
- Выполнение пространственных операцийна уровне PostGIS вместо уровня объекта.Тем не менее, код будет выглядеть ужасно. ( Обновления: Эта опция не работает. Из-за одних только SQL-запросов работа становится еще медленнее.)
Чтоваши мысли?