เหตุใดฟังก์ชันการกำหนดเส้นทาง pgr_ * จึงใช้งานตลอดไปโดยอ้างอิงจากข้อมูล OSM ในฐานข้อมูลที่เปิดใช้งาน pgrouting


9

ฉันโหลดชุดข้อมูล OSM ของเยอรมันลงใน pgrouting DB โดยใช้ osm2po 4.7.7 ทุกอย่างใช้งานได้ดีฉันมีการตั้งค่า osm2po ผ่านทางมันและมันทำงานเหมือนมีเสน่ห์ผ่านส่วนของ Java

ฉันมีตาราง * _2po_4pgr ที่นำเข้าโดยไม่มีปัญหาใด ๆ แม้แต่ตาราง * 2po_v ก็ถูกนำเข้าแม้ว่าฉันจะไม่เข้าใจความสัมพันธ์ทั้งหมดของตารางนี้

ฉันเรียกใช้ฟังก์ชัน pgr_createTopology ซึ่งใช้เวลาสักครู่ (12000secs) ในขณะที่คำนวณขอบ 6m ทั้งหมด ฉันคิดว่านี่จะทำข้อตกลง แต่ก็ยังช้าไปไม่ได้

ฉันอยากจะรู้ว่าฉันลืมบางสิ่งบางอย่าง ฉันกำลังคิดที่จะใช้ pgRouting แทนที่จะเป็นไลบรารี java แต่ในขณะนี้ประสิทธิภาพของมันฉลาดกว่าการเปรียบเทียบ


1
คุณสร้างดัชนีแล้วหรือยังคุณได้ปรับตัวแปรหน่วยความจำ postgis แล้วหรือยัง? createTopology ทำงานเพียงครั้งเดียวสำหรับชุดข้อมูลทั้งหมดดังนั้นประสิทธิภาพของมันจึงไม่สำคัญมากนัก ข้อความด้านข้าง ฉันมีฟินแลนด์ทั้งหมดจากชุดข้อมูล digiroad (เช่น 2G ของเครือข่ายถนน) และส่งคืนผลลัพธ์ในเวลาสูงสุด 250 ms โดยปกติจะเป็น 125 มิลลิวินาทีโดยไม่มีการเพิ่มประสิทธิภาพใด ๆ ดังนั้นควรจะดีขึ้นในวันนี้
simplexio

มีดัชนีในคอลัมน์ต้นทางและคอลัมน์เป้าหมายที่สร้างโดยตัวสร้างสคริปต์ osm2po โดยอัตโนมัติ ต้องการมากขึ้น? ฉันเปลี่ยนตัวแปรwork_mem / maintenance_work_memเป็นค่าGigaByteรีสตาร์ท แต่ก็ยังไม่มีการเปลี่ยนแปลง มีเทมเพลตสคริปต์เริ่มต้นที่ฉันต้องการหรือไม่
Johnny Cusack

1
อืม ... createTopology () ทำอะไรได้บ้าง ฉันหมายถึง osm2po สร้างโทโพโลยีขึ้นอยู่กับ OSM-Node-ID แล้ว ดังนั้นจึงไม่จำเป็นต้องเรียกใช้ sth คล้ายกันอีกครั้ง สำหรับ pgRouting (shortest_path & shortest_path_astar) คุณต้องการเพียง 4pgr-table ที่สร้างขึ้น นั่นคือทั้งหมดที่
Carsten

ฉันมีตอนนี้ชุดข้อมูลฟินแลนด์, Postgis 2.0.3, pgrouting 2.0.0-dev และฉันต้องบอกว่านี่ช้า ให้ผลลัพธ์มากกว่า 1 วินาทีเมื่อใช้ pgr_astar () ฉันจะตรวจสอบว่าฉันจะได้เร็วขึ้นนิดหน่อยนี้
simplexio

คำตอบ:


5

ปัญหาเกี่ยวกับประสิทธิภาพของ pgRouting น่าจะเป็นที่ pgr_astar และ pgr_dijkstra ใหม่ใช้กราฟทั้งหมด (ซึ่งรับประกันการแก้ปัญหาหากมี) ทางออกที่ง่ายเพื่อให้ได้ประสิทธิภาพที่ดีขึ้นคือ จำกัด กราฟที่ใช้ไปยังพื้นที่ขนาดเล็ก มันมีปัญหาของตัวเองเช่นบางครั้งมันอาจสร้างกราฟที่ไม่สามารถแก้ไขได้

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

สร้าง BBOX เหนือแหล่งรวบรวมและเป้าหมายและขยาย 0.1 องศาจากนั้นใช้แบบสอบถามเดียวกันเพื่อ จำกัด ขนาดกราฟในแบบสอบถาม pgr_

Dijkstra จาก 1.2 วินาทีถึง ~ 65ms

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 * ตั้งแต่ 2 วินาทีถึง ~ 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 ใช้เพื่อนำเข้าข้อมูล (ฟินแลนด์ล่าสุด) ลงในตาราง postgis ดัชนีส่วนที่ถูกเพิ่มไปยังคอลัมน์ geom_way และการวิเคราะห์สูญญากาศแบบเต็มสำหรับฐานข้อมูล แชร์หน่วยความจำ 1G workmem 512M


ฉันมีความคิดเดียวกันกับกล่อง bounding ยังคงดีกว่า 90 วินาทีแม้จะมีหน่วยความจำ vars ตั้งค่าอื่น ๆ
จอห์นนี่คูแซ็ก

ฉันมีเส้น 380k หรือไม่ คุณอาจมีบางอย่างเช่นสาย 3M + ในตารางเส้นทาง?
simplexio

1
นี่เป็นหนึ่งในปัญหาหลักใน Postgres ที่จะไม่แคชกราฟทั้งหมด มันใช้งานได้ค่อนข้างเร็ว แต่ฉันจำเป็นต้องเชื่อมต่อกับตารางฐานข้อมูลอื่น ๆ ที่สร้างขึ้นในสถานการณ์ปัจจุบัน (ทดสอบ -) เป็นคอขวดขนาดใหญ่ที่มีเพียง 5qps (แบบสอบถามต่อวินาที)
จอห์นนี่คูแซ็ก

1
ฉันเพิ่งโหลดชุดย่อย 1 ล้านแถวลงใน ramdisk เพื่อเปรียบเทียบ pgr_dijkstra ใช้เวลา 3 วินาทีในช่วงเย็น pgr_astra พร้อมตัวอย่าง bbox ที่มีให้โดย @simplexio ใช้เวลาประมาณ 900 มิลลิวินาทีในการดำเนินการแบบเย็น ดังนั้นฉันต้องใส่ทุกอย่างใน ramdisk เพื่อประสิทธิภาพที่เหมาะสม
Johnny Cusack

1
ที่ดี! ด้วยดัชนีของ @ kttii ฉันกำลังวิ่งเร็ว!
Magno C

5

ในที่สุดฉันก็มาถึงข้อสรุปว่าเป็นการดีที่สุดที่จะวางกราฟทั้งหมด (รวมถึงดัชนี) ลงในพื้นที่ตารางแยกต่างหากซึ่งอยู่ในหน่วยความจำอย่างถาวรโดยใช้ ramdisk

สำหรับการตั้งค่า ramdisk บน Ubuntu 13.04 ฉันใช้คำแนะนำต่อไปนี้และต้องบอกว่ามันใช้งานได้ค่อนข้างดี (มันมีคำแนะนำสำหรับการโหลดข้อมูลเข้าสู่หน่วยความจำอีกครั้งหลังจากรีสตาร์ท / รีบูต)

สัปดาห์หน้าฉันจะลองอ่าน SSD ใหม่ (1GB / s) แล้วลองเปรียบเทียบประสิทธิภาพ

เท่าที่ฉันเห็นมันเป็นทางออกเดียวที่ทำให้สามารถเข้าถึงกราฟขนาด 1M + ได้อย่างถาวรเนื่องจากมีการสุ่มอ่านอย่างต่อเนื่อง


คุณสร้างกราฟทั้งหมด (รวมถึงดัชนี) อย่างไร ฉันไม่เห็นอะไรเลยในเอกสารกำกับการเริ่มต้น
Dennis Bauszus

ฉันใช้ osm2po ซึ่งเป็นโค้ดจาวาที่น่าทึ่ง! osm2po.de
Johnny Cusack

5

ใช้คำแนะนำนี้เพื่อตั้งค่าดัชนีสำหรับฐานข้อมูลเชิงพื้นที่ นี่คือส่วนสำคัญของมัน:

 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 และ _vertex ของฉันเฉพาะคอลัมน์ต้นทางและคอลัมน์เป้าหมายเท่านั้นที่มีดัชนีหลังจากการนำเข้า (osm2po-core-5.1.0)


Fantastic! จาก ~ 45 วินาทีถึง ~ 15 วินาทีโดยใช้ OSM อเมริกาใต้แบบเต็มรูปแบบด้วยตัวเอง
Magno C

ขอโทษ ... ความผิดพลาดของฉัน จาก ~ 45 วินาทีถึง ~ 5 ms !!!!!!
Magno C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.