2011-07-05 5 views
3

GeoDjango + PostGIS를 사용하여 공간 순위 지정 응용 프로그램을 개발 중입니다. 기본적으로 쿼리 경계 상자 내의 모든 지오메트리를 검색하고, 내가 만든 사용자 지정 함수를 사용하여 유사도 점수를 계산 한 다음 가장 많이 점수가 지정된 도형을 반환합니다.GeoDjango : GEOS Geometry 작업의 속도 향상

현재 각 쿼리의 왕복 시간은 매우 느립니다. 실행 프로파일 러는 내 유사성 기능 내에서 GEOSGeometry 작업 (즉, 교차, 합집합, 포함 등)으로 호출되는 병목 현상이 threadsafe.py임을 보여줍니다. 단일 쿼리의 예제는 profiler result입니다. GEOSGeometry의 스레드 안전 특성이 성능 문제를 일으키는 원인 인 것처럼 보입니다. 개별적으로, 40ms가 걸리는 작업은 그리 큰 문제는 아니지만 쿼리와 비교할 모양의 수가 보통 ~ 1000 개이므로 40ms 작업으로 최대 40 초가 소요됩니다.

따라서 제 질문은 처리 시간을 최소화하기 위해 함수를 최적화 할 수있는 방법입니다. 내 초기 아이디어 중 일부는 다음과 같습니다 이러한 개체가 과도하고 다른 스레드에 공유되지 않는 한

    GEOSGeometry의 theadsafety 검사를 피하기 온/오프십시오
  1. . 가능한 많은 시간이 소요되는 이상적인 경우입니다. threadsafe.py
  2. treadsafe가 아닌 다른 지오메트리 API를 사용하십시오.
  3. 오브젝트 레벨 대신 PostGIS 레벨에서 공간 조작을 수행하십시오. 이렇게하면 코드가보기 흉하게 보이게됩니다. (업데이트 :.이 옵션은 작동하지 않습니다 만 SQL 쿼리의 오버 헤드도 느린 동작합니다.)

당신의 생각은 무엇입니까?

+1

않는 긴처럼 긴 위도 사용하고 LAT 없습니다. 'GDALGeometry'는 threadsafe.py에 의지하는 것으로 나타 났고 결과적으로 더 나쁜 결과를냅니다. – ejel

답변

1

geos 작업을 위해 shapely으로 전환했습니다. threadsafe 문제를 해결할 수 있습니다.

는 참고로, 매끈한 GeoDjango 내가`GEOSGeometry``에 대한 대안으로 GeoDjango 함께 제공 GDALGeometry`를 사용하여 시도

+0

GEOS의 공간 작업에 매끈하게 의존하기 때문에 동일한 문제가 발생한다고 생각했습니다. 흥미 롭 군. 나는 그것을 시도 할 것이다. – ejel

+0

geodjango 모델을 사용하여 매끄럽게 사용할 수 있습니까? – linqu

0

사실 threadsafe.py은 기본 C 함수에 대한 각 호출을 래핑합니다. 병목 현상이 무엇인지 더 잘 이해하려면 cumtime 열을 살펴보십시오. 열에 대한 설명은 여기를 참조하십시오 : http://docs.python.org/library/profile.html#module-pstats.

+0

'threadsafe.py'는 C 함수의 래퍼입니다. 프로파일 링 된 결과를 두 번 확인했는데'threadsafe.py '가 병목 현상이라는 것은 여전히 ​​사실입니다. 즉, 공간 연산 (예 : 교차, 내부, 결합)이 호출 될 때마다 호출됩니다. 이 작업에 실제로 소비 된 시간은 threadsafe에서 보낸 시간에 비해 너무 적습니다. 그래서 문제가 해결 될 수 있도록 쓰레드 안전성을 전혀 사용하지 않으면 나는 생각하고있었습니다. – ejel

+0

프로파일 러 결과를 보면, – arghbleargh