আমি কীভাবে গতির জন্য পিগ্রাউটিংকে অনুকূলিত করতে পারি?


22

আমি osm2pgrouting এর মাধ্যমে তৈরি পোস্টগ্রিস ডাটাবেসে pgrouting ব্যবহার করছি। এটি একটি সীমাবদ্ধ ডেটাসেটে খুব ভাল সম্পাদন করে (3.5k উপায়, সমস্ত সংক্ষিপ্ততম পথ A * অনুসন্ধান <20 এমএস)।

তবে যেহেতু আমি ইউরোপ থেকে বড় বাউন্ডিং বাক্স (122 ক উপায়) আমদানি করেছি os

আমি মনে করব যে এ * ব্যবহার করা বেশিরভাগ প্রান্তগুলি পথের বাইরে থাকায় কখনই পরিদর্শন করা হবে না।

গতি উন্নত করার প্রয়াসে আমি এ পর্যন্ত যা করেছি:

  • জ্যামিতি কলামে একটি সূচক রাখুন (কোনও লক্ষণীয় প্রভাব নেই)
  • আমার স্মৃতি 8 জিবি থেকে 16 জিবি বাড়িয়েছে
  • (128 এমবি, 128 এমবি) থেকে (1 জিবি, 2 গিগাবাইট) (কোনও লক্ষণীয় প্রভাব নেই) পোস্টগ্রেস্কল মেমরি সেটিংস (শেয়ারড_বফারস, কার্যকর_ক্যাস_সাইজ) পরিবর্তন করুন

আমার একটা অনুভূতি আছে যে বেশিরভাগ কাজ সি বুস্ট লাইব্রেরিতে করা হচ্ছে যেখানে গ্রাফটি পোস্টগ্রাএসকিউএল অনুকূল করা আমাকে আরও ভাল ফলাফল দেয় না। আমি যেমন প্রতিটি সন্ধানের জন্য সারিগুলির সেটটিতে সামান্য পরিবর্তন করি আমি কিছুটা ভয় করি যে বুস্ট গ্রন্থাগারটি আমার গ্রাফটি ক্যাশে করতে পারে না এবং প্রতিবার 122 কে সমস্ত প্রান্ত পুনর্নির্মাণ করতে হবে (যদিও এটি কেবলমাত্র খুব কার্যকরভাবে ব্যবহার করবে) প্রতিটি প্রশ্নের সীমাবদ্ধ সাবসেট)। প্রকৃত সংক্ষিপ্ততম পথ অনুসন্ধানের তুলনায় এটি করতে কত ব্যয় হয়েছে তা আমার কোনও ধারণা নেই।

আপনার মধ্যে কেউ কি 122k বা তার চেয়ে বেশি ওএসএম ডেটাসেটে পিগ্রাউটিং ব্যবহার করেন? আমার কোন পারফরম্যান্স আশা করা উচিত? কোন সেটিংস সবচেয়ে কার্যকরভাবে প্রভাবিত করে?


2
আমি একজন পিগ্রাউটিং বিশেষজ্ঞ নই, তবে আপনি কি ফলাফলগুলি ক্যাশে করতে পারবেন, উদাহরণস্বরূপ, আপনি যদি জানেন যে একটি সাধারণ সাব রুট সর্বদা ব্যবহৃত হয়, তবে আপনি কি তা শিখতে পারবেন? অতএব, আপনি কম অনুসন্ধান করতে হবে? এছাড়াও, আপনি কী ধমনী এবং সংগ্রহকারীদের সন্ধান সীমাবদ্ধ করেন?
dassouki

1
আমি নিখরচায় এটিএমের অনুমতি দিই, তাই আমি মনে করি না যে আমি সাব-রুটের জন্য অনেক কিছু অনুমান করতে পারি। এছাড়াও আমি শেষ x মিনিটের অনুসন্ধানগুলির ফলাফলটি ক্যাশে করছি, তবে এটি নতুন অনুসন্ধানগুলির জন্য আমাকে সহায়তা করে না। আমার একটা অনুভূতি আছে যে যতক্ষণ না আমি পুরো গ্রাফটিকে স্মৃতিতে স্থির রাখতে পারি ততক্ষণ এই আকারের একটি * খুব দ্রুত হওয়া উচিত। এমন লোকদের অবশ্যই থাকতে হবে যারা পুরো দেশ জুড়ে এই পথে যাত্রা করবেন যারা কীভাবে পারফরম্যান্সকে উন্নত করতে জানেন।
এমআরজি

1
অন্য বিকল্পটি হবে একটি ও / ডি ম্যাট্রিক্স (উত্স / গন্তব্য ম্যাট্রিক্স) তৈরি করা। ট্রাফিক ইঞ্জিনিয়ারিংয়ে এটি আমরা ব্যবহার করি technique নেটওয়ার্কগুলিকে জোনে বিভক্ত করুন, সুতরাং আসুন আমরা বলি যে একটি বড় শহরে 100 টি অঞ্চল থাকতে পারে। প্রতিটি জোনে একটি ডামি সেন্ট্রয়েড থাকবে। একটি নকল লিঙ্কের মাধ্যমে আপনার নেটওয়ার্কে সেন্ট্রয়েড সংযুক্ত করুন। তারপরে আপনি আপনার পুরো নেটওয়ার্কটি 100 x 100 ট্রিপস (মোট 10,000 টি ট্রিপস) হিসাবে পুনরায় তৈরি করতে পারেন। যখন কোনও ব্যবহারকারী কোনও অনুসন্ধান করেন, পিগ্রাউটিংয়ের উত্স এবং গন্তব্য পাশের সেন্ট্রয়েড বা ডামি লিঙ্কে বন্ধ একটি রুট খুঁজে পেতে হয়।
dassouki

2
কেউ যদি 1 জোন থেকে পরের জোন যেতে চান তবে আপনি কি অদ্ভুত ফলাফল পাবেন না তবে সেগুলি তাদের সেন্ট্রয়েডগুলির মধ্যে দিয়ে যায়? বা অঞ্চলগুলি আরও আলাদা করার সময় আপনি কেবল এটি ব্যবহার করেন? আপনার সমাধানটি সুনির্দিষ্ট করে তোলে যদি গ্রাহকরা এ থেকে বিতে দ্রুততর হতে চান তবে আমার ক্ষেত্রে আমাকে অবকাশের জন্য চলা, চক্র ইত্যাদি চলা গ্রাহকদের সাথে ডিল করতে হবে এবং অনন্য রুটগুলি বেছে নিতে চান এবং যেতে বাধ্য হবেন না স্ট্যান্ডার্ড রুট দিয়ে।
এমআরজি

3
আপনি যদি কোনও মাল্টিমোডাল সলিউশন (বাইক, হাঁটা, পাবলিক ট্রান্সপোর্টেশন, ড্রাইভ) সন্ধান করছেন, আপনার অবশ্যই পোর্টল্যান্ড, ওরেগনের ট্রাইমেট মাল্টিমোডাল রাউটিং সাইটটিতে নজর দেওয়া উচিত, যা ওপেনট্রিপপ্ল্যানার ব্যবহার করে: ট্রিমেট.আর
RyanDalton

উত্তর:


10

যখন এই জাতীয় কাজের মুখোমুখি হন তখন আপনার প্রাথমিক উদ্দেশ্যটি যৌক্তিক হতে হবে। 'অন্ত্রে অনুভূতি' এর ভিত্তিতে প্যারামগুলি পরিবর্তন করবেন না। অন্ত্রে হলিউডের জন্য কাজ করে বলে মনে হচ্ছে এটি সত্যিকারের বিশ্বে আমাদের জন্য নয় not ভাল, অন্তত আমার অন্ত্র না ;-)।

তোমার উচিত:

  1. ব্যবহারযোগ্য এবং পুনরাবৃত্তযোগ্য মেট্রিক স্থাপন করুন (পিগ্রাউটিং ক্যোয়ারীর জন্য প্রয়োজনীয় সময়ের মতো)

  2. একটি স্প্রেডশীটে মেট্রিক ফলাফলগুলি সংরক্ষণ করুন এবং সেগুলি গড় করুন (সেরা এবং সবচেয়ে খারাপটিকে বাতিল করুন)। এটি আপনাকে বলবে যে আপনি যে পরিবর্তনগুলি করছেন সেগুলি সঠিক পথে চলছে কিনা

  3. আপনার সার্ভারটি শীর্ষ এবং vmstat ব্যবহার করে নিরীক্ষণ করুন (ধরে নেওয়া উচিত আপনি * নিক্সে রয়েছেন) যখন অনুসন্ধানগুলি চলছে এবং উল্লেখযোগ্য নিদর্শনগুলি দেখুন: প্রচুর আইও, হাই সিপিইউ, অদলবদল ইত্যাদি যদি সিপিইউ i / o এর জন্য অপেক্ষা করে থাকে তবে উন্নতি করার চেষ্টা করুন ডিস্ক কর্মক্ষমতা (এটি সহজ হওয়া উচিত, নীচে দেখুন)। যদি সিপিইউ পরিবর্তে কোনও উল্লেখযোগ্য ডিস্ক অ্যাক্টিভিটি ছাড়াই 100% এ থাকে তবে আপনাকে ক্যোয়ারী উন্নত করার একটি উপায় খুঁজে বের করতে হবে (এটি সম্ভবত আরও শক্ত হতে চলেছে)।

সরলতার জন্য আমি ধরেই নিয়েছি যে নেটওয়ার্ক এখানে কোনও উল্লেখযোগ্য ভূমিকা পালন করছে না।

ডাটাবেসের কর্মক্ষমতা উন্নত করা

সর্বশেষতম পোস্টগ্র্যাস সংস্করণে আপগ্রেড করুন। সংস্করণ 9 পূর্ববর্তী সংস্করণগুলি থেকে অনেক ভাল। এটি নিখরচায় তাই আপনার কোনও কারণ নেই।

আমি ইতিমধ্যে এখানে প্রস্তাবিত বইটি পড়ুন ।

আপনার সত্যই এটি পড়া উচিত। আমি বিশ্বাস করি যে এই মামলার প্রাসঙ্গিক অধ্যায়গুলি 5,6,10,11

ডিস্কের কর্মক্ষমতা উন্নত করা হচ্ছে

  1. একটি এসএসডি ড্রাইভ পান এবং এটিতে সম্পূর্ণ ডাটাবেস রাখুন। পঠন কার্য সম্পাদন সম্ভবত-চতুর্থাংশ হবে এবং লেখার পারফরম্যান্সেও আমূল উন্নতি করা উচিত

  2. পোস্টগ্রিসে আরও মেমরি বরাদ্দ করুন। আদর্শভাবে আপনার যথেষ্ট মেমোরি বরাদ্দ করতে সক্ষম হওয়া উচিত যাতে পুরো (বা সবচেয়ে উষ্ণ অংশ) মেমোরিতে ক্যাশে যায় তবে খুব বেশি নয় যে অদলবদল ঘটে। অদলবদল খুব খারাপ। এটি পূর্ববর্তী অনুচ্ছেদে উদ্ধৃত বইতে আচ্ছাদিত রয়েছে

  3. সমস্ত ডিস্কে সময় নিষ্ক্রিয় করুন ( fstab এ noatime অপশন যোগ করুন)

কোয়েরি পারফোনেন্স উন্নত করা হচ্ছে

আপনার ক্যোয়ারী / আইস ট্রেস করতে এবং অনুকূলিত করার জন্য উপযুক্ত স্টপগুলি সন্ধান করতে উপরে বর্ণিত বইটিতে বর্ণিত সরঞ্জামগুলি ব্যবহার করুন।

হালনাগাদ

মন্তব্যের পরে আমি সঞ্চিত পদ্ধতির উত্স কোডটি দেখেছি

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

এবং মনে হয় যে একবার ক্যোয়ারী টিউন হয়ে গেলে উন্নতির আরও অনেক বেশি জায়গা নেই কারণ অ্যালগোরিদম সম্পূর্ণরূপে মেমরিতে চলে (এবং দুর্ভাগ্যক্রমে কেবলমাত্র একটি সিপিইউতে)। আমি আশঙ্কা করছি আপনার একমাত্র সমাধান হ'ল আরও ভাল / দ্রুত অ্যালগরিদম বা মাল্টিথ্রেডেড চালানো যায় এবং তারপরে এটি প্যাগগ্রাউটিংয়ের মতো একটি লাইব্রেরি তৈরি করে বা ডেটা পুনরুদ্ধারের জন্য কিছু মিডলওয়্যার ব্যবহার করে (এবং এটি ক্যাশে করা হতে পারে) এবং এটিকে অ্যালগরিদমে খাওয়ান।

আছে HTH


আপনার প্রস্তাবিত বইটির কিছু অংশ আমি পড়েছি। আমার ডেটাসেটটি এখনও সম্পূর্ণরূপে মেমরির সাথে ফিট করার মতো যথেষ্ট তাই আমি মনে করি ডিস্কের কার্যকারিতা কোনও বাধা হওয়া উচিত নয় (এটি নিশ্চিত করার জন্য পরীক্ষার সময় আমি আমার সংস্থানগুলি আরও ভাল করে পরীক্ষা করব)। আমি মনে করি পোস্টগ্র্রেসকিএল কেবলমাত্র পগ্রোটিং প্রক্রিয়ায় খেলতে আসে যখন এটি আসল অনুসন্ধান সম্পাদনের জন্য সারি / টিপলস সহ সি বুস্ট লাইব্রেরি খাওয়ানোর জন্য টেবিল থেকে একটি সাধারণ নির্বাচন করে * (কেউ এটি নিশ্চিত করতে পারে) তাই আমি আশঙ্কা করি যে সেখানে নেই পোষ্টগ্র্যাস্কল নিজেই অর্জন করার জন্য অনেক কিছুই resআপনার উত্তর পোস্টগ্র্যাসক্লোল পারফরম্যান্সের জন্য খুব ভাল বলে মনে হচ্ছে তবে সুনির্দিষ্ট পারফরম্যান্স পিগ্রাউটিংয়ের জন্য এমনটা নাও হতে পারে।
এমআরজি

@ এমআরজি আমি আসলে এটির কথা ভেবেছিলাম, তবে আমি নিশ্চিত হতে চেয়েছিলাম যে আপনি কম-ঝুলন্ত ফল ছেড়ে যাবেন না। এর কথা ভেবে আপনি 20 মিমি থেকে 3.5k থেকে 900ms তে 122k এর দিকে চলে গিয়েছিলেন, যা পুরোপুরি খারাপ নয়। শুভকামনা
unicoletti

সলিড স্টেট ড্রাইভগুলি পারফরম্যান্স বাড়ায় (কী
ক্যাচিংয়ের

আমার অভিজ্ঞতায়, যদি সমস্ত ডেটাসেট (টেবিল) এ পিগ্রাউটিং ব্যবহার করা হয় তবে পোস্টগ্রিজ ইঞ্জিন থেকে কোনও বড় সুবিধা নেই। সূচক এমনকি এটি অকেজো হিসাবে ব্যবহৃত হয় না। প্রতিটি ক্যোয়ারিতে পুরো টেবিলটি মেমরিতে লোড হয়। ভাগ করা বাফার এবং ক্যাশেগুলি কোনও কার্যকারিতা সুবিধা দেয়নি কারণ প্রতিটি ক্যোয়ারী সমস্ত টেবিলকে মেমরিতে লোড করে। যদি কেউ পরবর্তী প্রশ্নের জন্য মেমরিতে লোড হওয়া ডেটা পুনরায় ব্যবহার করতে সফল হয় তবে দয়া করে আমাদের জানান। কেবলমাত্র সম্ভাব্য পারফরম্যান্স বৃদ্ধি যা আমি এসডিডি ড্রাইভে দেখি, তবে আমি এটি কখনও পরীক্ষা করে দেখিনি। আরও মেমরি কেবল আরও সমবর্তী প্রশ্নগুলিকে অনুমতি দেয়, পারফরম্যান্স নয়।
মারিও মিলার

8

আমার ঠিক একই সমস্যা আছে এবং মেলিং তালিকাগুলিতে জিজ্ঞাসা করতে চলেছি, তাই সবাইকে ধন্যবাদ!

আমি রাউটিং টেবিলের উপর মিলিয়ন এবং অর্ধেক সারি দিয়ে শ্যুটিং স্টার ব্যবহার করছি । এটি গণনা করতে প্রায় দশ সেকেন্ড সময় লাগে। 20k সারি সহ এটি প্রায় তিন সেকেন্ড সময় নেয়। আমার শ্যুটিং স্টার দরকার কারণ আমার পালা সীমাবদ্ধতা প্রয়োজন।

আমি প্রয়োগ করার চেষ্টা করছি এমন কিছু ধারণা এখানে:

  • এসকিউএল-এ যেখানে পিজারাউটিংয়ের উপায়গুলি পাওয়া যায় সেখানে স্টি-বুফার ব্যবহার করুন যাতে এটি সমস্ত উপায় না পায়, তবে কেবল "নিকটবর্তী" উপায়গুলি:

    শর্টেস্ট_পথ_শুটিং_স্টার থেকে '(' নির্বাচন করুন রুট নির্বাচন করুন '* রাউটিং রুট থেকে, (st_buffer (st_collect (জ্যামিতি)) নির্বাচন করুন, 4) রাউটিং থেকে জ্যামিতি হিসাবে id =' || উত্স_ || 'বা আইডি =' || লক্ষ্য | | ') ই যেখানে যেখানে রুট.জোম্যাট্রি && e.geometry', উত্স, লক্ষ্য, সত্য, সত্য);

এটি পারফরম্যান্সের উন্নতি করেছে, তবে যদি উপায়টি বাফারের বাইরে যেতে হয় তবে এটি "কোনও পথ খুঁজে পাওয়া যায় না" ত্রুটিটি ফিরিয়ে আনতে পারে, তাই ... বড় বাফার? কোনও উপায় না পাওয়া পর্যন্ত বেশ কয়েকটি কল বাফারকে বাড়িয়ে দিচ্ছে?

  • দ্রুত রুটগুলি ক্যাশেড

ডাসৌকির পরামর্শ অনুসারে, আমি কিছু "দরকারী" রুটগুলি ক্যাশে করব যাতে দূরত্বটি খুব দীর্ঘ হয়, তবে এই দ্রুত রুটগুলি দিয়ে যেতে পারে এবং কেবল সেগুলির মধ্যে এবং বাইরে যাওয়ার পথটি সন্ধান করতে হবে।

  • জিআইএস সূচক দ্বারা পার্টিশন টেবিল

তবে আমি মনে করি, এটি যদি স্মৃতিতে যায় তবে তা আসলে কিছু যায় আসে না ... যাইহোক, এটি পরীক্ষা করা উচিত।

দয়া করে, আপনি যদি অন্য কোনও ধারণা পান তবে পোস্ট করে দিন।

এছাড়াও, আপনি কি জানেন যে Postgres9- এর জন্য কিছু সংকলিত পিজারআউটিং রয়েছে?


+1 এখানে কিছু দরকারী এবং গঠনমূলক ধারণা উপস্থিত রয়েছে। দয়া করে মনে রাখবেন যে আপনি যদি আপনার প্রশ্নের উত্তর চান তবে তা একটি নতুন প্রশ্ন হিসাবে তৈরি করা ভাল। আমাদের FAQ আপনাকে কীভাবে এগিয়ে যেতে হবে তা বলবে।
হোবার

ডেলাউইন, আমি আপনার প্রথম ধারণা (এসT_ বাফার) সম্পর্কেও ভাবছিলাম এবং একই সমস্যাটি আগে থেকেই দেখছিলাম। তবে সুবিধাটি 2 উপায়ে হতে পারে: ডেটাসেটটি আরও ছোট এবং এইভাবে দ্রুত এবং প্রসেসিংয়ের আরও অনেকগুলি পোস্টগ্র্যাস্কল-এ করা হচ্ছে বলে আপনার আবার এটির অনুকূলিতকরণের উপায় রয়েছে। এটিএম আমি উবুন্টু 11 ব্যবহার করছি যেখানে পোস্টগ্র্যাস্কিল 8.4 সর্বশেষতম সংস্করণ।
এমআরজি

মিঃজি, আমি পোস্টগ্র্রেএসকিউএল 9.0 এর জন্য কোনও উবুন্টু মাভারিকের উপর অনেক সমস্যা ছাড়াই সংকলন করেছি। পোস্টগ্রিসএসকিউএল 9.0 এর জন্য পোস্টগিজগুলি এখানে পাওয়া যাবে: ppa.launchpad.net/pi-deb/gis/ubuntu maverick / প্রধান amd64 প্যাকেজস
দলাভেন

আমি 2 ধারণা নিয়ে এসেছি। 1) 'দ্রুত রুটগুলি ক্যাশেড' এবং 'স্ট_বফার' এর সংমিশ্রণ। এইভাবে আপনি কোনও রুট সন্ধানের গ্যারান্টি দিচ্ছেন এবং লোকেদের একই রুটে বাধ্য করা হবে না। ২) কেবল একটি স্ট্যাটিক গ্রাফ পূরণ করতে পোস্টগিস ব্যবহার করুন (বুস্ট (সি), এনএক্স_স্পটিয়াল (পাইথন), নিও 4 জ (জাভা) ইত্যাদি) এবং প্রতিটি অনুসন্ধান প্রশ্নের জন্য সেই গ্রাফটি পুনরায় ব্যবহার করুন।
এমআরজি

শুরু এবং শেষের মধ্যবর্তী দূরত্ব একটি প্রান্তিকের চেয়ে বেশি হলে হাইওয়ের মতো 'দ্রুত' প্রান্তগুলির জন্য ব্যয়কে হ্রাস করার (অর্থাত্ পছন্দকে বাড়ানো) কী হবে? বুস্ট ফ্যাক্টরটি দূরত্বের সাথেও সম্পর্কিত হতে পারে: দীর্ঘ দূরত্বের জন্য বৃহত্তর, কমের জন্য ছোট।
unicoletti

5

একটি সক্রিয় বাঁকটি সংক্ষিপ্ততম পথের জন্য আমরা গিটে একটি শাখা তৈরি করেছি @ https://github.com/pgRouting/pgrouting/tree/trsp

দুঃখিত এখনও কোনও নথিপত্র নয়, তবে আপনি যদি পিজআউটিং তালিকায় প্রশ্ন জিজ্ঞাসা করেন তবে আমি সেখানে আউট আছি এবং প্রতিক্রিয়া জানাব। এই কোডটি শ্যুটিং স্টারের চেয়ে অনেক বেশি দ্রুত চলে এবং এটি ডিজকস্ট্রার অ্যালগরিদমের ভিত্তিতে।

-Steve


0

আমার কাছে একটি উত্স রুট টেবিল রয়েছে যাতে 00 1200000 প্রান্ত রয়েছে। আমার আই 7 তে এসএসডি সহ একটি রুট তৈরি হতে 12 সেকেন্ড সময় লাগে। পারফরম্যান্স বাড়ানোর জন্য আমার ধারণাটি প্রান্ত টেবিলটিকে কয়েকটি জুম স্তরের টেবিলগুলিতে ভাগ করা। আমি গুগল টাইলস সমান স্তরটি বলতে চাই। 8 ম জুম স্তরে, উদাহরণস্বরূপ, আমার কাছে 88 টি টেবিল রয়েছে। প্রতিটি সারণীতে রাস্তার একটি উপসেট থাকে এবং তাদের অঞ্চলগুলি একে অপরের সাথে ওভারল্যাপ হয় যাতে একে অপরের থেকে ২৯০ কিলোমিটারের বেশি দূরে নয় এমন দুটি পয়েন্টের মধ্যে একটি পথ নির্ধারণ করতে 2 সেকেন্ড লাগে। গণনার নবম স্তরের সময়ে 0.25 সেকেন্ডে নেমে যায় এবং আমাদের কাছে 352 টেবিল রয়েছে। আমরা রাস্তাগুলি সম্পাদনা করি এমন ক্ষেত্রে সমস্ত গ্রাফের বিনোদন এক ঘণ্টার বেশি সময় নেয় না। রাউটিংয়ের গতি বাড়ানোর মূল উপায় হ'ল ফ্লয়েড-ওয়ারশাল অ্যালগরিদম ব্যবহার করা। কিন্তু এতগুলি প্রান্তে পূর্বসূরী ম্যাট্রিক্স গণনা করতে কতটা লাগে তা কেউ জানে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.