एक pgrout सक्षम DB में OSM डेटा के आधार पर किसी भी pgr_ * राउटिंग फ़ंक्शन को हमेशा के लिए क्यों लिया जाता है


9

मैंने osm2po 4.7.7 का उपयोग करके जर्मन OSM डेटासेट को pgrout DB में लोड किया। सब कुछ ठीक काम करता है मेरे पास osm2po है जो इसके विन्यास के माध्यम से स्थापित है और यह जावा भाग के माध्यम से एक आकर्षण की तरह काम कर रहा है।

मेरे पास * _2po_4pgr तालिका बिना किसी समस्या के आयात की गई थी। यहां तक ​​कि * 2po_v तालिका आयातित हो जाती है, हालांकि मैं इस तालिका के संबंध को पूरी तरह से नहीं समझता हूं।

मैंने सभी 6 मी किनारों की गणना करते हुए pgr_createTopology फ़ंक्शन को निष्पादित किया जो काफी समय (12000secs) तक चला। मैंने सोचा कि यह सौदा करेगा, लेकिन फिर भी यह असहनीय रूप से धीमा है।

मैं जानना चाहूंगा कि क्या मैं कुछ भूल गया हूं। मैं जावा लाइब्रेरी के बजाय pgRout का उपयोग करने के बारे में सोच रहा था, लेकिन इस समय तुलनात्मक रूप से इसका प्रदर्शन बुद्धिमान था।


1
क्या आपने इंडेक्स बनाए हैं, क्या आपने पोस्टगिस मेमोरी चर को ट्यून किया है? createTopology केवल पूरे डेटासेट के लिए एक बार चलाई जाती है, इसलिए इसका प्रदर्शन उतना मायने नहीं रखता है। पक्षीय लेख। मेरे पास डिजीरोड डेटासेट (सड़क नेटवर्क के 2 जी की तरह) से पूरा फिनलैंड था और अधिकतम 250 एमएस में परिणाम लौटा, आमतौर पर 125 ग्राम बिना किसी अनुकूलन के। तो अब बेहतर होना चाहिए दिन
simplexio

Osm2po स्क्रिप्ट जनरेटर द्वारा स्वचालित रूप से बनाए गए स्रोत और लक्ष्य स्तंभ पर अनुक्रमित होते हैं। अधिक आवश्यकता है? मैंने वर्क_म / मेंटेनेंस_वर्क_मम वैरिएबल को GigaByte मान में बदल दिया , फिर से शुरू किया, फिर भी कोई बदलाव नहीं हुआ। क्या कोई स्टार्ट अप स्क्रिप्ट टेम्पलेट है जिसकी मुझे आवश्यकता हो सकती है?
जॉनी क्यूसैक

1
हम्म्म ... क्रिएट टॉटोलॉजी () क्या करती है? मेरा मतलब है, OSM-Node-ID के आधार पर osm2po पहले से ही टोपोलॉजी बनाता है। इसलिए sth चलाने की कोई आवश्यकता नहीं है। फिर से समान। PgRout (shortest_path & shortest_path_astar) के लिए आपको केवल निर्मित 4pgr-table की आवश्यकता है। बस इतना ही।
कार्स्टन

मेरे पास अब फ़ाइनल डेटासेट, पोस्टगिस 2.0.3, पीग्रेटिंग 2.0.0-देव है। और मेरा कहना है कि यह धीमा है। pgr_astar () का उपयोग करते समय परिणाम के लिए 1 सेकंड से अधिक समय। मैं
जाँचता

जवाबों:


5

PgRout प्रदर्शन के साथ समस्या यह प्रतीत होती है कि नए 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.2s से ~ 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 * 2s से ~ 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 का उपयोग डेटा (फ़ाइनल-नवीनतम) को पोस्टगिस तालिका में आयात करने के लिए किया गया था। gist index को geom_way कॉलम में जोड़ा गया और डेटाबेस के लिए फुल वैक्यूम एनालिसिस चला। साझा स्मृति 1G। workmem 512M


मैं बाउंडिंग बॉक्स के साथ एक ही विचार रखता था, अभी भी 90 सेकंड से अधिक मेमोरी वर्जन सेट आदि के साथ
जॉनी क्यूसैक

मैं 380k लाइनों है? तुम शायद 3M + रूटिंग टेबल में लाइनों की तरह कुछ है?
सिम्पलेक्सियो

1
यह Postgres में मुख्य समस्याओं में से एक है कि पूरे ग्राफ़ को कैश न करें। यह काफी तेज काम करता है। लेकिन मुझे इसे अन्य डेटाबेस-टेबलों के साथ जोड़ने की आवश्यकता है जो वर्तमान (परीक्षण-) स्थिति में केवल 5qps (प्रति सेकंड क्वेरी) के साथ एक बड़ी अड़चन पैदा करती है
जॉनी

1
मैं सिर्फ तुलना करने के लिए एक रैमडिस्क में 1M पंक्तियों का एक सबसेट लोड किया है। pgr_dijkstra को ठंड में 3 सेकंड का समय लगता है। pgr_astra @simplexio द्वारा प्रदान किए गए bbox उदाहरण के साथ यह एक शीत रन के लिए लगभग 900ms लेता है। तो ऐसा लगता है कि मुझे उचित प्रदर्शन के लिए सब कुछ एक रैमडिस्क में रखना होगा।
जॉनी क्यूसैक

1
महान! @ kttii के अनुक्रमित के साथ मैं अब तेजी से दौड़ रहा हूं!
मैग्नो सी

5

मैं अंत में इस नतीजे पर पहुंचा कि पूरे ग्राफ (सूचकांकों सहित) को एक अलग टेबलस्पेस पर रखना सबसे अच्छा है जो एक रैमडिस्क का उपयोग करके स्थायी रूप से मेमोरी में रहता है।

उबंटू 13.04 पर रैमडिस्क स्थापित करने के लिए मैंने निम्नलिखित निर्देशों का उपयोग किया और कहना चाहिए कि यह बहुत अच्छा काम कर रहा है (इसमें पुनरारंभ / रिबूट के बाद डेटा को मेमोरी में पुनः लोड करने के निर्देश शामिल हैं)।

अगले हफ्ते मैं नए एसएसडी (1 जीबी / एस रीड) पर हाथ लाऊंगा और प्रदर्शन की तुलना करने की कोशिश करूंगा।

जहाँ तक मुझे लगता है कि यह 1 एम + पंक्तियों के ग्राफ को स्थायी रूप से सुलभ रखने का एकमात्र समाधान है, क्योंकि एक सतत यादृच्छिक रीडिंग हो रही है।


आपने पूरा ग्राफ (सूचकांकों सहित) कैसे बनाया? मैं कुछ भी नहीं देख रहा था pgrout प्रलेखन।
डेनिस बॉस्ज़स

मैंने osm2po, जावा कोड का एक अद्भुत टुकड़ा इस्तेमाल किया! osm2po.de
जॉनी क्यूसैक

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


बहुत खुबस! ~ 45 सेकंड से ~ 15 सेकंड तक पूर्ण OSM दक्षिण अमेरिका का उपयोग स्वयं से जुड़ें।
मैग्नो सी

माफ कीजिएगा यह मेरी गलती है। ~ 45 सेकंड से ~ 5 एमएस !!!!!!
मैग्नो सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.