Caching-Geschwindigkeit für Kacheln erhöhen (TileStache)

13

Ich bediene Vektorkacheln mit TileStache . Ich habe alles so eingerichtet, wie ich es möchte. Meine Daten werden in Postgres gespeichert und ich verwende den VecTiles- Anbieter, um GeoJSON- Kacheln zu liefern .

Ich möchte alle meine Kacheln zwischenspeichern, damit sie schneller geliefert werden. Ich benutze tilestache-seed.py, um meinen Cache zu säen. Ich lasse auf mehreren Maschinen Tilestache-Seed laufen . Tilestache-Seed hat bis Zoomstufe 13 sehr gut funktioniert, aber danach dauert es viel zu lange, um die Kacheln zwischenzuspeichern. Nur für Zoomstufe 16 muss ich 5023772 Kacheln zwischenspeichern, und ich erhalte nur 100.000 bis 200.000 Kacheln pro Tag auf jeder Maschine.

Wie kann ich meine Kacheln schneller zwischenspeichern ? Gibt es eine Möglichkeit, tilestache-seed.py zu verfeinern und den Samen schneller zu machen?

Update: Ich habe versucht, räumliche Indizes für meine Tabellen zu erstellen (für die Geometriespalte und die Spalten, die zum Filtern von Daten durch die where-Klausel verwendet werden), und ich habe immer noch keine signifikante Steigerung der Kachelgeschwindigkeit festgestellt. Bei dieser Geschwindigkeit brauche ich nur für Zoom 17 einen Monat, und diese Zeit nimmt nur exponentiell zu, wenn ich auf Zoom 21 zugehe

Update 2: Ich habe versucht, auch materialisierte Ansichten zu erstellen, und es ist keine Änderung der Leistung festzustellen, sodass die Optimierung der Datenbank nicht funktioniert. Ich denke, ich muss die Datei tilestache-seed.py selbst optimieren oder einen neuen Weg finden, um die Kacheln zwischenzuspeichern.

Hardware-Informationen Ich führe die Caching-Prozesse auf 8 verschiedenen PCs aus, von denen einer ein i7 mit 32 GB RAM und einer ein i3 mit 4 GB RAM ist, aber beide geben mir fast die gleiche Caching-Geschwindigkeit (ca. 100.000 Kacheln pro Tag).

Hasan Mustafa
quelle

Antworten:

5

Ich würde sagen, dass bei einem Zoom von mehr als 15, wenn Sie Ihren Interessenbereich in kleinere Bereiche aufteilen (Begrenzungsrahmen), Sie diese in viel kürzerer Zeit zwischenspeichern können, indem Sie mehrere Prozesse auf einem einzigen Computer ausführen.

Wenn Sie beispielsweise Zoom 16 (mit 50.000.000 Kacheln) auf einem Computer ausführen und die durchschnittliche Geschwindigkeit für das Zwischenspeichern von Kacheln angeben, dauert dieser Vorgang etwa 40 bis 50 Tage. Nehmen wir an, Sie teilen diese Kacheln in zwei Teile auf und führen sie gleichzeitig auf dem Computer aus. Dann können Sie sie in 20 bis 25 Tagen zwischenspeichern, da der Prozess zum Zwischenspeichern von Kacheln nur etwa 30 Prozent Ihres Prozessors für einen einzelnen Prozess zum Zwischenspeichern von Kacheln benötigt Das liegt daran, dass ich das gleiche Problem habe und es bis zu einem gewissen Grad mein Problem gelöst hat.

Die Geschwindigkeit des Kachel-Caches wird nicht beeinflusst, wenn Sie einen einzelnen Prozess auf einem Computer oder mehrere Prozesse ausführen, die CPU-Auslastung jedoch erhöht wird.

Ich hoffe, dies wird dir helfen.

Shahzad Bacha
quelle
Das klingt nach dem besten, was ich bisher getan habe. Ich werde es ausprobieren und sehen, was passiert.
Hasan Mustafa
Dies ist die beste Lösung, die ich bisher gefunden habe, obwohl sie nicht ideal ist (ich hätte die tilestache-seed.py gerne feinabgestimmt) und gut genug funktioniert.
Hasan Mustafa
2

Standardmäßig erstellt shp2pgsql KEINE Indizes. Sie müssen übergeben -I, um einen räumlichen Index zu generieren. http://postgis.net/docs/manual-1.3/ch04.html#id435762

Überprüfen Sie, ob Ihre Tabelle einen Index hat, indem Sie \d tablenamein psql ausführen. In der Liste der Indizes sollte eine Zeile mit "gist" (sofern Sie keinen anderen Index ausgewählt haben) und dem Namen Ihrer Geometriespalte stehen.

Sie können auch eine nachträglich hinzufügen, siehe http://postgis.net/docs/manual-1.3/ch03.html#id434676 (lassen Sie sich von der Notiz über Verlust nicht abschrecken):

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );

Da Sie wahrscheinlich auch nicht-räumliche Spalten in Ihren Abfragen verwenden, möchten Sie normalerweise Indizes für jede Spalte erstellen, die für die Suche verwendet wird. Wenn zum Beispiel haben Sie eine Abfrage wie SELECT * FROM roads WHERE priority = 3;dann priorityverwendet wird , und das Hinzufügen eines Index für es wird deutlich Beschleunigungs-Dinge:

CREATE INDEX idx_roads_priority ON roads(priority);.

bugmenot123
quelle
Ich habe das Plugin "PostGIS Shapefile and DBF loader" in Postgres verwendet und einen Index erstellt: CREATE INDEX scale_geom_idx ON scale USING gist (geom). , automatisch, wenn ich meine Shapefiles importiere. Soll ich nach zusätzlichen Indizes suchen?
Hasan Mustafa
Hast du viele Reihen? Ist Ihre Erzeugung von Vektorkacheln von anderen Attributen abhängig (z. B. Unterauswahlen der Daten)?
Bugmenot123
Ja zu beiden, ich habe eine Menge Zeilen in einigen Tabellen, meine POI-Tabelle hat ungefähr 975.000 Zeilen und mein Straßen-Shapefile war 8,5 GB groß, bevor ich es in Postgres importierte. Ich verwende Abfragen, um Daten basierend auf Zoomstufen zu filtern: "10": "SELECT wkb_geometry AS Geometrie , Priorität, Name, Routennummer FROM Straßen WHERE Priorität IN (5,4,3)" Dies ist eine Abfrage, die ich verwende, um Straßen zurückzugeben auf Zoomstufe 10.
Hasan Mustafa
Erstellen Sie dann einen Index für jede Spalte, die Sie in einer WHERE-Klausel verwenden. Sie können bei Bedarf auch mehrspaltige Indizes erstellen.
Bugmenot123
Wie würde ich das machen, auf welcher Basis sollte ich die Indizes erstellen?
Hasan Mustafa
1

Wenn Sie eine Standardabfrage verwenden, sollten Sie auch eine materialisierte Ansicht aus der Abfrage erstellen und Ihre Kacheln daraus erstellen: http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

Damit erstellen Sie eine Tabelle, in der die Abfrage gespeichert ist (sodass Sie sie möglicherweise in Zukunft aktualisieren können). Stellen Sie sicher, dass Sie räumliche Indizes für die untergeordneten MVs haben, und Sie sind dann so schnell wie möglich.

Möglicherweise haben Sie einen räumlichen Index, aber Sie wählen nur einen Teil der Daten aus, was bedeutet, dass Sie den räumlichen Index nicht mehr verwenden ...

Alex Leith
quelle
Ich habe 11 verschiedene Tabellen, die ich abfragen möchte, um meine Kacheln zu erstellen. Heißt das, ich muss 11 materialisierte Ansichten erstellen? Und meine Abfragen ändern sich auch basierend auf den Zoomstufen.
Hasan Mustafa
Nun, wenn es nicht schnell genug ist, können Sie es vielleicht verbessern, indem Sie Ansichten der langsamsten select-Anweisungen erstellen. Beachten Sie, dass Sie aus jeder Select-Anweisung eine MV erstellen können, auch aus mehreren Tabellen, falls erforderlich.
Alex Leith
Wenn ich also aus all meinen Abfragen eine einzige MV mache, funktioniert das dann?
Hasan Mustafa
Das kannst du nicht machen. Machen Sie eine für Ihre langsamste Abfrage, vielleicht für eine einzelne Zoomstufe, und sehen Sie, ob es mich schneller macht.
Alex Leith
1
Wenn dies der Fall ist, hilft es nicht, die Datenbank zu optimieren. Schau tiefer.
Alex Leith