Herhangi bir pgr_ * yönlendirme işlevi, pgrouting özellikli bir DB'de OSM verilerine dayanarak neden sonsuza kadar sürüyor?


9

Alman OSM veri kümesini osm2po 4.7.7 kullanarak pgrouting DB'ye yükledim. Her şey yolunda çalışıyor, ben onun config aracılığıyla kurulmuş osm2po var ve bu Java kısmı aracılığıyla bir cazibe gibi çalışıyor.

* _2po_4pgr tablosunu sorunsuz bir şekilde içe aktardım. * 2po_v tablosu bile içe aktarılır, ancak bu tablonun ilişkisini tam olarak anlamıyorum.

Tüm 6m kenarlarını hesaplarken uzunca bir süre (12000 saniye) çalışan pgr_createTopology işlevini yürüttüm. Bunun anlaşmayı yapacağını düşündüm, ama yine de dayanılmaz derecede yavaş.

Bir şey unuttuğumu bilmek istiyorum. Java kütüphanesi yerine pgRouting kullanmayı düşünüyordum ama şu anda performans açısından karşılaştırmalı olarak değil.


1
dizin oluşturdunuz mu, postgis bellek değişkenlerini ayarladınız mı? createTopology, tüm veri kümesi için yalnızca bir kez çalıştırılır, bu nedenle performansı o kadar önemli değildir. Kenar notu. Digiroad veri kümesinden (Finlandiya'nın 2G yol ağı gibi) bütün Finlandiya'ya sahiptim ve maksimum 250 ms'de, genellikle 125 ms herhangi bir optimizasyon olmadan sonuç döndürdüm. Bu yüzden şimdi günler daha iyi olmalı
simplexio

Kaynak ve hedef sütunda, osm2po kod üreteci tarafından otomatik olarak oluşturulan dizinler vardır. Daha mı gerekli? Değiştim work_mem / maintenance_work_mem , yeniden, bir GigaByte değere hala hiçbir değişiklik değişkenleri. İhtiyacım olabilecek herhangi bir başlatma komut dosyası şablonu var mı?
Johnny Cusack

1
Hmmm ... createTopology () ne yapıyor? Yani, osm2po zaten OSM-Node-ID'lerine dayalı topolojiyi yaratıyor. Yani sth koşmaya gerek yok. tekrar benzer. PgRouting (shortest_path & shortest_path_astar) için yalnızca oluşturulan 4pgr tablosuna ihtiyacınız vardır. Bu kadar.
Carsten

Şimdi Finlandiya veri kümesi var, postgis 2.0.3, pgrouting 2.0.0-dev. Ve bunun yavaş olduğunu söylemeliyim. pgr_astar () kullanılırken sonuç için 1 saniyenin üzerinde daima. Biraz daha hızlı alıp almadığımı kontrol ediyorum
simplexio

Yanıtlar:


5

PgRouting performansıyla ilgili sorun, yeni pgr_astar ve pgr_dijkstra'nın tüm grafiği kullanmasıdır (eğer varsa çözümü garanti eder). Daha iyi performans elde etmek için kullanılan basit çözüm, kullanılan grafiği daha küçük alanlarla sınırlamaktır. Bazen çözülemeyen grafikler yaratabileceği gibi kendi sorunları var

 (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) 

Kaynak ve hedef toplama üzerinde BBOX oluşturur ve 0.1 derece genişletir, ardından pgr_ sorgusundaki grafik boyutunu sınırlamak için aynı sorgu kullanılır

Dijkstra 1.2s ~ ~ 65ms arası

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 * 2s - ~ 50ms arası

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 postgis tablosuna veri (finland-latest) aktarmak için kullanıldı. geom_way sütununa gist endeksi eklendi ve veritabanı için tam vakum analizi çalıştırıldı. paylaşılan hafıza 1G. workmem 512M


Sınırlama kutusu ile aynı fikri vardı, hatta bellek vars vb set ile 90 saniyeden fazla.
Johnny Cusack

380k satırım var mı? Muhtemelen yönlendirme tablosunda 3M + satırları var mı?
simplexio

1
Bu, Postgres'deki tüm grafiği önbelleğe almamanın temel sorunlarından biridir. Oldukça hızlı çalışır. Ama mevcut (test-) durumda sadece 5qps (saniyede sorgu) ile büyük bir darboğaz yaratan diğer veritabanı tabloları ile bağlamanız gerekir
Johnny Cusack

1
Ben sadece karşılaştırmak için ramdisk içine 1M satırların bir alt kümesi yükledi. pgr_dijkstra soğuk bir koşuda 3 saniye sürer. @simplexio tarafından sağlanan bbox örneği ile pgr_astra soğuk bir çalışma için yaklaşık 900 ms sürer. Bu yüzden doğru performans için her şeyi bir ramdiske koymam gerekiyor gibi görünüyor.
Johnny Cusack

1
Harika! @ kttii dizinleri ile şimdi hızlı koşuyorum!
Magno C

5

Sonunda, tüm grafiği (indeksler dahil) bir ramdisk kullanarak kalıcı olarak bellekte bulunan ayrı bir tablo alanına yerleştirmenin en iyisi olduğu sonucuna vardım.

Ubuntu 13.04 üzerinde ramdisk'i kurmak için aşağıdaki talimatları kullandım ve oldukça iyi çalıştığını söylemeliyim (bir yeniden başlatma / yeniden başlatmadan sonra verileri belleğe yeniden yüklemek için talimatlar içerir).

Gelecek hafta yeni SSD'leri ele alacağım (1GB / sn okuma) ve performansı karşılaştırmaya çalışacağım.

Gördüğüm kadarıyla 1M + satır grafiğini kalıcı olarak erişilebilir tutmak için tek çözüm, çünkü sürekli rastgele okumalar oluyor.


Grafiğin tamamını nasıl oluşturdunuz (endeksler dahil)? Pgrouting belgelerinde hiçbir şey görmedim.
Dennis Bauszus

Muhteşem bir java kodu parçası olan osm2po kullandım! osm2po.de
Johnny Cusack

5

Uzamsal bir veritabanı için dizin ayarlamak için bu kılavuzu kullanın . İşte özü:

 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

_4pgr ve _vertex tablolarım için içe aktarmadan sonra yalnızca kaynak ve hedef sütunlarda dizinler vardı (osm2po-core-5.1.0).


Fantastik! kendi kendine katılma ile tam OSM Güney Amerika kullanarak ~ 45 sn ila ~ 15 sn.
Magno C

Üzgünüm, benim hatam. ~ 45 saniye ~ ~ 5 ms !!!!!!
Magno C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.