GeoDjango: ускорение операций с геометрией GEOS - PullRequest
3 голосов
/ 05 июля 2011

Я занимаюсь разработкой приложения пространственного ранжирования с использованием GeoDjango + PostGIS.По сути, он извлекает все геометрические фигуры в ограничивающем поле запроса, вычисляет оценку сходства с помощью созданной мной пользовательской функции, а затем возвращает фигуры с самыми высокими показателями.

В настоящее время время обхода в каждомзапрос очень медленныйЗапуск профилировщика показывает, что узкое место происходит из threadsafe.py, которые вызываются операциями GEOSGeometry (т.е. пересекаются, объединяются, содержатся и т. Д.) Внутри моей функции подобия.Вот пример результата профилировщика из одного запроса.Похоже, что потокобезопасный характер GEOSGeometry является причиной проблемы с производительностью.В отдельности операция, занимающая 40 мс, не кажется большой проблемой, но поскольку число форм, сравниваемых с запросом, обычно велико, т. Е. ~ 1000 фигур, операция 40 мс добавляет до 40 сек.

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

  1. Отключите / не проверяйте безопасность безопасности GEOSGeometry, так как эти объекты являются временными и не передаются другим потокам.Это было бы идеальным случаем, если это возможно, так как большая часть времени, потраченного сейчас, находится в threadsafe.py
  2. Использование другого API геометрии, который не является безопасным.
  3. Выполнение пространственных операцийна уровне PostGIS вместо уровня объекта.Тем не менее, код будет выглядеть ужасно. ( Обновления: Эта опция не работает. Из-за одних только SQL-запросов работа становится еще медленнее.)

Чтоваши мысли?

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Мы перешли на использование shapely для наших геоопераций. Это помогло нам решить проблему безопасности потоков.

К вашему сведению, стройно использует long, lat и not lat, long, как GeoDjango

0 голосов
/ 06 июля 2011

На самом деле, threadsafe.py - это просто завершение каждого вызова базовых функций Си. Чтобы лучше понять, какие у вас узкие места, посмотрите на столбец cumtime. Смотрите здесь описание колонок: http://docs.python.org/library/profile.html#module-pstats.

...