この問題で最初に心配するのは、いつどこでどのデータが必要かということです。そうするために、私は通常、問題の馬鹿げたシリアルバージョンから始めます。
x $ /エーカー以上の値を持つすべての区画を、z $ / acre未満の値を持つ別の区画のyフィート以内にあるすべての区画を見つけます。
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のパーセルを取得します。内側のループの後、同じコンピューター上のすべてのプロセスが対話して、小包を放出する必要があるかどうかを判断します。
私の問題のためにこれと同様のアルゴリズムを実装しました。ここでソースを見つけることができます。
この種の最適化されていないアルゴリズムを使用した場合でも、プログラマーの時間に対して高度に最適化された印象的な結果を得ることができました(つまり、愚かな単純なアルゴリズムを記述でき、計算はまだ十分高速です)。(本当に必要な場合)最適化する次のスポットは、各プロセスの2番目のデータセット(qを取得する場所)のクアッドツリーインデックスを設定することです。
元の質問に答えるため。アーキテクチャがあります:MPI + GEOS。ClusterGISの実装から少し助けてください。多くのことができます。このソフトウェアはすべてオープンソースとして入手できるため、ライセンス料はかかりません。linuxで作業していたため、Windowsにどれだけ移植性があるのか(Cygwinを使用した場合)わかりません。このソリューションは、EC2、Rackspace、または利用可能なクラウドに展開できます。私が開発したとき、私は大学の専用計算クラスタを使用していました。