Bu sorunla ilgilenmesi gereken ilk şey, nerede ve ne zaman hangi verilere ihtiyaç duyulduğudur. Bunu yapmak için genellikle problemin aptal, seri versiyonuyla başlarım.
Z $ / acre değerinden daha düşük değere sahip başka bir parselin bir metre karesinde bulunan x $ / acre değerinde olan tüm parselleri bulun.
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
Bu algoritma optimize edilmemiş olsa da problemi çözecektir.
Bir veri setindeki her nokta için en yakın paketi bulan yüksek lisans tezi için de benzer bir sorunu çözdüm. Ben de çözümünü uygulamaya PostGIS , Hadoop'un
ve MPI . Tezimin tam sürümü burada , ancak bu soruna uygulanan önemli noktaları özetleyeceğim.
MapReduce bu problemi çözmek için iyi bir platform değil çünkü günah paketini işlemek için tüm veri setine (veya dikkatlice seçilmiş bir altküme) erişim gerektiriyor. MapReduce ikincil veri kümelerini iyi işlemez.
Ancak, MPI bunu oldukça kolay bir şekilde çözebilir. En zor kısım, verilerin nasıl bölüneceğini belirlemektir. Bu bölme, ne kadar veri bulunduğuna, kaç tane işlemci kullanmanız gerektiğine ve işlemci başına ne kadar belleğe sahip olduğunuza dayanır. En iyi ölçeklendirme (ve dolayısıyla performans) için, parsel veri setinin bellekte (tüm bilgisayarlarınızda) birden fazla kopyasının aynı anda olması gerekir.
Bunun nasıl çalıştığını açıklamak için, 50 bilgisayarınızın her birinin 8 işlemcisi olduğunu varsayacağım. Daha sonra her bir bilgisayara parsellerin 1 / 50'sini kontrol etme sorumluluğu vereceğim. Bu kontrol, her biri parsellerin aynı 1 / 50'sinin ve parsel veri setinin 1 / 8'inin birer kopyasına sahip olan bilgisayarda 8 işlemle gerçekleştirilecektir. Grupların tek bir makine ile sınırlı olmadığını, makine sınırlarını geçebileceğini lütfen unutmayın.
İşlem, algoritmayı çalıştıracak ve 1/50 nci parseller için p parselleri ve 1 / 8'inci parsellerin q için parsellerini alacaktır. İç döngüden sonra, aynı bilgisayardaki tüm işlemler parselin yayınlanıp yayınlanmayacağını belirlemek için birlikte konuşacaktır.
Benim sorunumda buna benzer bir algoritma kullandım. Kaynağı burada bulabilirsiniz .
Bu tür optimize edilmemiş algoritmalarla bile, programcı zamanı için son derece optimize edilmiş etkileyici sonuçlar elde ettim (aptal basit bir algoritma yazabildiğim ve hesaplama hala yeterince hızlı olacağı için). Optimize etmek için bir sonraki nokta (gerçekten ihtiyacınız varsa), her bir işlem için ikinci veri setinin dörtlü bir dizinini (q'dan nereden alacağınız) ayarlamaktır.
Asıl soruya cevap vermek için. Bir mimarisi var: MPI + GEOS. ClusterGIS uygulamamdan biraz yardım alın ve çok şey yapılabilir. Tüm bu yazılımlar açık kaynaklı olarak bulunabilir, bu nedenle lisans ücreti alınmaz. Linux üzerinde çalıştığım için Windows'un ne kadar taşınabilir olduğundan (belki Cygwin ile) emin değilim. Bu çözüm EC2, Rackspace veya mevcut olan bulutlara dağıtılabilir. Geliştirdiğimde bir Üniversitede özel bir bilgi işlem kümesi kullanıyordum.