이 문제와 관련하여 가장 먼저 고려해야 할 것은 언제 어디서 데이터가 필요한지입니다. 그렇게하기 위해, 나는 보통 바보 같은 일련의 문제로 시작한다.
z $ / acre 미만의 다른 소포의 y 피트 내에있는 x $ / acre 이상의 모든 소포를 찾으십시오.
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
이 알고리즘은 최적화되지 않았지만 문제를 해결합니다.
나는 데이터 세트의 모든 지점에서 가장 가까운 소포를 찾은 내 석사 논문에 대해 비슷한 문제를 해결했습니다. PostGIS , Hadoop
및 MPI 에서 솔루션을 구현했습니다 . 내 논문의 전체 버전이 여기 있지만이 문제에 적용되는 중요한 사항을 요약하겠습니다.
MapReduce 는 단일 데이터를 처리하기 위해 전체 데이터 세트 (또는 신중하게 선택된 서브 세트)에 액세스해야 하므로이 문제를 해결하기에 적합한 플랫폼이 아닙니다. MapReduce는 보조 데이터 세트를 제대로 처리하지 않습니다.
그러나 MPI는이를 매우 쉽게 해결할 수 있습니다. 가장 어려운 부분은 데이터 분할 방법을 결정하는 것입니다. 이 분할은 데이터 양, 실행해야하는 프로세서 수 및 프로세서 당 메모리 양을 기반으로합니다. 최상의 스케일링 (및 성능)을 위해서는 한 번에 메모리에 (모든 컴퓨터의) 여러 소포 데이터 세트 사본이 있어야합니다.
이것이 어떻게 작동하는지 설명하기 위해 50 대의 컴퓨터 각각에 8 개의 프로세서가 있다고 가정하겠습니다. 그런 다음 각 컴퓨터에 소포의 1/50을 확인하는 책임을 부여합니다. 이 검사는 컴퓨터에서 8 개의 프로세스에 의해 실행되며 각 프로세스는 동일한 소포의 1/50 부분과 소포 데이터 세트의 1/8 사본을 갖습니다. 그룹은 단일 시스템으로 제한되지 않지만 시스템 경계를 넘을 수 있습니다.
프로세스는 알고리즘을 실행하여 1/50 번째 소포 세트에서 p에 대한 소포를 가져오고 1/8 번째 세트에서 q에 대한 소포를 가져옵니다. 내부 루프 후 동일한 컴퓨터의 모든 프로세스가 함께 대화하여 소포가 방출되어야하는지 여부를 결정합니다.
내 문제에 대해 이와 비슷한 알고리즘을 구현했습니다. 여기서 소스를 찾을 수 있습니다 .
이런 종류의 최적화되지 않은 알고리즘을 사용하더라도 프로그래머 시간에 매우 최적화 된 인상적인 결과를 얻을 수있었습니다 (멍청한 간단한 알고리즘을 작성할 수 있으며 계산이 여전히 빠르다는 것을 의미합니다). 최적화해야 할 다음 단계는 (실제로 필요한 경우) 각 프로세스에 대해 두 번째 데이터 세트 (q를 얻는 위치)의 쿼드 트리 인덱스를 설정하는 것입니다.
원래 질문에 대답합니다. MPI + GEOS 아키텍처가 있습니다. ClusterGIS 구현에서 약간의 도움을 받으면 많은 것을 할 수 있습니다. 이 모든 소프트웨어는 오픈 소스로 제공되므로 라이센스 비용이 없습니다. 리눅스에서 작업했을 때 Windows에 이식성이 있는지 확실하지 않습니다 (Cygwin과 함께). 이 솔루션은 EC2, Rackspace 또는 사용 가능한 모든 클라우드에 배포 할 수 있습니다. 제가 개발했을 때 저는 대학교에서 전용 컴퓨팅 클러스터를 사용하고있었습니다.