Ich schreibe eine datenintensive Webanwendung, die über Apache bereitgestellt wird. Meine Frage ist, wie die Verarbeitung am besten arrangiert werden kann, da es mehrere Optionen gibt.
Ich habe OpenLayers / JQuery / Javascript, PostGIS / Postgresql (mit pgsql), Python / Psycopg2, PHP zur Verfügung.
Die Datenbank enthält ungefähr 3 Millionen Zeilen und der Prototyp läuft derzeit wie folgt:
Der Benutzer klickt auf einen Punkt im OpenLayers-Fenster
Die Koordinate wird als AJAX-Anforderung an eine Python-Funktion auf dem Server gesendet
Derzeit ist meine Bewerbung zustandslos
Pythons psycopg2 wird verwendet, um eine gespeicherte pgsql-Prozedur aufzurufen, und ein größerer Satz von WKT-Werten (und ein Datenfeld) werden an das Python-Modul zurückgegeben
Das Datenfeld wird verwendet, um die WKT-Datensätze in Python wie folgt zu kategorisieren: Alle WKT-Werte werden in eine von 5 Gruppen eingeteilt. Etwa 1% der WKT-Werte werden tatsächlich geändert.
Die fünf Sätze / Gruppen von WKT werden gepuffert, um fünf verschiedene Polygone zu erstellen. Ich rufe derzeit eine gespeicherte Prozedur in der Datenbank auf, um dies zu tun. Dies wiederum verwendet nur ST_BUFFER. (Ich habe überlegt, Shapely zu verwenden, bin mir aber nicht sicher, ob es einen Leistungsvorteil gibt, da in beiden Fällen die GEOS-Bibliothek verwendet wird ...)
Schließlich werden die 5 WKT-Textwerte in eine JSON-Zeichenfolge eingeschlossen und zum Rendern als fünf Ebenen an OpenLayers zurückgesendet.
Ich stelle fest, dass die Engpässe die anfängliche räumliche Suche und die letzte Pufferstufe sind.
Ich denke die Frage ist:
Gibt es eine bessere Möglichkeit, Dinge zu arrangieren? Sollte beispielsweise die gesamte Datenverarbeitung in PostgreSQL erfolgen (z. B. mit Cursorn), und ist dies eine gute Sache in Bezug auf Wartung und Leistung? Wäre es besser, einen Kachelserver zu verwenden, um zu vermeiden, dass lange WKT-Zeichenfolgen an den Webclient übergeben werden? Wie würden Sie es ansprechen?
quelle
Antworten:
Pufferengpass
Wenn Sie ST_Buffer verwenden, können Sie die Komplexität der resultierenden Form reduzieren, indem Sie eine niedrigere Option num_seg_quarter_circle hinzufügen. Dies sollte den Verarbeitungsaufwand beim Puffern und bei nachfolgenden Vorgängen verringern.
Aus der PostGIS-Dokumentation:
Im Allgemeinen erzielen Sie in PostGIS eine bessere Leistung, wenn Sie Abfragen für vorhandene ordnungsgemäß indizierte Tabellen ausführen. Auf diese Weise haben Sie einfachen Zugriff auf verschiedene Optimierungen (z. B. Clustering). Erwägen Sie, die 1%, die sich separat ändern, zu verarbeiten und die beiden am Ende zusammenzuführen.
quelle
Wenn Sie überhaupt nicht an Architektur denken, möchten Sie für alle Web-Mapping-Anwendungen so viel wie möglich im Voraus verarbeiten. Dies bedeutet, dass, wenn Sie können, Puffer vorberechnet werden sollten, alle Ihre Daten im Ausgabe-SRS usw. sein sollten. Natürlich müssen einige Daten und Berechnungen dynamisch sein.
Ich schlage vor, dass Sie sich über Python hinaus MapServer und Geoserver ansehen, um die Berechnungen durchzuführen und die Ausgabe zu erstellen. Beide könnten Bildkacheln oder GeoJSON-Ausgaben erzeugen. Beide Anwendungen können PostGIS als Backend verwenden.
quelle