[Gfoss] VirtualKNN in SpatiaLite 5

a.furieri a lqt.it a.furieri a lqt.it
Lun 19 Apr 2021 20:20:53 CEST


On Mon, 19 Apr 2021 19:36:25 +0200, Marco Curreli wrote:
> On 19.04.21, a.furieri a lqt.it wrote:
>> On Mon, 19 Apr 2021 03:20:37 -0700 (MST), pigreco wrote:
>> >
>> > dati due tabelle, una con circa 3000 punti e un'altra con circa 
>> 10000
>> > linee
>> > (assi stradali); trovare, per ogni punto, l'asse stradale più 
>> vicino.
>
> Con v.distance di GRASS è molto più veloce.
>

Sorpresona ... alla fine si scopre che il miglior tempo su
SpatiaLite lo si ottiene usando l'approccio classicissimo
lasciando perdere il KNN :-D

SELECT a.pk as fid, Min(ST_Distance(a.geom, zz.geom)) AS distance, 
zz.pk as pk_punti
FROM strade_palermo as a, inc2k18Palermo as zz
WHERE a.pk IN (
       SELECT rowid
       FROM SpatialIndex
       WHERE f_table_name = 'strade_palermo' AND search_frame = zz.geom)
GROUP by zz.pk;

chiude con un tempo superstellare di 0.409 secondi
(si, avete letto bene: meno di mezzo secondo)

conclusione: il KNN e' un metodo sofisticato basato sulle API
"advanced" di SQLite che consentono l'introspezione degli R*Tree.
nulla assicura che sia il metodo in grado di dare i risultati
migliori in assoluto.

sarebbe casomai interessante indagare come evolvono i tempi
quando si passa di risolvere problemi piu' complessi (tipo
svariati milioni di righe e di punti) ... magari nella
prossima vita, quando magari avremo piu' tempo libero
per divertici a fare benchmarking ;-)

ciao Sandro



Maggiori informazioni sulla lista Gfoss