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;
প্রায় অর্ধেক সেকেন্ড ব্যবহার করে।
সুতরাং, ফ্রেশার হার্ডওয়্যার এবং অনেকগুলি কোরের উপরে লোড বিতরণের মাধ্যমে বাস্তব জগতটি পরীক্ষার ক্ষেত্রে ধীর হয়ে গেলেও এটি একেবারে সম্ভব।
লক্ষ্য করার মতো বিষয় যে উদাহরণটি লিনাক্স (উবুন্টু) থেকে এসেছে। উইন্ডোজ ব্যবহার করা অন্য গল্প হবে। তবে আমার অন্যান্য সমস্ত প্রাত্যহিক অ্যাপ্লিকেশন চলছে তাই ল্যাপটপটি আগে থেকে বেশ ভারী লোড হয়। সুতরাং এটি উইন্ডোজ কেসটি খুব ভালভাবে অনুকরণ করতে পারে, পগাডমিন ছাড়া আর কিছু না খোলাই।