Aumenta la velocità di memorizzazione nella cache delle piastrelle (TileStache)


13

Sto servendo tessere vettoriali usando TileStache , ho tutto impostato come voglio. I miei dati sono archiviati in Postgres e sto usando il provider VecTiles per servire i riquadri GeoJSON .

Voglio mettere in cache tutte le mie tessere per rendere le tessere più veloci. Sto usando tilestache-seed.py per eseguire il seeding della cache. Sto eseguendo semi di tilestache su diverse macchine. Il seme di Tilestache ha funzionato davvero bene fino al livello di zoom 13, ma dopo ci vuole troppo tempo per memorizzare nella cache i riquadri. Solo per Zoom Level 16 ho 5023772 tessere da memorizzare nella cache e ricevo solo 100k-200k tessere al giorno su ogni macchina.

Come posso rendere più veloce la cache delle mie tessere ? C'è un modo per mettere a punto tilestache-seed.py e farlo seminare più velocemente?

Aggiornamento: ho provato a costruire indici spaziali sui miei tavoli (sulla colonna della geometria e sulle colonne utilizzate per filtrare i dati attraverso la clausola where) e non ho ancora visto un aumento significativo della velocità di piastrellatura. A questo ritmo solo Zoom 17 mi richiederà un mese e questa volta aumenterà in modo esponenziale man mano che mi sposto verso Zoom 21

Aggiornamento 2: ho provato anche a realizzare viste materializzate e non vi sono cambiamenti evidenti nelle prestazioni, quindi l'ottimizzazione del database non funziona. Penso che dovrò ottimizzare il tilestache-seed.py stesso o escogitare un nuovo modo per memorizzare nella cache i riquadri.

Informazioni sull'hardware Sto eseguendo i processi di memorizzazione nella cache su 8 PC diversi, uno dei quali è un i7 con RAM da 32 GB e un altro è un i3 con RAM da 4 GB, ma entrambi mi danno quasi la stessa velocità di memorizzazione nella cache (circa 100.000 tessere al giorno)

Risposte:


5

Direi che per uno zoom maggiore di 15, se dividi la tua area di interesse in aree più piccole (Bounding box), sarai in grado di memorizzarle nella cache in molto meno tempo eseguendo più processi su una singola macchina.

Ad esempio, stai eseguendo lo zoom 16 (con 50.000,00 di tessere) su una macchina e in base alla velocità media di memorizzazione nella cache delle tessere, questo processo verrà completato in circa 40-50 giorni. Diciamo che hai diviso questi riquadri in due e li hai eseguiti simultaneamente sulla macchina, quindi sarai in grado di memorizzarli nella cache in 20-25 giorni perché il processo di seeding di tilestache utilizza solo circa il 30 percento del tuo processore per un singolo processo di caching e so questo perché ho lo stesso problema una volta e fino ad un certo punto risolto il mio problema.

Non influirà sulla velocità di memorizzazione nella cache dei riquadri se si esegue un singolo processo su una macchina o più processi ma l'utilizzo della CPU verrà aumentato.

Spero che questo ti possa aiutare.


Questa è la cosa migliore da fare finora, controllerò provare questo e vedere cosa succede.
Hasan Mustafa,

Questa è la migliore soluzione che ho trovato finora, anche se non è l'ideale (mi sarebbe piaciuto mettere a punto il file tilestache-seed.py) funziona abbastanza bene.
Hasan Mustafa,

2

Per impostazione predefinita shp2pgsql NON crea indici. Devi passare -Iper farlo generare un indice spaziale. http://postgis.net/docs/manual-1.3/ch04.html#id435762

Controlla se la tua tabella ha un indice eseguendo \d tablenamein psql. Nell'elenco degli indici dovrebbe essere presente una riga con "gist" (a meno che non sia stato selezionato un indice diverso) e il nome della colonna della geometria.

Puoi aggiungerne uno anche dopo il fatto, vedi http://postgis.net/docs/manual-1.3/ch03.html#id434676 (non farti spaventare dalla nota sulla perdita):

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

Dal momento che probabilmente si utilizzano anche colonne non spaziali nelle query, in genere si desidera creare indici per ogni colonna utilizzata per la ricerca. Se ad esempio hai una query come SELECT * FROM roads WHERE priority = 3;allora priorityviene utilizzata e l'aggiunta di un indice per accelerare notevolmente le cose:

CREATE INDEX idx_roads_priority ON roads(priority);.


Ho usato il plug-in "PostGIS Shapefile e DBF loader" in Postgres, ha creato un indice: CREATE INDEX scale_geom_idx ON scale USANDO gist (geom). , automaticamente quando ho importato i miei shapefile. Dovrei cercare di creare indici aggiuntivi?
Hasan Mustafa,

Hai molte file? La tua generazione di tessere vettoriali dipende da altri attributi (ad esempio sottoselezioni dei dati)?
bugmenot123

Sì ad entrambi, ho molte righe in alcune tabelle, la mia tabella POI ha circa 975.000 righe e il mio file di forma delle strade era di 8,5 GB prima di importare in Postgres. Sto usando le query per filtrare i dati in base ai livelli di zoom: "10": "SELEZIONA wkb_geometry AS geometria , priorità, nome, route_num DA strade DOVE priorità IN (5,4,3)" questa è una domanda che sto usando per restituire strade al livello di zoom 10.
Hasan Mustafa,

Quindi crea un indice su ogni colonna che usi in una clausola WHERE. Puoi anche creare indici multi-colonna se necessario.
bugmenot123

Come farei per farlo, su quali basi dovrei creare gli indici?
Hasan Mustafa,

1

Un'altra cosa da provare se si utilizza una query standard è la creazione di una vista materializzata dalla query e la creazione di riquadri da quello: http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

Ciò che farà sarà renderti una tabella che memorizza la query (in modo da poterlo aggiornare in futuro). Assicurati di avere indici spaziali sui MV secondari e poi sarai il più veloce possibile.

Quello che potrebbe accadere è che hai un indice spaziale, ma poi stai selezionando solo alcuni dei dati, il che significa che non stai più usando l'indice spaziale ...


Ho 11 diverse tabelle che sto interrogando per creare le mie tessere, significa che dovrò fare 11 viste materializzate? E le mie query cambiano anche in base ai livelli di zoom.
Hasan Mustafa,

Bene, se non è abbastanza veloce, forse fare delle visualizzazioni delle dichiarazioni di selezione più lente sarà in grado di migliorarlo. Si noti che è possibile creare una MV di qualsiasi istruzione select, anche da più tabelle se necessario.
Alex Leith,

Quindi, se realizzo un singolo MV basato su tutte le mie domande, funzionerà?
Hasan Mustafa,

Non puoi farlo. Creane uno per la tua query più lenta, magari per un singolo livello di zoom, e vedi se mi rende più veloce.
Alex Leith,

1
Bene, in tal caso, l'ottimizzazione del database non sarà di aiuto. Guarda più in profondità.
Alex Leith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.