200 মিলিয়ন পয়েন্ট বিশিষ্ট বিশিষ্ট পয়েন্ট ইন বহুভুজের বিশ্লেষণের জন্য দ্রুত সমাধান খুঁজছেন [বন্ধ]


35

আমার কাছে একটি সিএসভি রয়েছে যাতে নিম্নোক্ত ফর্ম্যাটটি সহ 200 মিলিয়ন পর্যবেক্ষণ রয়েছে:

id,x1,y1,x2,y2,day,color
1,"-105.4652334","39.2586939","-105.4321296","39.2236632","Monday","Black"
2,"-105.3224523","39.1323299","-105.4439944","39.3352235","Tuesday","Green"
3,"-104.4233452","39.0234355","-105.4643990","39.1223435","Wednesday","Blue"

স্থানাঙ্কের প্রতিটি সেট (x1 / y1 এবং x2 / y2) এর জন্য, আমি মার্কিন আদমশুমারি ট্র্যাক্ট বা সেন্সাস ব্লকটি যে এর মধ্যে পড়ে তা নির্ধারণ করতে চাই (আমি এখানে সেন্সাস ট্র্যাক্ট টাইগার আকৃতি ফাইল ডাউনলোড করেছি: ftp://ftp2.census.gov/ ভূ / বাঘ / TIGER2011 / ট্র্যাক্ট / tl_2011_08_tract.zip )। সুতরাং, প্রতিটি পর্যবেক্ষণের জন্য আমাকে দু'বার পয়েন্ট-ইন-বহুভুজ অপারেশন করতে হবে। ম্যাচগুলি খুব নির্ভুল হওয়া গুরুত্বপূর্ণ।

এটি করার দ্রুততম উপায় কী, সফটওয়্যারটি শেখার সময় সহ? আমার কাছে 48 গিগাবাইট মেমোরি সহ একটি কম্পিউটারে অ্যাক্সেস রয়েছে - যদি এটি কোনও প্রাসঙ্গিক বাধা হয়ে থাকে।

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

আমার প্রথম প্রয়াস (এই সাইটটি সন্ধান করার আগে) আরএসজিআইএস ব্যবহার করে ইউএস সেন্সাস ব্লকে ডেটা (100,000 পয়েন্ট) সাবমেরেলের একটি স্থানিক যোগ (কেবলমাত্র x1 / y1) করার জন্য অন্তর্ভুক্ত ছিল। আমি প্রক্রিয়াটি মেরে ফেলার আগে এটি 5 ঘন্টা ধরে নিয়েছে। আমি এমন একটি সমাধানের প্রত্যাশা করছি যা কম্পিউটারের সময়কালের 40 ঘন্টার কম সময়ে পুরো ডেটাसेटটিতে প্রয়োগ করা যেতে পারে।

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


3
40 ঘন্টা প্রতি সেকেন্ডে প্রায় 2800 পয়েন্ট-ইন-বহুভুজ ক্রিয়াকলাপের সমান হয়। এটি কেবল মনে মনে সম্ভব হয় না। আমার কোন ধারণা নেই যে কোন সফটওয়্যার (আরকজিআইএস, পোস্টজিআইএস, স্প্যাটিয়ালাইট ইত্যাদি) দ্রুততম, তবে একটি স্পেসিয়াল ইনডেক্স সন্দেহ ছাড়াই প্রয়োজন।
উফ কাউসগার্ড

1
বহুভুজ জটিল না হলে কোনও সমস্যা হওয়া উচিত নয়। সূচক থেকে প্রাপ্ত (পোস্টজিআইএসে) বহুভুজ কত বড় তা নির্ভর করবে। আরও ছোট বহুভুজ (ছোট বাউন্ডিং বাক্স) তত সূচকে সহায়তা করবে। সম্ভবত এটি সম্ভব।
নিক্লাস অ্যাভেন

বহুভুজ প্রতি ~ 600 পয়েন্ট সহ 1249 বহুভুজ।
উফ কাউসগার্ড

3
@ আফস কাউসগার্ড, হ্যাঁ এটা একেবারেই সম্ভব। আপনি আমাকে চেষ্টা করে দেখিয়েছেন নীচে উত্তর উত্তর।
নিক্লাস অ্যাভেন

চ্যালেঞ্জে উঠার জন্য কুডোস! কিছু বেঞ্চ পরীক্ষায় স্পটালালাইট প্রকৃতপক্ষে পোস্টজিআইএসের চেয়ে দ্রুত সম্পাদন করে তবে আপনি কীভাবে আপনার আরটিআর সেট আপ করবেন সে বিষয়ে আপনাকে যত্নবান হতে হবে। আমি প্রায়শই 'অভ্যন্তরীণ' থেকে দৌড়ানোর সময় আর্কজিআইএসকে ধীর হতে দেখেছি তবে বাইরে 'স্ট্যান্ড একা' আর্কপাই মডিউল 'বাইরে' চালানোর সময় আরও দ্রুত faster
ম্যাপ্পাগনোসিস

উত্তর:


27

ST_DWithin আমার পরীক্ষায় ST_Intersects এর চেয়ে দ্রুত ছিল। এটি অবাক করার বিষয়, বিশেষত যেহেতু প্রস্তুত জ্যামিতি অ্যালগরিদম এই জাতীয় ক্ষেত্রে লাথি মারার কথা। আমি মনে করি যে এখানে একটি সম্ভাবনা আছে যা আমি এখানে দেখিয়েছি তার চেয়ে অনেক বেশি দ্রুত হবে।


আমি আরও কিছু পরীক্ষা করেছিলাম এবং দুটি জিনিস গতি প্রায় 10-দ্বিগুণ করে ফেলেছিলাম। প্রথমত, আমি একটি নতুন কম্পিউটারে চেষ্টা করেছি, তবে এখনও সম্ভবত একটি সাধারণ ল্যাপটপ, সম্ভবত SATA3 এসএসডি-ডিস্কগুলি ব্যতীত।

তারপরে নীচের ক্যোয়ারীটি পুরানো ল্যাপটপে 62 সেকেন্ডের পরিবর্তে 18 সেকেন্ড নিয়েছে। এরপরে আমি দেখতে পেলাম যে আমি লেখার আগে পয়েন্ট-টেবিলের সূচি প্রয়োজনীয় ছিল না বলে আমি সম্পূর্ণ ভুল ছিল। সেই সূচকে সেই জায়গায় রেখে ST_ আন্তঃরূপগুলি প্রত্যাশা অনুযায়ী আচরণ করে এবং জিনিসগুলি খুব দ্রুত হয়ে যায়। আমি পয়েন্ট-টেবিলের পয়েন্টের সংখ্যা 1 মিলিয়ন পয়েন্ট এবং ক্যোয়ারিতে বাড়িয়েছি:

CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id 
FROM imported_ct , t WHERE ST_Intersects(imported_ct.geom , t.geom);

seconds২ সেকেন্ডে চলে। যেহেতু 1249 বহুভুজ রয়েছে, 1249000000 পরীক্ষা 72 সেকেন্ডে করা হয়। এটি প্রতি সেকেন্ডে প্রায় 17000000 পরীক্ষা করে। অথবা প্রতি সেকেন্ডে বহুভুজগুলির বিপরীতে প্রায় 14000 পয়েন্ট পরীক্ষা করে।

এই পরীক্ষা থেকে আপনার 400000000 পয়েন্ট পরীক্ষার জন্য বেশ কয়েকটি কোরে লোড বিতরণ করতে কোনও সমস্যা ছাড়াই প্রায় 8 ঘন্টা সময় নেওয়া উচিত। পোস্টজিআইএস কখনই আমাকে প্রভাবিত করতে থামে না :-)


প্রথমত, ফলাফলটি কল্পনা করার জন্য আপনি ফলাফল টেবিলটিতে পয়েন্ট জ্যামিতি যুক্ত করতে পারেন, উদাহরণস্বরূপ এটি QGIS এ খুলুন এবং আমদানিকৃত_সিটি ক্ষেত্রে অনন্য মান সহ এটি স্টাইল করুন।

দ্বিতীয়ত, হ্যাঁ, আপনি ডান (বা বাম) ব্যবহার করে কোনও বহুভুজের বাইরে যে পয়েন্টগুলি পড়েছেন তাও পেতে পারেন:

CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id 
FROM imported_ct right join t ON ST_Intersects(imported_ct.the_geom , t.geom);

পোস্টজিআইএস সম্ভব বলে মনে হচ্ছে কিনা তা যাচাই করার জন্য আমি কয়েকটি পরীক্ষা করেছি।

প্রথম কিছু আমি বুঝতে পারি না। আপনার সারিতে প্রতি দুটি পয়েন্ট রয়েছে। সবসময় উভয় পয়েন্ট একই বহুভুজ মধ্যে হয়? তারপরে একটি পয়েন্টে গণনা করা যথেষ্ট। যদি তারা দুটি পৃথক বহুভুজ হতে পারে তবে আপনার এক পয়েন্ট সারি দুটি বহুভুজের সাথে সংযোগ করার একটি উপায় প্রয়োজন।

পরীক্ষাগুলি থেকে এটি করণীয় মতো মনে হয় তবে একের বেশি সিপিইউ-কোরের উপরে লোড ছড়িয়ে দিতে আপনার কিছু সৃজনশীল সমাধানের প্রয়োজন হতে পারে।

আমি 4 বছরের পুরানো ল্যাপটপে ডুয়াল কোর সেন্ট্রিনো সিপিইউ (প্রায় 2.2GHz মনে করি), 2 জিবি র‌্যাম দিয়ে পরীক্ষা করেছি। আপনার কাছে 48 বিজি র‌্যাম থাকলে আমার ধারণা আপনার কাছে আরও অনেক সিপিইউ শক্তি রয়েছে।

আমি যা করেছি তা হ'ল 100000 পয়েন্ট সহ এলোমেলো পয়েন্ট টেবিল তৈরি করা:

CREATE TABLE t AS
WITH r AS
(SELECT ST_Extent(the_geom)::geometry ext FROM imported_ct)
SELECT ST_Point(x,y) AS geom FROM 
(SELECT GENERATE_SERIES(1,100000)) s,
(SELECT ST_Xmin(ext)+(random()*(ST_Xmax(ext)-ST_Xmin(ext))) x, ST_Ymin(ext)+(random()*(ST_Ymax(ext)-ST_Ymin(ext))) y FROM r
) f;

তারপরে একটি গ্রিড যুক্ত করুন:

ALTER TABLE t ADD COLUMN GID SERIAL;

তারপরে চলছে:

CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE ST_Dwithin(imported_ct.the_geom , t.geom,0);

প্রায় 62 সেকেন্ড সময় লাগে (একই পরিমাণ পয়েন্টের সাথে আপনার আরকজিআইএস ফলাফলের সাথে তুলনা করুন)। ফলাফলটি একটি সারণী যা আমার সারণির টিতে পয়েন্টগুলি সংখ্যার সাথে সেন্সাস ট্র্যাক্টের সাথে টেবিলের গিডের সাথে সংযুক্ত করে।

এই গতিতে আপনি প্রায় 34 ঘন্টা মধ্যে 200 মিল পয়েন্ট করবেন। সুতরাং, যদি এটির একটি বিন্দু পরীক্ষা করে যথেষ্ট হয় তবে আমার পুরানো ল্যাপটপটি এটি একটি কোর দিয়ে করতে পারে।

তবে আপনার যদি উভয় পয়েন্ট পরীক্ষা করতে হয় তবে এটি আরও শক্ত হতে পারে।

তারপরে আপনি নিজেই ডিবি-র বিরুদ্ধে একাধিক সেশন শুরু করে একাধিক কোরে লোডটি বিতরণ করতে পারেন এবং বিভিন্ন কোয়েরি চালাতে পারেন।

আমার উদাহরণে 50000 পয়েন্ট এবং দুটি সিপিইউ-কোর দিয়ে চেষ্টা করেছি:

CREATE TABLE t1 as
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE t.gid >50000 and  ST_Dwithin(imported_ct.the_geom , t.geom,0);

চলমান হিসাবে একই সময়ে একটি ডিবি-সেশনে:

CREATE TABLE t2 as
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE t.gid <=50000 and  ST_Dwithin(imported_ct.the_geom , t.geom,0);

অন্য ডিবি-সেশনে

এটি প্রায় 36 সেকেন্ড সময় নিয়েছে তাই সম্ভবত একই সাথে ডিস্ক রচনার উপর নির্ভর করে এটি প্রথম উদাহরণের চেয়ে কিছুটা ধীর। তবে যেহেতু বিথ কোর একই সাথে কাজ করছে এটি আমার সময়কালে 36 সেকেন্ডের বেশি সময় নেয় নি।

টেবিল t1 এবং t2 একত্রিত করতে:

CREATE TABLE t3 AS 
SELECT * FROM t1
UNION ALL
SELECT * FROM t2;

প্রায় অর্ধেক সেকেন্ড ব্যবহার করে।

সুতরাং, ফ্রেশার হার্ডওয়্যার এবং অনেকগুলি কোরের উপরে লোড বিতরণের মাধ্যমে বাস্তব জগতটি পরীক্ষার ক্ষেত্রে ধীর হয়ে গেলেও এটি একেবারে সম্ভব।

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


1
আমি কেবল .tl_2011_08_trac এর নাম পরিবর্তন করে আমদানি করা হয়েছে_ কারণ এটি লেখা সহজ ছিল। সুতরাং, আমার কোয়েরিতে আমদানি করা_সিটিটি কেবল .tl_2011_08_trac এ পরিবর্তন করুন এবং আপনার সূক্ষ্ম হওয়া উচিত।
নিক্লাস অ্যাভেন

2
@ মীর বিটিডাব্লু, টেমপ্লেট_পোস্টগিস_২০ কে ভবিষ্যতের ডেটাবেসগুলির জন্য টেম্পলেট ছাড়া অন্য কিছু হিসাবে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে না। যেহেতু আপনার কাছে পোস্টজিআইএস ২.০ রয়েছে বলে মনে হয়, আপনার যদি পোস্টগ্রিজএসকিউএল ৯.১ থাকে তবে আপনি কেবল একটি নতুন ডিবি তৈরি করতে পারেন এবং "ক্রমবর্ধমান পোষ্টগিজ তৈরি করতে পারেন;"
নিক্লাস অ্যাভেন

1
হ্যাঁ, এটি ছিল আরও একটি টাইপ যা আমার মনে হয় আমি কয়েক মিনিট আগে ঠিক করেছি। এর জন্যে দুঃখিত. পরিবর্তে ST_Intersects সংস্করণ ব্যবহার করে দেখুন, এটি বেশ দ্রুত হওয়া উচিত।
নিক্লাস অ্যাভেন 22

1
@ মীর প্রতিটি পয়েন্ট প্রভাবিত না হওয়ার কারণটি হল এলোমেলো পয়েন্টগুলি একটি আয়তক্ষেত্রগুলিতে স্থাপন করা হয়েছে এবং আমার ধারণা মানচিত্রটি ঠিক একটি আয়তক্ষেত্র নয়। ফলাফলটি কীভাবে দেখতে হবে তা দেখানোর জন্য আমি পোস্টে একটি সম্পাদনা করব।
নিক্লাস অ্যাভেন

1
@ উফ কাউসগার্ড, হ্যাঁ, আমি অনুমান করি আপনি এটি সেভাবেই রাখতে পারেন। এটি একবারে একটি বহুভুজ লাগে এবং প্রান্তের একটি গাছ তৈরি করে এটি প্রস্তুত করে। তারপরে এটি প্রস্তুতকৃত বহুভুজের বিপরীতে সমস্ত পয়েন্ট (যা সূচকটি বাক্সবাক্সগুলিকে ওভারল্যাপ করে সন্ধান করেছে) পরীক্ষা করে।
নিক্লাস অ্যাভেন

4

সম্ভবত সবচেয়ে সহজ উপায়টি পোস্টজিআইএস দিয়ে। ইন্টারনেটে কিছু টিউটোরিয়াল রয়েছে কীভাবে পোস্টজিআইএসে সিএসভি / টিএসটি পয়েন্ট ডেটা আমদানি করা যায়। Link1

পোস্টজিআইএসে পয়েন্ট-ইন-বহুভুজ অনুসন্ধানগুলির কার্যকারিতা সম্পর্কে আমি নিশ্চিত নই; এটি আরকিজিআইএসের চেয়ে দ্রুত হওয়া উচিত। পোস্টজিআইএস যে জিআইএসটি স্থানিক সূচকগুলি ব্যবহার করে তা খুব দ্রুত। Link2 Link3

আপনি মঙ্গোডিবি জিওপ্যাটিয়াল সূচকটিও পরীক্ষা করতে পারেন । তবে এটি শুরু করতে আরও কিছুটা সময় প্রয়োজন। আমি বিশ্বাস করি যে মঙ্গোডিবি সত্যই দ্রুত হতে পারে। আমি এটি পয়েন্ট-ইন-বহুভুজ অনুসন্ধানগুলির সাথে পরীক্ষা করেছি না তাই নিশ্চিত হতে পারে না।

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