ST_DWithin ST_Intersects की तुलना में मेरे परीक्षण में तेज़ था। यह आश्चर्य की बात है, खासकर जब से तैयार ज्यामिति एल्गोरिथ्म इस तरह के मामलों पर किक करने वाला है। मुझे लगता है कि एक मौका है कि यह काफी तेज होगा जितना मैंने यहां दिखाया है।
मैंने कुछ और परीक्षण किए और दो चीजों ने गति को लगभग दोगुना कर दिया। सबसे पहले, मैंने एक नए कंप्यूटर पर कोशिश की, लेकिन अभी भी एक बहुत ही साधारण लैपटॉप, शायद SATA3 ssd -disks को छोड़कर।
फिर नीचे दिए गए क्वेरी ने पुराने लैपटॉप पर 62 सेकंड के बजाय 18 सेकंड का समय लिया। आगे मैंने पाया कि जब मैंने लिखा था कि पॉइंट-टेबल पर सूचकांक आवश्यक नहीं था, तो मैं पहले पूरी तरह से गलत था। उस सूचकांक के साथ ST_Intersects ने अपेक्षा के अनुरूप व्यवहार किया और चीजें बहुत तेज़ हो गईं। मैंने पॉइंट-टेबल में अंकों की संख्या को बढ़ाकर 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);
72 सेकंड में चलता है। चूंकि 1249 पॉलीगॉन है, इसलिए 72 सेकंड में 1249000000 परीक्षण किए जाते हैं। यह प्रति सेकंड लगभग 17000000 परीक्षण करता है। या प्रति सेकंड सभी बहुभुज के खिलाफ लगभग 14000 अंक का परीक्षण।
इस परीक्षण से आपके 400000000 अंक परीक्षण करने के लिए लगभग 8 घंटे लगने चाहिए ताकि कई कोर को लोड वितरित करने में कोई परेशानी न हो। PostGIS मुझे प्रभावित करने के लिए कभी नहीं रोकता है :-)
सबसे पहले, परिणाम की कल्पना करने के लिए आप परिणाम तालिका में बिंदु ज्यामिति जोड़ सकते हैं, इसे उदाहरण के लिए QGIS में खोलें और इसे आयातित_ct फ़ील्ड पर अद्वितीय मानों के साथ शैली दें।
दूसरा, हाँ, आप दाएं (या बाएं) का उपयोग करके किसी भी बहुभुज के बाहर गिरने वाले बिंदुओं को इस तरह से जोड़ सकते हैं:
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.2 गीगाहर्ट्ज़ मुझे लगता है), 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;
फिर एक gid जोड़ना जैसे:
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 मिल पॉइंट करेंगे। इसलिए, यदि यह किसी एक बिंदु की जांच करने के लिए पर्याप्त है, तो मेरा पुराना लैपटॉप एक कोर के साथ कर सकता है।
लेकिन अगर आपको दोनों बिंदुओं को जांचने की आवश्यकता है तो यह कठिन हो सकता है।
जब आप db के विरुद्ध कई सत्रों को शुरू करके और अलग-अलग क्वेरीज़ को चलाकर एक से अधिक कोर को मैन्युअल रूप से वितरित कर सकते हैं।
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);
रनिंग के रूप में एक ही समय में एक db- सत्र पर:
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 सेकंड से ज्यादा नहीं हुआ।
टेबल टी 1 और टी 2 को आजमाने के लिए:
CREATE TABLE t3 AS
SELECT * FROM t1
UNION ALL
SELECT * FROM t2;
लगभग आधा सेकंड का उपयोग कर।
तो, नए हार्डवेयर के साथ और कई कोर पर लोड वितरित करने से यह बिल्कुल संभव होना चाहिए, भले ही असली दुनिया परीक्षण के मामले से धीमी हो।
यह ध्यान देने योग्य है कि उदाहरण लिनक्स (उबंटू) से है। विंडोज का उपयोग करना एक और कहानी होगी। लेकिन मेरे पास अन्य सभी दैनिक अनुप्रयोग चल रहे हैं, इसलिए लैपटॉप पहले से काफी भारी है। इतना है कि हो सकता है कि विंडोज़ मामले को बहुत अच्छी तरह से अनुकरण कर सकता है, बिना कुछ खोले लेकिन pgadmin।