Das erste, was Sie mit diesem Problem zu tun haben, ist, welche Daten wo und wann benötigt werden. Dazu beginne ich normalerweise mit der blöden, seriellen Version des Problems.
Finden Sie alle Pakete mit einem Wert über x $ / Morgen, die sich innerhalb von y Fuß eines anderen Pakets mit einem Wert von weniger als z $ / Morgen befinden.
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
Dieser Algorithmus ist zwar nicht optimiert, löst jedoch das Problem.
Ein ähnliches Problem habe ich für meine Masterarbeit gelöst, bei der für jeden Punkt eines Datensatzes das nächstgelegene Paket gefunden wurde. Ich habe die Lösung in PostGIS , Hadoop
und MPI implementiert . Die Vollversion meiner Dissertation ist hier , aber ich werde die wichtigen Punkte zusammenfassen, die für dieses Problem gelten.
MapReduce ist keine gute Plattform, um dieses Problem zu lösen, da für die Verarbeitung eines einzelnen Pakets der Zugriff auf den gesamten Datensatz (oder eine sorgfältig ausgewählte Teilmenge) erforderlich ist. MapReduce verarbeitet sekundäre Datasets nicht gut.
MPI kann dies jedoch recht handlich lösen. Am schwierigsten ist es, zu bestimmen, wie die Daten aufgeteilt werden sollen. Diese Aufteilung basiert darauf, wie viele Daten vorhanden sind, auf wie vielen Prozessoren Sie sie ausführen müssen und wie viel Speicher Sie pro Prozessor haben. Für eine optimale Skalierung (und damit Leistung) müssen Sie mehrere Kopien des Paketdatensatzes gleichzeitig (auf allen Ihren Computern) im Speicher haben.
Um zu erklären, wie dies funktioniert, gehe ich davon aus, dass jeder Ihrer 50 Computer über 8 Prozessoren verfügt. Ich werde dann jedem Computer die Verantwortung übertragen, 1/50 der Pakete zu prüfen. Diese Überprüfung wird von 8 Prozessen auf dem Computer ausgeführt, von denen jeder eine Kopie desselben 1/50 Teils der Pakete und 1/8 des Paketdatensatzes hat. Bitte beachten Sie, dass die Gruppen nicht auf eine einzelne Maschine beschränkt sind, sondern Maschinengrenzen überschreiten können.
Der Prozess führt den Algorithmus aus und erhält die Pakete für p aus der 1/50-Menge von Paketen und die Pakete für q aus der 1/8-Menge. Nach der inneren Schleife sprechen alle Prozesse auf demselben Computer miteinander, um zu bestimmen, ob das Paket gesendet werden soll.
Ich habe einen ähnlichen Algorithmus für mein Problem implementiert. Die Quelle finden Sie hier .
Sogar mit dieser Art von nicht optimiertem Algorithmus konnte ich beeindruckende Ergebnisse erzielen, die für die Programmiererzeit stark optimiert waren (was bedeutete, dass ich einen dummen einfachen Algorithmus schreiben konnte und die Berechnung dennoch schnell genug sein würde). Der nächste zu optimierende Punkt (wenn Sie ihn wirklich benötigen) ist das Einrichten eines Quadtree-Index des zweiten Datensatzes (von dem Sie q erhalten) für jeden Prozess.
Um die ursprüngliche Frage zu beantworten. Es gibt eine Architektur: MPI + GEOS. Wenn Sie ein wenig Hilfe von meiner ClusterGIS-Implementierung einbringen, können Sie eine ganze Menge tun. All diese Software kann als Open Source gefunden werden, daher fallen keine Lizenzgebühren an. Ich bin mir nicht sicher, wie portabel es für Windows ist (vielleicht mit Cygwin), da ich unter Linux daran gearbeitet habe. Diese Lösung kann auf EC2, Rackspace oder einer beliebigen verfügbaren Cloud bereitgestellt werden. Als ich es entwickelte, verwendete ich einen dedizierten Computercluster an einer Universität.