Есть библиотеки, доступные для вычисления кратчайших путей на таких графиках. Как они это делают? В частности, как они загружают необходимую часть графа для запуска алгоритма Дейкстры?
Вы можете использовать БД, пользовательский формат файла для чтения с диска и настройки в памяти.
Но по моему опыту использование БД примерно в 5-10 раз медленнее и требует гораздо больше памяти, чем запись собственного формата файла на основе «простого» формата связанного списка.
Хорошо, что есть несколько программных сред, использующих OSM, которые имеют открытый исходный код, поэтому вы можете посмотреть прямо в код, например, см. Здесь . В движке маршрутизации с открытым исходным кодом GraphHopper очень легко переключиться с настройки отображения памяти (на основе диска) на настройку в памяти - оба в одном и том же формате. Параметр «mmap» позволяет даже использовать мобильные устройства с ограниченным объемом памяти, и последние работают намного быстрее, если у вас есть необходимый объем оперативной памяти, например, на сервере. Например, для всемирного графика (> 100 миллионов узлов) вам потребуется около 8-10 ГБ ОЗУ, плюс много ОЗУ, если вы хотите еще больше ускорить процесс, например, с помощью иерархии сжатия - примерно на 5-8 ГБ больше для каждого автомобиля, который вы хотите.
Формат очень прост и в основном хранит только те данные, которые вам нужны, с помощью нескольких приемов, чтобы сделать его компактным. Подробнее об этом читайте здесь . Отказ от ответственности: я автор GraphHopper.
Что касается других ответов:
Алгоритм Дейкстры, хотя и применим, считается неоптимальным для этой задачи
«Нормальный» Dijkstra может работать очень разумно (<1 с для запросов по всей стране, как, например, ваш узел 3mio) и является оптимальным в «теоретическом смысле», но нуждается в небольшой настройке, чтобы быстро работать в производственных сценариях. А такие методы, как Contraction Hierachies, используют его двунаправленную модификацию и работают очень хорошо.
Дорожные сети являются иерархическими и плоскими.
дорожные сети являются иерархическими только для автомобилей, а не плоскими (мосты, туннели, ...)