मैं गति के लिए pgrout को कैसे अनुकूलित कर सकता हूं?


22

मैं osm2pgrout के माध्यम से बनाए गए पोस्टगिस डेटाबेस पर pgrout का उपयोग कर रहा हूं। यह एक सीमित डाटासेट (3.5k तरीके, सभी सबसे छोटे पथ A * खोजों <20 ms) पर बहुत अच्छा प्रदर्शन करता है।

हालाँकि जब से मैंने यूरोप से एक बड़ा बाउंडिंग बॉक्स (122k तरीके) आयात किया है। प्रदर्शन बहुत नीचे चला गया (लगभग 900ms में सबसे छोटी पथ लागत)।

मुझे लगता है कि ए * का उपयोग करते हुए उन किनारों में से अधिकांश का कभी भी दौरा नहीं किया जाएगा क्योंकि वे रास्ते से बाहर हैं।

गति में सुधार के प्रयास में मैंने अब तक क्या किया है:

  • ज्योमेट्री कॉलम पर एक इंडेक्स लगाएं (ध्यान देने योग्य प्रभाव नहीं)
  • मेरी मेमोरी को 8GB से बढ़ाकर 16GB कर दिया
  • (128 जीबी, 128 एमबी) से (1 जीबी, 2 जीबी) (कोई ध्यान देने योग्य प्रभाव) से पोस्टग्रैस्क्ल मेमोरी सेटिंग्स (शेयर्ड_बफर्स, प्रभावी_कैश_साइज) बदलें।

मुझे लग रहा है कि ज्यादातर काम सी बूस्ट लाइब्रेरी में हो रहा है, जहां ग्राफ बनाया जा रहा है, इसलिए पोस्टग्रैसक्लिप का अनुकूलन मुझे ज्यादा बेहतर परिणाम नहीं देगा। जैसा कि मैं प्रत्येक खोज के लिए A * के लिए मेरे द्वारा चुनी गई पंक्तियों के सेट में मामूली बदलाव करता हूं, मुझे थोड़ा डर लगता है कि बूस्ट लाइब्रेरी मेरे ग्राफ़ को कैश नहीं कर सकती है और हर बार सभी 122k किनारों का पुनर्निर्माण करना होगा (भले ही यह केवल एक बहुत उपयोग करेगा सीमित सबसेट हर क्वेरी)। और मुझे पता नहीं है कि वास्तविक लघु पथ खोज की तुलना में कितना खर्च किया जाता है।

क्या आप में से कोई भी 122k या उससे अधिक OSM डेटासेट पर pgrout का उपयोग करता है? मुझे किस प्रदर्शन की उम्मीद करनी चाहिए? कौन सी सेटिंग्स प्रदर्शन को सबसे अधिक प्रभावित करती हैं?


2
मैं एक विशेषज्ञ नहीं हूं, लेकिन क्या आप परिणाम को कैश कर सकते हैं, उदाहरण के लिए, यदि आप जानते हैं कि एक सामान्य उप मार्ग हमेशा उपयोग किया जाता है, तो क्या आप इसे रद्द कर सकते हैं? इसलिए, आपको कम खोज करनी होगी? इसके अलावा, वैन आप खोज को आर्टेरियल्स और कलेक्टरों तक सीमित करते हैं?
dassouki

1
मैं मुफ्त खोज एटीएम की अनुमति देता हूं, इसलिए मुझे लगता है कि मैं उप मार्गों के लिए बहुत कुछ ग्रहण कर सकता हूं। इसके अलावा मैं अंतिम x मिनट की खोजों के परिणाम को कैशिंग कर रहा हूं, लेकिन यह मुझे नई खोजों के लिए मदद नहीं करता है। मुझे लगता है कि ए * इस आकार पर अभी भी वास्तव में तेजी से होना चाहिए जब तक कि मैं पूरे ग्राफ को स्मृति में स्थिर रख सकता हूं। ऐसे लोगों को होना चाहिए जो पूरे देश में इस तरह से रूट करते हैं जो जानते हैं कि प्रदर्शन में सुधार कैसे किया जाए।
mrg

1
एक अन्य विकल्प O / D मैट्रिक्स (मूल / गंतव्य मैट्रिक्स) का निर्माण करना होगा। यह एक ऐसी तकनीक है जिसका उपयोग हम ट्रैफिक इंजीनियरिंग में करते हैं। नेटवर्क को ज़ोन में विभाजित करें, तो मान लें कि एक बड़े शहर में 100 ज़ोन हो सकते हैं। प्रत्येक क्षेत्र में एक डमी केन्द्रक होगा। डमी लिंक के माध्यम से अपने नेटवर्क पर सेंट्रोइड कनेक्ट करें। फिर आप अपने पूरे नेटवर्क को 100 x 100 ट्रिप (कुल 10,000 यात्राएं) के रूप में फिर से तैयार कर सकते हैं। जब कोई उपयोगकर्ता खोज करता है, तो pgrout को मूल और गंतव्य पक्ष पर सेंट्रोइड या डमी लिंक के लिए बंद मार्ग खोजना पड़ता है।
डसॉकी

2
अगर किसी को 1 ज़ोन से अगले क्षेत्र में जाना है, लेकिन आपको अजीब परिणाम नहीं मिलते हैं, लेकिन वे अपने सेंट्रोइड्स से गुजरते हैं? या क्या आप केवल इसका उपयोग करते हैं जब ज़ोन आगे अलग हो जाते हैं? आपका समाधान सबसे अधिक समझ में आता है अगर ग्राहक ए से बी तक सबसे तेजी से आना चाहते हैं, लेकिन मेरे मामले में मुझे उन ग्राहकों से निपटना होगा जो अवकाश के लिए चलना, साइकिल चलाना आदि चाहते हैं और अद्वितीय मार्गों को चुनना चाहते हैं और जाने के लिए मजबूर नहीं होते हैं मानक मार्ग के माध्यम से।
13:15 बजे mrg

3
यदि आप मल्टीमॉडल सॉल्यूशन (बाइक, वॉक, पब्लिक ट्रांसपोर्टेशन, ड्राइव) की तलाश कर रहे हैं, तो आपको वास्तव में पोर्टलैंड, ओरेगन के ट्रायमेट मल्टीमॉडल रूटिंग साइट पर एक नज़र डालनी चाहिए, जो ओपनट्रिपलनर का उपयोग करती है: trimet.org/news/releases/oct15-rtp। htm
रयानडाल्टन

जवाबों:


10

जब इस तरह के कार्यों का सामना करना पड़ता है तो आपका प्राथमिक उद्देश्य तर्कसंगत होना चाहिए। 'आंत की भावना' पर आधारित बदलावों को न बदलें। जबकि पेट हॉलीवुड के लिए काम करता है यह हमारे लिए नहीं है जो वास्तविक दुनिया में रहते हैं। कम से कम, मेरी आंत नहीं ;-)।

तुम्हे करना चाहिए:

  1. एक प्रयोग करने योग्य और दोहराए जाने वाले मीट्रिक की स्थापना करें (जैसे कि एक क्वेरी क्वेरी के लिए आवश्यक समय)

  2. एक स्प्रेडशीट में मीट्रिक परिणाम सहेजें और उन्हें औसत करें (सबसे अच्छा और सबसे खराब छोड़ें)। यह आपको बताएगा कि क्या आप जो बदलाव कर रहे हैं, वह सही दिशा में जा रहा है

  3. शीर्ष और vmstat का उपयोग करके अपने सर्वर की निगरानी करें (जब आप * nix पर हैं) यह मानते हुए कि प्रश्न चल रहे हैं और महत्वपूर्ण पैटर्न देखें: बहुत सारे io, उच्च सीपीयू, स्वैपिंग, आदि। यदि सीपीयू i / o की प्रतीक्षा कर रहा है तो सुधार करने का प्रयास करें। डिस्क प्रदर्शन (यह आसान होना चाहिए, नीचे देखें)। यदि CPU बिना किसी महत्वपूर्ण डिस्क एक्टिविटी के 100% पर है, तो आपको क्वेरी को बेहतर बनाने का एक तरीका खोजना होगा (यह संभवतः कठिन होने वाला है)।

सादगी के लिए मुझे लगता है कि नेटवर्क यहां कोई महत्वपूर्ण भूमिका नहीं निभा रहा है।

डेटाबेस प्रदर्शन में सुधार

नवीनतम पोस्टग्रेज संस्करण में अपग्रेड करें। संस्करण 9 इतना बेहतर है कि पिछले संस्करण। यह मुफ़्त है इसलिए आपके पास कोई कारण नहीं है।

पुस्तक मैं पहले से ही की सिफारिश की पढ़ें यहाँ

आपको वास्तव में इसे पढ़ना चाहिए। मेरा मानना ​​है कि इस मामले के लिए प्रासंगिक अध्याय 5,6,10,11 हैं

डिस्क प्रदर्शन में सुधार

  1. SSD ड्राइव प्राप्त करें और उस पर पूरा डेटाबेस डालें। पढ़ें प्रदर्शन सबसे अधिक संभावना चौगुनी हो जाएगा और लेखन प्रदर्शन में भी मौलिक सुधार होना चाहिए

  2. पोस्टग्रेज को अधिक मेमोरी असाइन करें। आदर्श रूप से आपको पर्याप्त मेमोरी असाइन करने में सक्षम होना चाहिए ताकि पूरे (या सबसे गर्म हिस्से) को मेमोरी में कैश्ड किया जा सके, लेकिन इतना अधिक नहीं कि स्वैपिंग हो। स्वैपिंग बहुत खराब है। यह पिछले पैराग्राफ में उद्धृत पुस्तक में शामिल है

  3. सभी डिस्क पर atime को अक्षम करें ( fstab में noatime विकल्प जोड़ें )

क्वेरी पूर्णता में सुधार

अपनी क्वेरी / ies ट्रेस करने के लिए ऊपर उल्लिखित पुस्तक में वर्णित टूल का उपयोग करें और उन स्टॉप का पता लगाएं जो अनुकूलन के लायक हैं।

अद्यतन करें

टिप्पणियों के बाद मैंने संग्रहीत प्रक्रिया के लिए स्रोत कोड को देखा है

https://github.com/pgRouting/pgrouting/blob/master/core/src/astar.c

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

HTH


मैंने आपके द्वारा सुझाई गई पुस्तक के कुछ हिस्सों को पढ़ा है। मेरा डेटासेट अभी भी पूरी तरह से मेमोरी में फिट होने के लिए काफी छोटा है, इसलिए मुझे लगता है कि डिस्क प्रदर्शन एक अड़चन नहीं होना चाहिए (मैं इस बात की पुष्टि करने के लिए परीक्षण करते समय अपने संसाधनों की बेहतर जांच करूंगा)। मुझे लगता है कि Postgresql केवल pgrouting प्रक्रिया में खेलने के लिए आता है जब यह वास्तविक खोज करने के लिए पंक्ति / ट्यूपल्स के साथ C Boost लाइब्रेरी को खिलाने के लिए टेबल से एक सरल चयन * करता है ((कोई इसकी पुष्टि कर सकता है) तो मुझे डर है कि वहाँ नहीं है Postgresql में बहुत कुछ हासिल करने के लिए। आपका उत्तर Postgresql के प्रदर्शन के लिए बहुत अच्छा लगता है, लेकिन शायद विशिष्ट प्रदर्शन को प्राप्त करने के लिए ऐसा नहीं है।
mrg

@ मैं वास्तव में उस के बारे में सोचा था, लेकिन मैं यह सुनिश्चित करना चाहता था कि आपने कम-फांसी-फल को नहीं छोड़ा। इसके बारे में सोचकर आप 20k से 3.5k के लिए 900ms के लिए 900k पर चले गए जो कि, imho, पूरी तरह से खराब नहीं है। सौभाग्य
unicoletti

ठोस राज्य ड्राइव वृद्धि प्रदर्शन (क्या कैशिंग के समान गति) कर
Mapperz

मेरे अनुभव में, यदि सभी डेटासेट (तालिका) पर pgrout का उपयोग किया जाता है तो Postgres इंजन से कोई बड़ा लाभ नहीं है। इंडेक्स का उपयोग इतना बेकार भी नहीं है। प्रत्येक क्वेरी पर पूरी तालिका को मेमोरी में लोड किया जाता है। साझा बफ़र्स और कैश भी कोई प्रदर्शन लाभ नहीं देते थे क्योंकि प्रत्येक क्वेरी मेमोरी में सभी तालिका को लोड करती है। यदि किसी ने बाद के प्रश्नों के लिए मेमोरी में लोड किए गए डेटा का पुन: उपयोग करने में सफलता पाई है, तो कृपया हमें बताएं। एसडीडी ड्राइव में केवल संभावित प्रदर्शन में वृद्धि होती है, लेकिन मैंने कभी इसका परीक्षण नहीं किया। अधिक मेमोरी केवल समवर्ती प्रश्नों की अनुमति देती है, प्रदर्शन की नहीं।
मारियो मिलर

8

मुझे बस एक ही समस्या है और मेलिंग सूचियों पर पूछने के बारे में था, इसलिए हर किसी के लिए धन्यवाद!

मैं राउटिंग टेबल पर एक लाख और डेढ़ पंक्तियों के साथ शूटिंग स्टार का उपयोग कर रहा हूं । इसे गणना करने में लगभग दस सेकंड लगते हैं। 20k पंक्तियों के साथ इसे लगभग तीन सेकंड लगते हैं। मुझे शूटिंग स्टार की जरूरत है क्योंकि मुझे टर्न प्रतिबंधों की जरूरत है।

यहां कुछ विचार दिए गए हैं जिन्हें मैं लागू करने की कोशिश कर रहा हूं:

  • SQL पर जहाँ pgRout को तरीके मिलते हैं, एक st_buffer का उपयोग करें ताकि यह सभी तरीके से न हो, लेकिन बस "पास के" तरीके:

    चयन करें * shortest_path_shooting_star ('सेलेक्ट रूट। * FROM राउटिंग रुट से, (select st_buffer (st_envelope (st_collect))), 4) ज्योमेट्री के रूप में रूटिंग जहाँ id =' source_ 'या' id '' 'लक्ष्य। | ') e WHERE rout.geometry && e.geometry', स्रोत, लक्ष्य, सच, सच);

इसने प्रदर्शन में सुधार किया, लेकिन अगर रास्ते को बफर के बाहर जाने की आवश्यकता है, तो यह "कोई रास्ता नहीं मिला" त्रुटि लौटा सकता है, इसलिए ... बड़ा बफर? कई कॉल बफर को बढ़ाते हुए जब तक यह एक रास्ता नहीं ढूंढता?

  • तेज मार्गों को संभाला

जैसे डसॉकी ने सुझाव दिया, मैं कुछ "उपयोगी" मार्गों को कैश कर दूंगा, यदि दूरी बहुत लंबी है, तो यह इन तेज मार्गों से गुजर सकता है और बस उन्हें अंदर और बाहर का रास्ता खोजना होगा।

  • जीआईएस इंडेक्स द्वारा विभाजन तालिका

लेकिन मुझे लगता है कि, अगर यह स्मृति में जाता है, तो यह वास्तव में मायने नहीं रखता है ... वैसे भी, इसका परीक्षण करना चाहिए।

कृपया, यदि आपको कोई और विचार आता है तो पोस्ट करते रहें।

इसके अलावा, क्या आपको पता है कि Postgres9 के लिए कुछ संकलित pgRout है?


+1 यहाँ कुछ उपयोगी और रचनात्मक विचार प्रतीत होते हैं। कृपया ध्यान दें कि यदि आप अपने प्रश्नों का उत्तर देना चाहते हैं, तो उन्हें नए प्रश्न के रूप में तैयार करना सबसे अच्छा है। हमारे FAQ आपको आगे बढ़ने का तरीका बताएंगे।
whuber

Délawen, मैं भी आपके पहले विचार (ST_Buffer) के बारे में सोच रहा हूं और उसी समस्या को दूर करता हूं। हालांकि लाभ 2 तरह से हो सकता है: डेटासेट छोटा होता है और इस तरह तेज होता है और चूंकि Postgresql में अधिक प्रसंस्करण किया जा रहा है इसलिए आपके पास इसे अनुकूलित करने के तरीके फिर से हैं। एटीएम मैं Ubuntu 11 का उपयोग कर रहा हूं, जहां postgresql 8.4 नवीनतम संस्करण है।
mrg

mrg, मैंने बहुत समस्या के बिना PostgreSQL 9.0 के लिए एक Ubuntu Maverick पर pgRout संकलित किया। PostgreSQL 9.0 के लिए Postgis यहां पाया जा सकता है: ppa.launchpad.net/pi-deb/gis/ubuntu maverick / main amd64 पैकेज
डेलावेन

मैं 2 विचारों के साथ आया था। 1) 'फास्ट रूट कैश्ड' और 'st_buffer' का संयोजन। इस तरह से आप एक मार्ग खोजने की गारंटी देते हैं और लोग सभी एक ही मार्ग पर मजबूर नहीं होंगे। 2) केवल स्थिर ग्राफ (बूस्ट (C), nx_spatial (पायथन), neo4j (जावा), आदि) के साथ भरने के लिए पोस्टगिस का उपयोग करें और हर खोज क्वेरी के लिए उस ग्राफ़ का पुन: उपयोग करें।
mrg

हाईवे जैसे किनारों के लिए 'तेज' किनारों के लिए लागत को कम करने (यानी वरीयता को बढ़ावा देने) के बारे में क्या शुरू और अंत के बीच की दूरी एक सीमा से अधिक है? बूस्ट फैक्टर भी दूरी से संबंधित हो सकता है: लंबी दूरी के लिए बड़ा, छोटे के लिए छोटा।
unicoletti

5

हमने सिर्फ एक मोड़ के लिए git में एक शाखा बनाई है, जो सबसे छोटे मार्ग @ प्रतिबंधित है। https://github.com/pgRout/pgrout/tree/trsp

क्षमा करें, अभी तक कोई दस्तावेज़ नहीं है, लेकिन यदि आप pgRouting सूची पर प्रश्न पूछते हैं तो मैं वहां बाहर घूमता हूं और जवाब दूंगा। यह कोड शूटिंग स्टार की तुलना में बहुत तेजी से चलता है और यह दिक्जस्ट्रा एल्गोरिथ्म पर आधारित है।

-स्टीव


0

मेरे पास एक स्रोत मार्ग तालिका है जिसमें ~ 1200000 किनारे हैं। SSD के साथ मेरे i7 पर 12 सेकंड लगते हैं ताकि एक रूट बनाया जा सके। प्रदर्शन बढ़ाने के लिए मेरा विचार एज टेबल को कई ज़ूम स्तर की तालिकाओं में विभाजित करना है। मेरा मतलब है कि स्तर जो कि गूगल टाइल्स के समान है। 8 वीं ज़ूम स्तर पर, उदाहरण के लिए, मेरे पास 88 टेबल हैं। प्रत्येक तालिका में सड़कों का एक सबसेट होता है और उनके क्षेत्र एक दूसरे को ओवरलैप करते हैं ताकि दो बिंदुओं के बीच एक मार्ग की गणना की जा सके जो एक दूसरे से 290 किमी से अधिक दूर नहीं होते हैं 2 सेकंड लगते हैं। गणना के 9 वें स्तर के समय में 0.25 सेकंड तक गिरता है और हमारे पास 352 टेबल हैं। यदि हम सड़कों को संपादित करते हैं तो सभी ग्राफ़ों का मनोरंजन एक घंटे से अधिक नहीं होता है। रूटिंग की गति को बढ़ाने का कट्टरपंथी तरीका फ्लोयड-वारशॉ एल्गोरिथ्म का उपयोग करना है। लेकिन कोई नहीं जानता कि इतने किनारों पर पूर्ववर्ती मैट्रिक्स की गणना करने में कितना समय लगता है।

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