opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

[ogr2ogr] le join sono molto lente, come velocizzarle #235

Closed pigreco closed 1 year ago

pigreco commented 1 year ago

Il seguente costrutto permette di fare una join tabellare tra uno shapefile e una tabella dbf; entrambi i file hanno meno di 3000 record, ma la join impiega oltre 40 secondi.

time ogr2ogr -progress -sql "select s.AC_VEI_SED AS AC_VEI_SED, s.ClassREF AS ClassREF, t.ZON_IN_TY AS ZON_IN_TY, t.ID AS ID, t.FONTE AS FONTE, t.LIVELLO AS LIVELLO from butta15a_Dissolve1 s left join './id15a_to_ZON_IN_12113_t.dbf'.id15a_to_ZON_IN_12113_t t on s.FIRST_SubR = t.SubRegID" ./shape_join4.shp ./butta15a_Dissolve1.shp

ho letto qui che è possibile velocizzare le join creando un indice:

ogrinfo -sql "CREATE INDEX ON butta15a_Dissolve1 USING FIRST_SubR" ./butta15a_Dissolve1.shp

ma non noto benefici, anzi sembra che impieghi più tempo, dai 46 sec a 48 sec.

cosa sbaglio?

forse l'indice va creato su entrambi i campi correlati? no, non migliora :-(

image

--

file: dati_test.zip

uso GDAL 3.4.0, released 2021/11/04 su Ubuntu 20.04

aborruso commented 1 year ago

Ciao @pigreco nel tuo file di esempio il file si chiama butta15b_Dissolve1 e non butta15a_Dissolve1.

E inoltre manca proprio quello con estensione shp, manca butta15b_Dissolve1.shp.

Non ho capito qualcosa io?

pigreco commented 1 year ago

@aborruso

Non ho capito qualcosa io?

ho sbagliato a copiare, ecco i file corretti dati_test2.zip

aborruso commented 1 year ago

Caro @pigreco il kernel linux sotto wsl, è ottimizzato per girare nelle cartelle linux di wsl.

La tua home linux la raggiungi con cd ~. Se dai poi pwd avrai la stampa del percorso (non serve, è soltanto per curiosità).

Crea qui una cartella di lavoro mkdir -p tmp e poi entraci dentro. Una volta dentro puoi aprirla in esplora risorse e metterci i tuoi file (basta che dai explorer.exe . per aprire la cartella)

Rilancia il comando dalla shell da quella cartella (~/tmp).

Detto questo, ogr non è una scheggia per queste cose, specie con i dbf. Da me lo fa in circa 8 secondi.

Magari da spatialite è tutto più rapido

aborruso commented 1 year ago

Un'altra modalità potrebbe essere quella di estrarre il CSV da id15a_to_ZON_IN_12113_t e poi usare mapshaper per un join tra l'shp e il CSV. Immagino che sia molto veloce

ogr2ogr -f "CSV" id15a_to_ZON_IN_12113_t.csv id15a_to_ZON_IN_12113_t.dbf

E poi un esempio generale di JOIN in mapshaper è

mapshaper states.shp -join demographics.txt keys=STATE_FIPS,FIPS string-fields=FIPS -o out.shp

Con string-fields forzi eventuali campi da forzare come stringa, e con keys i campi chiave.

pigreco commented 1 year ago

Caro @aborruso, ricordo che me lo hai già spiegato varie volte, ma utilizzandolo poco lo scordo sempre:

Da me lo fa in circa 8 secondi.

da me poco meno di 4 sec:

image

grazie :-)

pigreco commented 1 year ago

@aborruso

Un'altra modalità potrebbe essere quella di estrarre il CSV ...

è imbarazzante, meno di un secondo:

image

nello script.sh

#!/bin/bash

ogr2ogr -f "CSV" id15a_to_ZON_IN_12113_t.csv id15a_to_ZON_IN_12113_t.dbf

mapshaper butta15a_Dissolve1.shp -join id15a_to_ZON_IN_12113_t.csv keys=FIRST_SubR,SubRegID string-fields=FIRST_SubR,SubRegID -o out.shp
aborruso commented 1 year ago

Sarà una bella ricetta

pigreco commented 1 year ago

Ricetta fatta e pubblicata

https://tansignari.opendatasicilia.it/ricette/bash/velocizzare_una_join_tabellare/

grazie mille chiudo