Ci sono librerie disponibili per calcolare i percorsi più brevi su tali grafici. Come lo fanno? Più specificamente, come caricano la parte richiesta del grafico per eseguire l'algoritmo di Dijkstra?
È possibile utilizzare un DB, un formato file personalizzato da leggere dal disco e un'impostazione in memoria.
Ma dalla mia esperienza nell'uso di un DB è circa 5-10 volte più lento e molta più memoria rispetto alla scrittura del proprio formato di file basato su un "semplice" formato di elenco collegato.
La cosa buona è che ci sono diversi framework software che utilizzano OSM che sono open source in modo da poter guardare nel codice ad es. Vedere qui . Nel motore di routing open source GraphHopper è molto semplice passare da un'impostazione mappata in memoria (basata su disco) a un'impostazione in memoria, entrambi utilizzando lo stesso formato. L'impostazione "mmap" consente persino l'utilizzo su dispositivi mobili con limitazioni di memoria e quest'ultimo funziona molto più velocemente se si dispone della RAM necessaria, ad esempio su un server. Ad esempio, per un grafico mondiale (> 100 milioni di nodi) sono necessari circa 8-10 GB di RAM, oltre a molta più RAM se si desidera accelerare ulteriormente, ad esempio con Gerarchie di contrazioni - circa 5-8 GB in più per ogni veicolo desiderato.
Il formato è molto semplicistico e fondamentalmente memorizza solo i dati necessari con alcuni accorgimenti per renderlo compatto. Leggi di più qui . Disclaimer: sono l'autore di GraphHopper.
Per quanto riguarda le altre risposte:
L'algoritmo di Dijkstras mentre applicabile non è considerato ottimale per questo problema
Il Dijkstra "normale" può funzionare in modo molto ragionevole (<1s per query a livello nazionale come nell'esempio dei nodi 3mio) ed è ottimale in senso teorico, ma necessita di un po 'di ottimizzazione per ottenere velocemente scenari di produzione. E tecniche come la Contraction Hierachies ne usano una modifica bidirezionale e si comportano molto bene.
le reti stradali sono gerarchiche e planari.
le reti stradali sono gerarchiche solo per auto e non planari (ponti, tunnel, ...)