Es stehen Bibliotheken zur Verfügung, mit denen kürzeste Pfade für solche Diagramme berechnet werden können. Wie machen sie das? Wie laden sie den erforderlichen Teil des Diagramms, um den Dijkstra-Algorithmus auszuführen?
Sie können eine Datenbank, ein benutzerdefiniertes Dateiformat zum Lesen von Datenträgern und eine speicherinterne Einstellung verwenden.
Nach meiner Erfahrung ist die Verwendung einer Datenbank jedoch ungefähr 5- bis 10-mal langsamer und speicherintensiver als das Schreiben eines eigenen Dateiformats auf der Grundlage eines "einfachen" Formats für verknüpfte Listen.
Das Gute ist, dass es mehrere Open-Source-Software-Frameworks mit OSM gibt, so dass Sie direkt in den Code hineinschauen können (siehe hier) . In der Open-Source-Routing-Engine von GraphHopper ist es sehr einfach, von einer Einstellung für die Speicherzuordnung (auf Disc-Basis) auf die Einstellung für den internen Speicher umzuschalten - beide verwenden dasselbe Format. Die "mmap" -Einstellung ermöglicht sogar die Verwendung auf speicherbeschränkten Mobilgeräten. Letztere ist wesentlich schneller, wenn Sie über den erforderlichen Arbeitsspeicher verfügen, z. B. auf einem Server. ZB für einen weltweiten Graphen (> 100 Millionen Knoten) benötigen Sie dann ungefähr 8-10 GB RAM, plus viel mehr RAM, wenn Sie alles weiter beschleunigen möchten, z. B. mit Kontraktionshierarchien - ungefähr 5-8 GB mehr für jedes Fahrzeug, das Sie möchten.
Das Format ist sehr simpel und speichert im Grunde nur die Daten, die Sie mit ein paar Tricks benötigen, um es kompakt zu machen. Lesen Sie hier mehr darüber . Haftungsausschluss: Ich bin der Autor von GraphHopper.
Zu den anderen Antworten:
Der anwendbare Dijkstras-Algorithmus wird für dieses Problem als nicht optimal angesehen
Der "normale" Dijkstra kann eine sehr vernünftige Leistung erbringen (<1s für landesweite Abfragen wie Ihr 3-Millionen-Knoten-Beispiel) und ist im "theoretischen Sinne" optimal , benötigt jedoch eine gewisse Anpassung , um in Produktionsszenarien schnell zu werden. Und Techniken wie Kontraktionshierarchien verwenden eine bidirektionale Modifikation davon und arbeiten sehr gut.
Straßennetze sind hierarchisch und planar.
Straßennetze sind nur für Autos hierarchisch und nicht eben (Brücken, Tunnel, ...)