Dlaczego jakakolwiek funkcja routingu pgr_ * trwa wiecznie na podstawie danych OSM w DB obsługującej pgrouting

9

Załadowałem niemiecki zestaw danych OSM do DB pgrouting przy użyciu osm2po 4.7.7. Wszystko działa dobrze, mam skonfigurowane osm2po poprzez jego konfigurację i działa jak urok dzięki części Java.

Miałem tabelę * _2po_4pgr zaimportowaną bez żadnych problemów. Nawet tabela * 2po_v jest importowana, choć nie do końca rozumiem jej związek.

Wykonałem funkcję pgr_createTopology, która działała dość długo (12000 sek.) Podczas obliczania wszystkich krawędzi o długości 6 m. Myślałem, że to załatwi sprawę, ale wciąż jest nieznośnie powolna.

Chciałbym wiedzieć, czy coś zapomniałem. Myślałem o użyciu pgRouting zamiast biblioteki Java, ale w tej chwili jego wydajność nie jest porównywalna.

Johnny Cusack
źródło
1
czy stworzyłeś indeksy, czy dostroiłeś zmienne pamięci postgis? Metoda createTopology jest uruchamiana tylko raz dla całego zestawu danych, więc jej wydajność nie ma tak dużego znaczenia. Dygresja. Miałem całą Finlandię z zestawu danych digiroad (jak 2G sieci drogowej) i zwracałem wyniki w maks. 250 ms, zwykle 125 ms bez żadnych optymalizacji. Tak więc powinno być lepiej teraz dni
simplexio
Indeksy w kolumnie źródłowej i docelowej są automatycznie tworzone przez generator skryptów osm2po. Potrzebujesz więcej? Zmieniłem zmienne work_mem / Maintenance_work_mem na wartość GigaByte, zrestartowałem, wciąż nie ma zmian. Czy jest jakiś szablon skryptu uruchamiania, którego mógłbym potrzebować?
Johnny Cusack
1
Hmmm ... Czym zajmuje się createTopology ()? Mam na myśli, że osm2po już tworzy topologię opartą na identyfikatorach węzłów OSM. Więc nie ma potrzeby biegać coś. znowu podobny. Do pgRouting (shortest_path & shortest_path_astar) potrzebujesz tylko utworzonej tabeli 4pgr. To wszystko.
Carsten
Mam teraz zestaw danych z Finlandii, postgis 2.0.3, pgrouting 2.0.0-dev. I muszę powiedzieć, że to jest powolne. przez ponad 1 sekundę dla wyniku przy użyciu pgr_astar (). Sprawdzam, czy dostaję to trochę szybciej
simplexio

Odpowiedzi:

5

Problem z wydajnością pgRouting polega na tym, że nowe pgr_astar i pgr_dijkstra używają całego wykresu (co gwarantuje rozwiązanie, jeśli takie istnieje). Prostym rozwiązaniem dla uzyskania lepszej wydajności jest ograniczenie wykorzystywanego wykresu do mniejszego obszaru. Ma swoje własne problemy, takie jak czasami może tworzyć wykresy, których nie można rozwiązać

 (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1 WHERE l1.source =7 OR l1.target = 12) 

Tworzy BBOX ponad kolekcję źródłową i docelową i rozwija ją o 0,1 stopnia, następnie to samo zapytanie służy do ograniczenia wielkości wykresu w zapytaniu pgr_

Dijkstra od 1,2 s do ~ 65 ms

SELECT  seq, id1 AS node, id2 AS edge, g.geom_way as the_geom
    FROM pgr_dijkstra(
            'SELECT id, source, target, cost FROM hh_2po_4pgr as r, 
            (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    ) as r INNER JOIN hh_2po_4pgr as g ON r.id2 = g.id ;

A * od 2s do ~ 50ms

SELECT seq, id1 AS node, id2 AS edge, cost
    FROM pgr_astar(
           'SELECT id, source, target, cost, x1,y1,x2,y2 FROM hh_2po_4pgr as r, 
             (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    );

osm2po został użyty do importowania danych (najnowsza Finlandia) do tabeli Postgis. dodano indeks gist do kolumny geom_way i uruchomiono analizę próżni dla bazy danych. pamięć współdzielona 1G. workmem 512M

simplexio
źródło
Miałem ten sam pomysł z obwiednią, wciąż ponad 90 sekund, nawet z ustawionymi zmiennymi pamięci itp.
Johnny Cusack
mam 380k linii? prawdopodobnie masz coś w rodzaju linii 3M + w tablicy routingu?
simplexio
1
Jest to jeden z głównych problemów Postgres, aby nie buforować całego wykresu. Działa dość szybko. Ale muszę połączyć go z innymi tabelami bazy danych, które w obecnej sytuacji (testowej) tworzą ogromne wąskie gardło z zaledwie 5qps (zapytania na sekundę)
Johnny Cusack
1
Właśnie załadowałem podzbiór 1M wierszy do ramdysku do porównania. pgr_dijkstra zajmuje 3 sekundy w zimnym biegu. pgr_astra z przykładem bbox podanym przez @simplexio zajmuje około 900 ms na zimny bieg. Wygląda więc na to, że muszę włożyć wszystko w ramdysk, aby uzyskać odpowiednią wydajność.
Johnny Cusack
1
Świetny! z indeksami @ kttii biegnę teraz szybko!
Magno C
5

W końcu doszedłem do wniosku, że najlepiej umieścić cały wykres (w tym indeksy) w osobnym obszarze tabel, który na stałe znajduje się w pamięci za pomocą ramdysku.

Aby skonfigurować ramdysk na Ubuntu 13.04, skorzystałem z poniższych instrukcji i muszę powiedzieć, że działa całkiem dobrze (zawiera instrukcje ponownego ładowania danych do pamięci po ponownym uruchomieniu / ponownym uruchomieniu).

W przyszłym tygodniu zdobędę rękę na nowych dyskach SSD (odczyt 1 GB / s) i spróbuję porównać wydajność.

Z tego, co widzę, jest to jedyne rozwiązanie, aby wykres 1M + wierszy był stale dostępny, ponieważ zdarzają się ciągłe losowe odczyty.

Johnny Cusack
źródło
Jak stworzyłeś cały wykres (w tym indeksy)? Niczego nie widziałem w dokumentacji pgroutingowej.
Dennis Bauszus,
Użyłem osm2po, niesamowitego kawałka kodu Java! osm2po.de
Johnny Cusack
5

Użyj tego przewodnika do utworzenia indeksów dla bazy danych przestrzennych. Oto jego sedno:

 1. create indexes on ID, source and target columns.
 2. create index using GIST on geom column.
 3. vacuum
 4. cluster on geom column
 5. analyze

dla moich tabel _4pgr i _vertex tylko kolumny źródłowa i docelowa miały indeksy po imporcie (osm2po-core-5.1.0).

kttii
źródło
Fantastyczny! od ~ 45 sekund do ~ 15 sekund przy użyciu pełnego OSM Ameryki Południowej z funkcją samodzielnego przyłączenia.
Magno C
Przepraszam, mój błąd. od ~ 45 sekund do ~ 5 ms !!!!!!
Magno C