मुझे कितनी तेजी से PostGIS से अच्छी तरह से फॉर्मेट किए गए पते की उम्मीद करनी चाहिए?


17

मुझे कितनी तेजी से PostGIS से अच्छी तरह से फॉर्मेट किए गए पते की उम्मीद करनी चाहिए?

मैंने PostgreSQL 9.3.7 और PostGIS 2.1.7 को स्थापित किया है, राष्ट्र डेटा और सभी राज्यों के डेटा को लोड किया है लेकिन मैंने अनुमान के मुकाबले जियोकोडिंग को बहुत धीमा पाया है। क्या मैंने अपनी अपेक्षाएँ बहुत ऊँची कर दी हैं? मुझे प्रति सेकंड औसतन 3 व्यक्तिगत जियोकोड मिल रहे हैं। मुझे लगभग 5 मिलियन करने की आवश्यकता है और मैं इसके लिए तीन सप्ताह इंतजार नहीं करना चाहता।

यह विशाल आर मैट्रिस के प्रसंस्करण के लिए एक आभासी मशीन है और मैंने इस डेटाबेस को किनारे पर स्थापित किया है ताकि कॉन्फ़िगरेशन थोड़ा नासमझ दिखे। यदि VM के कॉन्फ़िगरेशन में एक बड़ा परिवर्तन मदद करेगा, तो मैं कॉन्फ़िगरेशन को बदल सकता हूं।

हार्डवेयर चश्मा

मेमोरी: 65 जीबी प्रोसेसर: 6 lscpuमुझे यह देता है:

# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                6
On-line CPU(s) list:   0-5
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             6
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Stepping:              0
CPU MHz:               2400.000
BogoMIPS:              4800.00
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0-5

ओएस सेंटोस है, uname -rvयह देता है:

# uname -rv
2.6.32-504.16.2.el6.x86_64 #1 SMP Wed Apr 22 06:48:29 UTC 2015

Postgresql config

> select version()
"PostgreSQL 9.3.7 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11), 64-bit"
> select PostGIS_Full_version()
POSTGIS="2.1.7 r13414" GEOS="3.4.2-CAPI-1.8.2 r3921" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, released 2012/10/08" LIBXML="2.7.6" LIBJSON="UNKNOWN" TOPOLOGY RASTER"

प्रश्नों के इन प्रकार के लिए पिछले सुझाव के आधार पर मैंने बढ़ाकर shared_buffersमें postgresql.confउपलब्ध रैम और राम का 1/2 के लिए प्रभावी कैश आकार का 1/4 के बारे में करने के लिए फ़ाइल:

shared_buffers = 16096MB     
effective_cache_size = 31765MB

मेरे पास installed_missing_indexes()और (कुछ तालिकाओं में डुप्लिकेट आवेषणों को हल करने के बाद) कोई त्रुटि नहीं है।

जियोकोडिंग SQL उदाहरण # 1 (बैच) ~ औसत समय 2.8 / सेकंड है

मैं http://postgis.net/docs/Geocode.html से उदाहरण का अनुसरण कर रहा हूं , जिससे मुझे जियोकोड से पता रखने वाली एक तालिका बनाई गई है, और फिर एक एसक्यूएल किया जा रहा है UPDATE:

UPDATE addresses_to_geocode
              SET  (rating, longitude, latitude,geo) 
              = ( COALESCE((g.geom).rating,-1),
              ST_X((g.geom).geomout)::numeric(8,5), 
              ST_Y((g.geom).geomout)::numeric(8,5),
              geo )
              FROM (SELECT "PatientId" as PatientId
              FROM addresses_to_geocode 
              WHERE "rating" IS NULL ORDER BY PatientId LIMIT 1000) As a
              LEFT JOIN (SELECT "PatientId" as PatientId, (geocode("Address",1)) As geom
              FROM addresses_to_geocode As ag
              WHERE ag.rating IS NULL ORDER BY PatientId LIMIT 1000) As g ON a.PatientId = g.PatientId
              WHERE a.PatientId = addresses_to_geocode."PatientId";

मैं 1000 से ऊपर के बैच आकार का उपयोग कर रहा हूं और यह 337.70 सेकंड में लौटता है। यह छोटे बैचों के लिए थोड़ा धीमा है।

जियोकोडिंग SQL उदाहरण # 2 (पंक्ति द्वारा पंक्ति) ~ औसत समय 1.2 / सेकंड है

जब मैं एक बार में इस तरह दिखने वाले एक स्टेटमेंट के साथ जियोकोड्स करके अपने पते में खुदाई करता हूं (btw, नीचे दिया गया उदाहरण 4.14 सेकंड लिया गया),

SELECT g.rating, ST_X(g.geomout) As lon, ST_Y(g.geomout) As lat, 
    (addy).address As stno, (addy).streetname As street, 
    (addy).streettypeabbrev As styp, (addy).location As city, 
    (addy).stateabbrev As st,(addy).zip 
FROM geocode('6433 DROMOLAND Cir NW, MASSILLON, OH 44646',1) As g;

यह थोड़ा धीमा (2.5x प्रति रिकॉर्ड) है, लेकिन मैं क्वेरी समय के वितरण को देख सकता हूं और यह देख सकता हूं कि यह लंबे प्रश्नों का एक अल्पसंख्यक है जो इसे सबसे अधिक धीमा कर रहे हैं (केवल 5 मिलियन के पहले 2600 में लुकअप समय है)। यही है, शीर्ष 10% औसतन 100 ms, निचले 10% औसत 3.69 सेकंड ले रहे हैं, जबकि औसत 754 ms और माध्य 340 ms है।

# Just some interaction with the data in R
> range(lookupTimes[1:2600])
[1]  0.00 11.54
> median(lookupTimes[1:2600])
[1] 0.34
> mean(lookupTimes[1:2600])
[1] 0.7541808
> mean(sort(lookupTimes[1:2600])[1:260])
[1] 0.09984615
> mean(sort(lookupTimes[1:2600],decreasing=TRUE)[1:260])
[1] 3.691269
> hist(lookupTimes[1:2600]

पहली 2600 पंक्तियों के लिए जियोकोडिंग बार

अन्य विचार

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

sql=paste0("select pprint_addy(normalize_address('",myAddress,"'))")

गैर-पोस्टग्रैसेक डेटाबेस से उपयोगकर्ता पता तालिका में संकलित स्ट्रिंग कहां myAddressहै [Address], [City], [ST] [Zip]

मैंने pagc_normalize_addressएक्सटेंशन स्थापित करने की कोशिश की (विफल), लेकिन यह स्पष्ट नहीं है कि इससे मुझे जिस तरह का सुधार मिल रहा है, वह मिल जाएगा। सुझाव के अनुसार निगरानी जानकारी जोड़ने का संपादन किया

प्रदर्शन

एक सीपीयू आंकी जाती है: [संपादित करें, प्रति क्वेरी केवल एक प्रोसेसर, इसलिए मेरे पास 5 अप्रयुक्त सीपीयू हैं]

top - 14:10:26 up 1 day,  3:11,  4 users,  load average: 1.02, 1.01, 0.93
Tasks: 219 total,   2 running, 217 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.4%us,  1.5%sy,  0.0%ni, 83.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65056588k total, 64613476k used,   443112k free,    97096k buffers
Swap: 262139900k total,    77164k used, 262062736k free, 62745284k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3130 postgres  20   0 16.3g 8.8g 8.7g R 99.7 14.2 170:14.06 postmaster
11139 aolsson   20   0 15140 1316  932 R  0.3  0.0   0:07.78 top
11675 aolsson   20   0  135m 1836 1504 S  0.3  0.0   0:00.01 wget
    1 root      20   0 19364 1064  884 S  0.0  0.0   0:01.84 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.06 kthreadd

डेटा विभाजन पर डिस्क गतिविधि का नमूना, जबकि एक खरीद 100% आंकी जाती है: [संपादित करें: इस क्वेरी द्वारा उपयोग में केवल एक प्रोसेसर]

# dstat -tdD dm-3 1
----system---- --dsk/dm-3-
  date/time   | read  writ
12-06 14:06:36|1818k 3632k
12-06 14:06:37|   0     0
12-06 14:06:38|   0     0
12-06 14:06:39|   0     0
12-06 14:06:40|   0    40k
12-06 14:06:41|   0     0
12-06 14:06:42|   0     0
12-06 14:06:43|   0  8192B
12-06 14:06:44|   0  8192B
12-06 14:06:45| 120k   60k
12-06 14:06:46|   0     0
12-06 14:06:47|   0     0
12-06 14:06:48|   0     0
12-06 14:06:49|   0     0
12-06 14:06:50|   0    28k
12-06 14:06:51|   0    96k
12-06 14:06:52|   0     0
12-06 14:06:53|   0     0
12-06 14:06:54|   0     0 ^C

उस एसक्यूएल का विश्लेषण करें

यह EXPLAIN ANALYZEउस क्वेरी से है:

"Update on addresses_to_geocode  (cost=1.30..8390.04 rows=1000 width=272) (actual time=363608.219..363608.219 rows=0 loops=1)"
"  ->  Merge Left Join  (cost=1.30..8390.04 rows=1000 width=272) (actual time=110.934..324648.385 rows=1000 loops=1)"
"        Merge Cond: (a.patientid = g.patientid)"
"        ->  Nested Loop  (cost=0.86..8336.82 rows=1000 width=184) (actual time=10.676..34.241 rows=1000 loops=1)"
"              ->  Subquery Scan on a  (cost=0.43..54.32 rows=1000 width=32) (actual time=10.664..18.779 rows=1000 loops=1)"
"                    ->  Limit  (cost=0.43..44.32 rows=1000 width=4) (actual time=10.658..17.478 rows=1000 loops=1)"
"                          ->  Index Scan using "addresses_to_geocode_PatientId_idx" on addresses_to_geocode addresses_to_geocode_1  (cost=0.43..195279.22 rows=4449758 width=4) (actual time=10.657..17.021 rows=1000 loops=1)"
"                                Filter: (rating IS NULL)"
"                                Rows Removed by Filter: 24110"
"              ->  Index Scan using "addresses_to_geocode_PatientId_idx" on addresses_to_geocode  (cost=0.43..8.27 rows=1 width=152) (actual time=0.010..0.013 rows=1 loops=1000)"
"                    Index Cond: ("PatientId" = a.patientid)"
"        ->  Materialize  (cost=0.43..18.22 rows=1000 width=96) (actual time=100.233..324594.558 rows=943 loops=1)"
"              ->  Subquery Scan on g  (cost=0.43..15.72 rows=1000 width=96) (actual time=100.230..324593.435 rows=943 loops=1)"
"                    ->  Limit  (cost=0.43..5.72 rows=1000 width=42) (actual time=100.225..324591.603 rows=943 loops=1)"
"                          ->  Index Scan using "addresses_to_geocode_PatientId_idx" on addresses_to_geocode ag  (cost=0.43..23534259.93 rows=4449758000 width=42) (actual time=100.225..324591.146 rows=943 loops=1)"
"                                Filter: (rating IS NULL)"
"                                Rows Removed by Filter: 24110"
"Total runtime: 363608.316 ms"

Http://explain.depesz.com/s/vogS पर बेहतर ब्रेकडाउन देखें


1
जब आप क्वेरी चलाते हैं तो मशीन क्या करती है? क्या यह आईओ पर ब्लॉक करता है या कहीं और अड़चन है?
til_b

1
आपने कितने राज्यों को लोड किया है। मैं आम तौर पर 30ms से कहीं भी मिलता हूं - 150 एमएस प्रति पता 4-8 जीबी रैम के साथ 64-बिट बॉक्स पर। आमतौर पर हालांकि मैं केवल 1 या 2 राज्यों के साथ काम कर रहा हूं। प्रदर्शन के लिए अधिक राज्यों के प्रभाव पर बेंचमार्क नहीं किया गया।
LR1234567

@ LR1234567 50 राज्य
आर्या

1
@til_b सीपीयू 99.7%
ऐरीनो

ऐसा लगता है जैसे हम बस कुछ हफ़्ते इंतजार करने जा रहे हैं, क्योंकि इस चीज़ को खत्म करने में कुछ समय लगता है क्योंकि यह एक बार की चीज़ है और हम 100 पते / दिन के रनटाइम लोड के साथ रखने के लिए बहुत सारा रस छोड़ देंगे। हम अनुभव प्राप्त कर रहे हैंं। जब तक हम वास्तव में सम्मोहक है कि हमें हमारे pegged CPUs के आसपास प्राप्त करने देता है मामले में समाप्त होने तक मैं इसे खुला रखूंगा।
अनेनो

जवाबों:


7

मैंने इसके साथ प्रयोग करने में बहुत समय बिताया है, मुझे लगता है कि अलग-अलग कोण से पोस्ट करना बेहतर है।

यह वास्तव में एक जटिल विषय है, मेरे ब्लॉग पोस्ट में जियोकोडिंग सर्वर सेटअप और मेरे द्वारा उपयोग की जाने वाली स्क्रिप्ट के बारे में अधिक विवरण देखें । यहां कुछ संक्षिप्त सारांश दिए गए हैं:

केवल 2 स्टेट्स डेटा वाला सर्वर हमेशा सभी 50 स्टेट्स डेटा के साथ लोड किए गए सर्वर से तेज होता है।

मैंने अलग-अलग समय में अपने होम पीसी के साथ इसे सत्यापित किया और दो अलग-अलग अमेज़ॅन एडब्ल्यूएस सर्वर।

2 राज्यों डेटा के साथ मेरे AWS फ्री टियर सर्वर में केवल 1G रैम है, लेकिन इसमें 1000 रिकॉर्ड और 45,000 रिकॉर्ड के साथ डेटा के लिए 43 ~ 59 ms प्रदर्शन लगातार है।

मैंने लोड किए गए सभी राज्यों के साथ 8G RAM AWS सर्वर के लिए बिल्कुल समान सेटअप प्रक्रिया का उपयोग किया, बिल्कुल एक ही स्क्रिप्ट और डेटा, और प्रदर्शन 80 ~ 105 एमएस तक गिर गया।

मेरा सिद्धांत यह है कि जब जियोकोडर पते में मिलान नहीं कर सकता है, तो उसने खोज सीमा को व्यापक करना शुरू कर दिया और कुछ हिस्से को अनदेखा कर दिया, जैसे कि ज़िपकोड या शहर। यही कारण है कि जियोकोड दस्तावेज़ दावा करता है कि यह गलत ज़िप कोड के साथ पते को याद कर सकता है, हालांकि इसमें 3000 एमएस लिया गया था।

केवल 2 राज्यों के डेटा लोड होने के साथ, सर्वर को फलहीन खोज में बहुत कम समय लगेगा या बहुत कम स्कोर के साथ मैच होगा, क्योंकि यह केवल 2 राज्यों में खोज कर सकता है।

मैंने restrict_regionजियोडोड फ़ंक्शन में राज्य मल्टीप्लाइगोन के पैरामीटर को सेट करके इसे सीमित करने की कोशिश की , मुझे उम्मीद है कि फलहीन खोज से बचना होगा क्योंकि मुझे यकीन है कि अधिकांश पते सही अवस्था में हैं। इन दो संस्करणों की तुलना करें:

  select geocode('501 Fairmount DR , Annapolis, MD 20137',1); 
  select geocode('501 Fairmount DR , Annapolis, MD 20137', 1, the_geom) from tiger.state where statefp = '24';

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

इसलिए restrict_regionमैं काम नहीं कर रहा हूं जैसा कि मैं चाहता था, शायद इसका उपयोग कई हिट परिणामों को फ़िल्टर करने के लिए किया गया था, न कि खोज सीमाओं को सीमित करने के लिए।

आप अपने पोस्टग्रे को थोड़ा-थोड़ा करके धुन सकते हैं।

लापता अनुक्रमणिका को स्थापित करने का सामान्य संदेह, वैक्यूम विश्लेषण से मुझे कोई फर्क नहीं पड़ा, क्योंकि डाउनलोडिंग स्क्रिप्ट ने पहले से ही आवश्यक रखरखाव किया है, जब तक कि आप उनके साथ गड़बड़ नहीं करते।

हालाँकि इस पोस्ट के अनुसार पोस्टग्रैफ सेटिंग स्थापित करने से मदद मिली। ५० राज्यों के साथ मेरा पूर्ण पैमाने पर सर्वर ३२० एमएस था जो कुछ बदतर आकार के डेटा के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ था, यह २ with शेयर्ड_बफ़र, ५ जी कैश के साथ १ with५ एमएस में सुधार हुआ, और उस पोस्ट के अनुसार सबसे अधिक सेटिंग्स के साथ १०० एमएस तक आगे चला गया।

यह पोस्टगिस के लिए अधिक प्रासंगिक है और उनकी सेटिंग्स समान प्रतीत होती हैं।

प्रत्येक कमेटी के बैच का आकार मेरे मामले के लिए ज्यादा मायने नहीं रखता था। जियोकोड डॉक्यूमेंट ने एक बैच आकार 3 का उपयोग किया। मैंने 1, 3, 5 से 10 तक मानों का प्रयोग किया। मुझे इसके साथ कोई महत्वपूर्ण अंतर नहीं मिला। छोटे बैच आकार के साथ आप अधिक कमिट और अपडेट करते हैं, लेकिन मुझे लगता है कि असली बोतल गर्दन यहां नहीं है। वास्तव में मैं अब बैच 1 आकार का उपयोग कर रहा हूं। क्योंकि हमेशा कुछ अनपेक्षित बीमार गठन होते हैं जो अपवाद का कारण बनेंगे, मैं पूरे बैच को त्रुटि के साथ सेट कर दूंगा और शेष पंक्तियों के लिए आगे बढ़ूंगा। बैच साइज 1 के साथ मुझे दूसरी बार में जिस अच्छे रिकॉर्ड्स को नजरअंदाज करना है, उसके अच्छे रिकॉर्ड को जियोकोड करने के लिए टेबल को दूसरी बार प्रोसेस करने की जरूरत नहीं है।

बेशक यह निर्भर करता है कि आपका बैच स्क्रिप्ट कैसे काम करता है। मैं बाद में अधिक विवरण के साथ अपनी स्क्रिप्ट पोस्ट करूंगा।

यदि यह आपके उपयोग के अनुकूल है, तो आप खराब पते को फ़िल्टर करने के लिए सामान्य पते का उपयोग करने का प्रयास कर सकते हैं। मैंने देखा कि किसी ने इसका कहीं उल्लेख किया है, लेकिन मुझे यकीन नहीं था कि यह कैसे काम करता है क्योंकि सामान्य कार्य केवल प्रारूप में काम करता है, यह वास्तव में आपको नहीं बता सकता है कि कौन सा पता अमान्य है।

बाद में मुझे एहसास हुआ कि अगर पता स्पष्ट रूप से खराब स्थिति में है और आप उन्हें छोड़ना चाहते हैं, तो इससे मदद मिल सकती है। उदाहरण के लिए मेरे पास बहुत सारे पते गायब हैं सड़क का नाम या यहां तक ​​कि सड़क के नाम भी। सभी पते को सामान्य करें सबसे पहले अपेक्षाकृत तेज़ होगा, फिर आप अपने लिए स्पष्ट बुरे पते को फ़िल्टर कर सकते हैं फिर उन्हें छोड़ सकते हैं। हालाँकि इसने मेरा उपयोग बिना किसी गली नंबर या गली के नाम के पते के बाद भी नहीं किया है, फिर भी इसे गली या शहर में मैप किया जा सकता है, और यह जानकारी अभी भी मेरे लिए उपयोगी है।

और अधिकांश पते जो मेरे मामले में जियोकोड नहीं कर सकते हैं वास्तव में सभी फ़ील्ड हैं, बस डेटाबेस में कोई मेल नहीं है। आप इन पतों को केवल सामान्य करके फ़िल्टर नहीं कर सकते।

EDIT अधिक जानकारी के लिए, मेरे ब्लॉग पोस्ट को जियोकोडिंग सर्वर सेटअप और मेरे द्वारा उपयोग की गई स्क्रिप्ट के बारे में देखें ।

EDIT 2 मैंने जियोकोडिंग 2 मिलियन पतों को पूरा किया है और जियोकोडिंग परिणाम के आधार पर पतों पर बहुत सफाई की है। बेहतर साफ किए गए इनपुट के साथ, अगले बैच की नौकरी बहुत तेजी से चल रही है। स्वच्छ से मेरा मतलब है कि कुछ पते स्पष्ट रूप से गलत हैं और उन्हें हटाया जाना चाहिए, या जियोकोडर पर अप्रत्याशित सामग्री होने से जियोकोडिंग पर समस्या उत्पन्न हो सकती है। मेरा सिद्धांत है: खराब पते को हटाने से कैश को गड़बड़ाने से बचा जा सकता है, जिससे अच्छे पते पर प्रदर्शन में काफी सुधार होता है।

मैंने यह सुनिश्चित करने के लिए राज्य पर आधारित इनपुट को अलग कर दिया कि हर काम में रैम में कैश किए गए जियोकोडिंग के लिए आवश्यक सभी डेटा हो सकते हैं। हालाँकि नौकरी में हर बुरा पता जियोकार्ड को अधिक राज्यों में खोज करने के लिए बनाता है, जो कैश को गड़बड़ कर सकता है।


शानदार प्रतिक्रिया। मेरे बॉक्स पर, जैसा कि होता है, राज्य के लिए फ़िल्टरिंग मैच को लगभग 50 (!) के कारक द्वारा गति प्रदान करता है, लेकिन मुझे संदेह है कि मुझे सूचकांक में समस्या हो सकती है।
एको

2
  1. इस चर्चा सूत्र के अनुसार , आपको टाइगर डेटा और आपके इनपुट पते को संसाधित करने के लिए समान सामान्यीकरण प्रक्रिया का उपयोग करना चाहिए। चूंकि टाइगर डेटा को बिल्ट-इन नॉर्मलाइज़र के साथ संसाधित किया गया है, इसलिए यह केवल बिल्ट-इन नॉर्मलाइज़र का उपयोग करना बेहतर है। भले ही आपको pagc_normalizer काम करते हुए मिला हो, अगर आप टाइगर डेटा को अपडेट करने के लिए इसका उपयोग नहीं करते हैं तो यह आपकी मदद नहीं कर सकता है।

    ऐसा कहा जा रहा है, मुझे लगता है कि जियोकोड () वैसे भी सामान्यीकरण कहेगा ताकि जियोकोडिंग से पहले पता सामान्य हो जाए। नॉर्मलाइज़र का एक संभावित उपयोग सामान्यीकृत पते और जियोकोड () द्वारा लौटाए गए पते की तुलना कर सकता है। उन दोनों के साथ सामान्यीकृत, गलत जियोकोडिंग परिणाम खोजना आसान हो सकता है।

    यदि आप सामान्य पते से जियोकोड से खराब पते को फ़िल्टर कर सकते हैं, तो यह वास्तव में मदद करेगा। हालाँकि, मुझे यह नहीं दिखता कि नॉर्मलाइज़र के पास मैच स्कोर या रेटिंग जैसा कुछ भी है।

  2. अधिक चर्चा geocode_addressदिखाने के लिए एक ही चर्चा सूत्र ने डिबग स्विच का भी उल्लेख किया । नोड geocode_addressको सामान्यीकृत पता इनपुट की आवश्यकता होती है।

  3. जियोकोडर सटीक मिलान के लिए तेज़ है लेकिन कठिन मामलों के लिए अधिक समय लेता है। मैंने पाया कि एक पैरामीटर है restrict_regionऔर सोचा है कि शायद यह फलहीन खोज को सीमित कर देगा यदि मैं राज्य के रूप में सीमा निर्धारित करता हूं क्योंकि मुझे पूरा यकीन है कि यह किस राज्य में होगा, इसे गलत राज्य में स्थापित करने से बाहर निकलने के लिए जियोकोड को रोकना नहीं था। सही पता, हालांकि इसमें कुछ समय लगता है।

    तो शायद जियोकोडर सभी संभावित स्थानों पर दिखेगा यदि पहली सटीक खोज में मेल नहीं है। यह कुछ त्रुटियों के साथ इनपुट को संसाधित करने में सक्षम बनाता है, लेकिन कुछ खोज को बहुत धीमा कर देता है।

    मुझे लगता है कि त्रुटियों के साथ इनपुट स्वीकार करने के लिए एक इंटरैक्टिव सेवा के लिए यह अच्छा है, लेकिन कभी-कभी हम बैच जियोकोडिंग में बेहतर प्रदर्शन करने के लिए गलत पते के एक छोटे से सेट पर देना चाह सकते हैं।


restrict_regionजब आपने सही स्थिति निर्धारित की तो समय पर क्या प्रभाव पड़ा ? इसके अलावा, आपके द्वारा ऊपर पोस्ट किए गए पोस्टगिस-उपयोगकर्ता थ्रेड से, वे विशेष रूप से उन पते के साथ परेशानी का उल्लेख करते हैं, 1020 Highway 20जिनके साथ मुझे सामना करना पड़ा।
ऐरीनो

सही स्थिति सेट करने से शायद सुधार नहीं होगा, क्योंकि अगर पता अच्छी तरह से स्वरूपित है तो जियोकोड को राज्य को वैसे भी सही मिल सकता है।
डेराकोडोक

1

मैं इस उत्तर को पोस्ट करने जा रहा हूं, लेकिन उम्मीद है कि एक और योगदानकर्ता निम्नलिखित को तोड़ने में मदद करेगा, जो मुझे लगता है कि एक अधिक सुसंगत तस्वीर पेंट करेगा:

जियोकोडिंग पर लोड किए गए राज्यों की संख्या का क्या प्रभाव है? मुझे सभी 50 मिल गए हैं और मैं @ LR1234567 (यानी, 8x प्रति समय geocode) की तुलना में बहुत कम प्रदर्शन देख रहा हूं ।

थोक जियोकोडिंग के लिए सबसे कुशल तरीका क्या है? मैं एक सीरियल प्रक्रिया चला रहा हूं, पूरे बैकलोड के समाप्त होने तक बार-बार 100 के बैच चला रहा हूं। एक बहु-थ्रेडेड दृष्टिकोण बेहतर होगा, लेकिन क्या दृष्टिकोण की सिफारिश की जाती है?

PostgreSQL जियोकोडिंग पर वर्चुअलाइजेशन का प्रभाव क्या है? मैं कुछ अन्य पदों के आधार पर १०% अनुमान लगा रहा हूं, लेकिन उस उत्तर पर बहुत कम विश्वास है

अब मेरा जवाब है, जो सिर्फ एक किस्सा है:

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

इसका सार यह है कि मैं सीपीयू बाउंड प्रतीत होता है और यह कि एक सिंगल क्वेरी एक सिंगल प्रोसेसर से बंधी है। मैं सिद्धांत में तालिका के UPDATEपूरक खंडों के साथ चल रहे कई कनेक्शन होने से इसे समानांतर कर सकता हूं addresses_to_geocode। इस बीच, मुझे geocodeराष्ट्रव्यापी डेटासेट पर औसतन 208 एमएस लेने के लिए मिल रहा है । यह वितरण दोनों के संदर्भ में तिरछा है, जहां मेरे अधिकांश पते हैं और वे कितने समय से ले रहे हैं (उदाहरण के लिए, ऊपर हिस्टोग्राम देखें) और नीचे दी गई तालिका।

मेरा अब तक का सबसे अच्छा तरीका यह है कि इसे 10000 के बैचों में किया जाए, प्रति बैच में कुछ करने से कुछ सुधार के साथ। 100 के बैच के लिए मुझे लगभग 251ms मिल रहे थे, 10000 के साथ मुझे 208ms मिल रहे हैं।

UPDATE addresses_to_geocode 
SET (rating, longitude, latitude, geo) = 
   (COALESCE((g.geom).rating,-1), 
            ST_X((g.geom).geomout)::numeric(8,5),   
            ST_Y((g.geom).geomout)::numeric(8,5), 
            geo) 
   FROM (
       SELECT "PatientId" as PatientId 
       FROM addresses_to_geocode  
       WHERE "rating" IS NULL 
       ORDER BY PatientId LIMIT 100) As a 
   LEFT JOIN (
       SELECT "PatientId" as PatientId, (geocode("Address",1)) As geom 
       FROM addresses_to_geocode As ag 
       WHERE ag.rating IS NULL 
       ORDER BY PatientId LIMIT 100) As g 
   ON a.PatientId = g.PatientId 
   WHERE a.PatientId = addresses_to_geocode."PatientId";

मुझे फ़ील्ड नामों को उद्धृत करना है क्योंकि RPostgreSQL कैसे तालिकाओं के साथ बनाता है dbWriteTable

यह लगभग 4 गुना तेज है जैसे कि मैं उन्हें एक बार में एक रिकॉर्ड करता हूं। जब मैं उन्हें एक समय में एक करता हूं तो मुझे राज्य द्वारा ब्रेकडाउन मिल सकता है (नीचे देखें)। मैंने यह जांचने और देखने के लिए किया कि क्या TIGER राज्यों में से एक या एक से अधिक लोड या इंडेक्स खराब था, जिसके परिणामस्वरूप मुझे खराब geocodeप्रदर्शन का अनुमान था । मुझे स्पष्ट रूप से कुछ खराब डेटा मिले हैं (कुछ पते ईमेल पते भी हैं!), लेकिन उनमें से ज्यादातर अच्छी तरह से स्वरूपित हैं। जैसा कि मैंने पहले कहा, सबसे लंबे समय तक चलने वाले कुछ प्रश्नों में उनके प्रारूप में स्पष्ट कमियां नहीं हैं। नीचे संख्या की एक तालिका है, न्यूनतम क्वेरी समय, माध्य क्वेरी समय, और मेरे क्वेरी से 3000-कुछ यादृच्छिक पते वाले राज्यों के लिए अधिकतम क्वेरी समय:

       state   n  min      mean   max
1          .   1 0.00 0.0000000  0.00
12        DC   6 0.07 0.0900000  0.10
9  CHIHUAHUA   1 0.16 0.1600000  0.16
2         00   1 0.18 0.1800000  0.18
6         AR   1 0.37 0.3700000  0.37
27        MT  17 0.14 0.4229412  1.01
14        GA  37 0.22 0.4340541  2.78
10        CO   1 0.54 0.5400000  0.54
16        IL 390 0.16 0.5448974  3.75
8         CA 251 0.17 0.5546614  3.58
5         AL   4 0.13 0.5575000  0.86
18        KS   3 0.43 0.5966667  0.75
23        ME 121 0.14 0.6266116  7.88
35        SC 390 0.14 0.6516923  6.88
24        MI  62 0.12 0.6524194  3.36
40        WA   3 0.23 0.7500000  1.41
32        OK 145 0.17 0.7538621  5.84
20        LA   1 0.76 0.7600000  0.76
31        OH 551 0.00 0.7623775 10.27
17        IN 108 0.19 0.7864815  3.64
43      <NA>  89 0.00 0.8152809  4.98
15        IA   1 0.82 0.8200000  0.82
30        NY 227 0.19 0.8227753 28.47
19        KY   3 0.56 0.8333333  1.36
36        TN 333 0.11 0.8566667  6.45
28        NC 129 0.24 0.8843411  4.07
13        FL  70 0.28 0.9131429  4.65
7         AZ 101 0.20 0.9498020  6.33
34        PA  56 0.14 0.9594643  3.61
29        NJ   1 1.03 1.0300000  1.03
33        OR 101 0.24 1.0966337 14.89
26        MS  28 0.25 1.1503571 11.89
3          9   6 0.58 1.2133333  1.93
4         AK   1 1.25 1.2500000  1.25
22        MD   9 0.50 1.3055556  4.17
25        MO  22 0.31 1.3381818  4.20
42        WY   1 1.38 1.3800000  1.38
38        VA 127 0.20 1.3873228  5.69
37        TX   4 0.53 1.4800000  3.28
21        MA   4 0.47 1.5725000  3.63
11        CT   5 0.38 1.6760000  4.68
39        VT   1 2.25 2.2500000  2.25
41        WI   2 2.27 2.2850000  2.30
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.