Hal pertama yang harus diperhatikan tentang masalah ini adalah data apa yang dibutuhkan di mana dan kapan. Untuk melakukannya, saya biasanya mulai dengan versi serial masalah yang bodoh.
Temukan semua paket bernilai lebih dari x $ / acre yang berada dalam y kaki dari paket lain yang dihargai kurang dari z $ / acre.
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
Meskipun algoritma ini tidak dioptimalkan, itu akan menyelesaikan masalah.
Saya memecahkan masalah yang sama untuk tesis Master saya yang menemukan paket terdekat untuk setiap poin dalam dataset. Saya mengimplementasikan solusi di PostGIS , Hadoop
, dan MPI . Versi lengkap dari tesis saya ada di sini , tetapi saya akan merangkum poin-poin penting yang berlaku untuk masalah ini.
MapReduce bukan platform yang baik untuk menyelesaikan masalah ini karena membutuhkan akses ke seluruh dataset (atau subset yang dipilih dengan cermat) untuk memproses paket sin gle. MapReduce tidak menangani dataset sekunder dengan baik.
Namun, MPI dapat menyelesaikannya dengan cukup mudah. Bagian tersulit adalah menentukan cara membagi data. Pemisahan ini didasarkan pada berapa banyak data yang ada, berapa banyak prosesor yang harus Anda jalankan, dan berapa banyak memori yang Anda miliki per prosesor. Untuk penskalaan terbaik (dan karenanya kinerja), Anda harus memiliki beberapa salinan dataset paket dalam memori (di semua komputer Anda) sekaligus.
Untuk menjelaskan cara kerjanya, saya akan berasumsi bahwa masing-masing dari 50 komputer Anda memiliki 8 prosesor. Saya kemudian akan menugaskan masing-masing komputer tanggung jawab untuk memeriksa 1/50 dari paket. Pemeriksaan ini akan dilakukan oleh 8 proses di komputer, yang masing-masing memiliki salinan 1/50 bagian dari paket dan 1/8 dari dataset paket. Harap dicatat bahwa grup tidak terbatas pada satu mesin saja, tetapi dapat melewati batas mesin.
Proses ini akan menjalankan algoritma, mendapatkan parsel untuk p dari set parsel 1/50, dan parsel untuk q dari set 1/8. Setelah loop dalam, semua proses pada komputer yang sama akan berbicara bersama untuk menentukan apakah paket tersebut harus dipancarkan.
Saya menerapkan algoritma yang mirip dengan ini untuk masalah saya. Anda dapat menemukan sumbernya di sini .
Bahkan dengan algoritma yang tidak dioptimalkan semacam ini saya dapat memperoleh hasil yang mengesankan yang sangat dioptimalkan untuk waktu programmer (yang berarti bahwa saya bisa menulis algoritma sederhana yang bodoh dan komputasinya masih cukup cepat). Tempat berikutnya untuk mengoptimalkan (jika Anda benar-benar membutuhkannya), adalah untuk mengatur indeks quadtree dari dataset kedua (di mana Anda mendapatkan q dari) untuk setiap proses.
Untuk menjawab pertanyaan awal. Ada arsitektur: MPI + GEOS. Lemparkan sedikit bantuan dari implementasi ClusterGIS saya dan cukup banyak yang bisa dilakukan. Semua perangkat lunak ini dapat ditemukan sebagai sumber terbuka, sehingga tidak ada biaya lisensi. Saya tidak yakin bagaimana portabel untuk Windows itu (mungkin dengan Cygwin) karena saya bekerja di linux. Solusi ini dapat digunakan pada EC2, Rackspace, atau cloud apa pun yang tersedia. Ketika saya mengembangkannya saya menggunakan cluster komputasi khusus di sebuah Universitas.