Tuesday, 6 April 2010

Operazioni GIS e velocità dei processamenti con Python

Python è un linguaggio di scripting che sta vivendo un periodo di notevole popolarità grazie al suo essere un linguaggio di alto livello e poliedrico. Dal lato GIS, può essere collegato a software GIS free o commerciali, per esempio Grass o ArcGis, e in un ambiente come FWTools può svolgere processamenti GIS senza bisogno di appoggiarsi a software GIS esterni.
Disponendo di funzionalità GIS, è opportuno sempre appoggiarsi a queste, oppure per questioni di tempi di esecuzione dei programmi, può essere opportuno rinunciare a queste funzionalità e utilizzare le strutture dati e le funzionalità standard interne del linguaggio?
In questo post, riporto un caso in cui il processamento di dati GIS, puntuali, è risultato più veloce di un ordine di grandezza utilizzando un normale ciclo for su dati letti e conservati in una lista, piuttosto che utilizzando filtri spaziali (con l'estensione ogr) sugli stessi dati conservati in uno shapefile. Le operazioni di filtro spaziale con la funzione SetSpatialFilterRect applicata su varie decine di migliaia di punti richiedevano circa un secondo (100 casi in 111.5 sec), in ambiente FWTools con ogr. La stessa operazione con un normale ciclo for sullo stesso dataset in una lista richiedeva circa un decimo di secondo (100 casi in 9.6 sec). Trattandosi di operazione da ripetere per decine di migliaia di casi si capisce che si passa da tempi di decine di ore a ore, con un forte guadagno di tempi.
Per cui, è opportuno verificare, quando si devono processare notevoli quantità di dati, se piuttosto che usare eleganti funzioni GIS da estensioni come ogr, non sia più veloce usare banali operatori sui dati conservati in strutture dati di Python, come liste o simili.

No comments: