ฉันควรคาดหวังว่า PostGIS จะจัดรูปแบบที่อยู่ในรูปแบบที่ดีได้อย่างรวดเร็วเพียงใด


17

ฉันควรคาดหวังว่า PostGIS จะจัดรูปแบบที่อยู่ในรูปแบบที่ดีได้อย่างรวดเร็วเพียงใด

ฉันได้ติดตั้ง PostgreSQL 9.3.7 และ PostGIS 2.1.7 แล้วให้โหลดข้อมูลระดับประเทศและข้อมูลสถานะทั้งหมด แต่พบว่าการเข้ารหัสภูมิศาสตร์จะช้ากว่าที่ฉันคาดไว้มาก ฉันตั้งความคาดหวังไว้สูงเกินไปหรือไม่? ฉันได้รับรหัสเฉลี่ย 3 geocodes ต่อวินาที ฉันต้องทำประมาณ 5 ล้านและฉันไม่ต้องการรอสามสัปดาห์

นี่เป็นเครื่องเสมือนจริงสำหรับการประมวลผลเมทริกซ์ R ยักษ์และฉันติดตั้งฐานข้อมูลนี้ไว้ที่ด้านข้างเพื่อให้การกำหนดค่าอาจดูโง่เล็กน้อย หากการเปลี่ยนแปลงที่สำคัญในการกำหนดค่าของ VM จะช่วยได้ฉันสามารถเปลี่ยนการกำหนดค่าได้

รายละเอียดฮาร์ดแวร์

หน่วยความจำ: โปรเซสเซอร์ 65GB: 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

ระบบปฏิบัติการคือ centos uname -rvให้สิ่งนี้:

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

การกำหนดค่า Postgresql

> 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"

ขึ้นอยู่กับข้อเสนอแนะก่อนหน้านี้กับประเภทการค้นหาเหล่านี้ผม upped shared_buffersในpostgresql.confไฟล์ไปประมาณ 1/4 ของ RAM ที่มีขนาดและมีประสิทธิภาพในการแคช 1/2 ของ RAM:

shared_buffers = 16096MB     
effective_cache_size = 31765MB

ฉันมีinstalled_missing_indexes()และ (หลังจากแก้ไขส่วนแทรกซ้ำในบางตาราง) ไม่มีข้อผิดพลาด

ตัวอย่าง Geocoding SQL # 1 (แบทช์) ~ เวลาเฉลี่ยคือ 2.8 / วินาที

ฉันกำลังติดตามตัวอย่างจากhttp://postgis.net/docs/Geocode.htmlซึ่งให้ฉันสร้างตารางที่มีที่อยู่ไปยัง geocode แล้วสร้าง SQL 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";

ฉันใช้ขนาดแบทช์ที่ 1,000 ขึ้นไปและมันกลับมาใน 337.70 วินาที มันช้ากว่าเล็กน้อยสำหรับแบตช์ขนาดเล็ก

ตัวอย่าง Geocoding 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 ต่อเรคคอร์ด) แต่ฉันสามารถดูการกระจายเวลาของเคียวรีและดูว่ามันเป็นแบบสอบถามที่มีความยาวน้อยซึ่งทำให้การค้นหาช้าลงมากที่สุด (เฉพาะ 2,600 ครั้งแรกของ 5 ล้านเท่านั้นที่มีการค้นหาครั้ง) นั่นคือ 10% แรกที่ใช้ค่าเฉลี่ยประมาณ 100 มิลลิวินาทีด้านล่างเฉลี่ย 10% 3.69 วินาทีในขณะที่ค่าเฉลี่ยคือ 754 มิลลิวินาทีและค่ามัธยฐานคือ 340 มิลลิวินาที

# 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]

เวลา Geocoding สำหรับ 2,600 แถวแรก

ความคิดอื่น ๆ

หากฉันไม่สามารถเพิ่มขนาดได้ประสิทธิภาพฉันคิดว่าอย่างน้อยฉันก็สามารถเดาการศึกษาเกี่ยวกับการทำนายเวลา geocode ที่ช้าได้ แต่มันไม่ชัดเจนสำหรับฉันว่าทำไมที่อยู่ที่ช้ากว่านั้นดูเหมือนจะใช้เวลานานกว่านั้นมาก ฉันกำลังเรียกใช้ที่อยู่เดิมผ่านขั้นตอนการทำให้เป็นมาตรฐานที่กำหนดเองเพื่อให้แน่ใจว่ามีการจัดรูปแบบไว้ก่อนgeocode()หน้าที่จะได้รับ

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

ที่myAddressเป็น[Address], [City], [ST] [Zip]สตริงรวบรวมจากตารางอยู่ของผู้ใช้จากฐานข้อมูลที่ไม่ใช่ PostgreSQL

ฉันพยายาม (ล้มเหลว) ในการติดตั้งpagc_normalize_addressส่วนขยาย แต่ไม่ชัดเจนว่าจะนำมาซึ่งการปรับปรุงที่ฉันกำลังมองหา แก้ไขเพื่อเพิ่มข้อมูลการตรวจสอบตามคำแนะนำ

ประสิทธิภาพ

CPU หนึ่งถูกตรึง: [แก้ไขเพียงหนึ่งโปรเซสเซอร์ต่อการค้นหาดังนั้นฉันมี 5 CPU ที่ไม่ได้ใช้]

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

ตัวอย่างของกิจกรรมดิสก์บนพาร์ติชันข้อมูลในขณะที่หนึ่ง proc ถูกตรึงที่ 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

วิเคราะห์ว่า SQL

นี่คือจาก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
เครื่องจะทำอย่างไรเมื่อคุณเรียกใช้แบบสอบถาม? มันบล็อกบน IO หรือเป็นคอขวดที่อื่น?
til_b

1
คุณโหลดไปแล้วกี่รัฐ ฉันมักจะได้รับที่ใดก็ได้จาก 30ms - 150 ms ต่อที่อยู่ในกล่อง windows 64 บิตกับ ram 4-8GB โดยปกติแล้วฉันจะทำงานกับ 1 หรือ 2 รัฐเท่านั้น ยังไม่ได้ทำเกณฑ์มาตรฐานเกี่ยวกับผลกระทบของประสิทธิภาพที่เพิ่มขึ้น
LR1234567

@ LR1234567 50 รัฐ
aaryno

1
@til_b CPU ตรึงที่ 99.7%
aaryno

ดูเหมือนว่าเรากำลังจะรอสองถึงสามสัปดาห์เพื่อทำให้สิ่งนี้จบลงเพราะมันเป็นเพียงครั้งเดียวและเราจะมีน้ำผลไม้เหลือเฟืออีกครั้งเมื่อมันเสร็จเพื่อติดตาม 100 ที่อยู่ / วันรันไทม์โหลด เรากำลังประสบ ฉันจะเปิดให้บริการนี้จนกว่าเราจะเสร็จในกรณีที่มีบางสิ่งที่น่าสนใจเกิดขึ้นจริงที่ช่วยให้เราได้รอบ CPU ของเราตรึง
aaryno

คำตอบ:


7

ฉันใช้เวลามากมายในการทดลองกับสิ่งนี้ฉันคิดว่าการโพสต์แยกกันจะดีกว่าเพราะมาจากมุมที่ต่างกัน

นี่เป็นหัวข้อที่ซับซ้อนจริงๆดูรายละเอียดเพิ่มเติมในบล็อกโพสต์ของฉันเกี่ยวกับการตั้งค่าเซิร์ฟเวอร์ geocodingและสคริปต์ที่ฉันใช้นี่เป็นเพียงข้อมูลสรุปโดยย่อ:

เซิร์ฟเวอร์ที่มีข้อมูล 2 สถานะเท่านั้นจะเร็วกว่าเซิร์ฟเวอร์ที่โหลดด้วยข้อมูลทั้งหมด 50 สถานะเสมอ

ฉันตรวจสอบสิ่งนี้กับพีซีที่บ้านของฉันในเวลาที่ต่างกันและเซิร์ฟเวอร์ Amazon AWS สองเครื่อง

เซิร์ฟเวอร์ระดับฟรี AWS ของฉันที่มีข้อมูล 2 สถานะมี RAM 1G เท่านั้น แต่มีประสิทธิภาพ 43 ~ 59 ms ที่สอดคล้องกันสำหรับข้อมูลที่มี 1,000 รายการและ 45,000 รายการ

ฉันใช้ขั้นตอนการตั้งค่าเดียวกันสำหรับเซิร์ฟเวอร์ 8G RAM AWS ที่โหลดทุกสถานะสคริปต์และข้อมูลเดียวกันและประสิทธิภาพลดลงเหลือ 80 ~ 105 ms

ทฤษฎีของฉันคือเมื่อ geocoder ไม่สามารถจับคู่ที่อยู่ได้อย่างแน่นอนมันเริ่มที่จะขยายช่วงการค้นหาและไม่สนใจบางส่วนเช่นรหัสไปรษณีย์หรือเมือง นั่นคือสาเหตุที่เอกสาร geocode โม้ว่ามันสามารถเปลี่ยนที่อยู่ใหม่ด้วยรหัสไปรษณีย์ผิดแม้ว่าจะใช้เวลา 3000 มิลลิวินาที

เมื่อมีการโหลดข้อมูลเพียง 2 สถานะเซิร์ฟเวอร์จะใช้เวลาน้อยลงในการค้นหาที่ไร้ผลหรือการจับคู่ที่มีคะแนนต่ำมากเพราะสามารถค้นหาได้ใน 2 สถานะเท่านั้น

ฉันพยายาม จำกัด สิ่งนี้โดยการตั้งค่าrestrict_regionพารามิเตอร์เป็น state multipolygons ในฟังก์ชัน geocode หวังว่าจะหลีกเลี่ยงการค้นหาที่ไร้ผลเนื่องจากฉันค่อนข้างมั่นใจว่าที่อยู่ส่วนใหญ่มีสถานะที่ถูกต้อง เปรียบเทียบสองเวอร์ชันนี้:

  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ไม่ได้ตามที่ฉันต้องการบางทีมันอาจใช้เพื่อกรองผลการค้นหาที่มีหลายรายการเท่านั้นไม่ จำกัด ช่วงการค้นหา

คุณสามารถปรับแต่ง postgre ของคุณเล็กน้อย

ข้อสงสัยทั่วไปของการติดตั้งดัชนีที่ขาดหายไปการวิเคราะห์สูญญากาศไม่ได้สร้างความแตกต่างอะไรกับฉันเพราะสคริปต์ดาวน์โหลดได้ทำการบำรุงรักษาที่จำเป็นเรียบร้อยแล้วเว้นแต่คุณจะทำกับพวกเขา

อย่างไรก็ตามการตั้งค่าโพสต์ conf ตามโพสต์นี้ได้ช่วย เซิร์ฟเวอร์ขนาดเต็มของฉันที่มี 50 รัฐมี 320 มิลลิวินาทีที่มีการกำหนดค่าเริ่มต้นสำหรับข้อมูลที่มีรูปร่างแย่กว่านั้นเพิ่มขึ้นเป็น 185 ms ด้วย 2G shared_buffer, แคช 5G และไปอีก 100 ms ด้วยการตั้งค่าส่วนใหญ่ตามการโพสต์นั้น

สิ่งนี้เกี่ยวข้องกับ postgis มากขึ้นและการตั้งค่าของพวกเขาดูเหมือนจะคล้ายกัน

ขนาดแบทช์ของการคอมมิทแต่ละครั้งไม่สำคัญสำหรับเคสของฉัน เอกสาร geocode ใช้ขนาดแบทช์ 3 ฉันทดลองค่าจาก 1, 3, 5 จนถึง 10 ฉันไม่พบความแตกต่างที่สำคัญกับสิ่งนี้ ด้วยขนาดแบทช์ที่เล็กลงคุณเพิ่มความมุ่งมั่นและอัพเดท แต่ฉันคิดว่าคอขวดที่แท้จริงไม่ใช่ที่นี่ ที่จริงฉันใช้ขนาดแบทช์ 1 ทันที เนื่องจากที่อยู่ที่มีรูปแบบไม่ถูกต้องอยู่เสมอจะทำให้เกิดข้อยกเว้นฉันจะตั้งค่าแบทช์ทั้งหมดพร้อมข้อผิดพลาดเนื่องจากถูกละเว้นและดำเนินการกับแถวที่เหลือ ด้วยขนาดแบตช์ 1 ฉันไม่จำเป็นต้องประมวลผลตารางในครั้งที่สองเพื่อเข้ารหัสตำแหน่งที่เป็นไปได้ที่ดีในชุดที่ทำเครื่องหมายว่าถูกละเว้น

หลักสูตรนี้ขึ้นอยู่กับการทำงานของสคริปต์แบทช์ของคุณ ฉันจะโพสต์สคริปต์ด้วยรายละเอียดเพิ่มเติมในภายหลัง

คุณสามารถลองใช้ที่อยู่ปกติเพื่อกรองที่อยู่ที่ไม่ดีถ้ามันเหมาะกับการใช้งานของคุณ ฉันเห็นบางคนพูดถึงที่นี่ แต่ฉันไม่แน่ใจว่าวิธีนี้ทำงานได้อย่างไรเนื่องจากฟังก์ชั่นการทำให้ปกติใช้งานได้ในรูปแบบเท่านั้นมันไม่สามารถบอกได้ว่าที่อยู่ใดไม่ถูกต้อง

หลังจากนั้นฉันก็รู้ว่าหากที่อยู่ไม่ดีอย่างเห็นได้ชัดและคุณต้องการข้ามไปสิ่งนี้จะช่วยได้ ตัวอย่างเช่นฉันมีที่อยู่จำนวนมากไม่มีชื่อถนนหรือชื่อถนน ปรับมาตรฐานที่อยู่ทั้งหมดก่อนจะค่อนข้างเร็วจากนั้นคุณสามารถกรองที่อยู่ไม่ดีที่เห็นได้ชัดสำหรับคุณจากนั้นข้ามที่อยู่เหล่านั้น อย่างไรก็ตามสิ่งนี้ไม่ได้เหมาะกับการใช้งานของฉันเนื่องจากที่อยู่ที่ไม่มีหมายเลขถนนหรือแม้แต่ชื่อถนนอาจยังคงถูกแมปกับถนนหรือเมืองและข้อมูลนั้นยังมีประโยชน์สำหรับฉัน

และที่อยู่ส่วนใหญ่ที่ไม่สามารถระบุพิกัดทางภูมิศาสตร์ในกรณีของฉันมีเขตข้อมูลทั้งหมดจริง ๆ แล้วไม่มีฐานข้อมูลตรงกัน คุณไม่สามารถกรองที่อยู่เหล่านี้ได้เพียงแค่ทำให้เป็นปกติ

แก้ไขสำหรับรายละเอียดเพิ่มเติมดูโพสต์บล็อกของฉันเกี่ยวกับการติดตั้งเซิร์ฟเวอร์ระบุพิกัดทางภูมิศาสตร์และสคริปต์ที่ผมใช้

แก้ไข 2ฉันใช้ geocoding เรียบร้อยแล้ว 2 ล้านที่อยู่และทำการล้างข้อมูลที่อยู่จำนวนมากตามผลการเข้ารหัสทางภูมิศาสตร์ ด้วยอินพุตที่สะอาดดีขึ้นงานแบตช์ต่อไปจะทำงานได้เร็วขึ้นมากขึ้น การล้างข้อมูลฉันหมายถึงที่อยู่บางรายการผิดอย่างชัดเจนและควรลบออกหรือมีเนื้อหาที่ไม่คาดคิดสำหรับ geocoder เพื่อทำให้เกิดปัญหากับการเข้ารหัสภูมิศาสตร์ ทฤษฎีของฉันคือ การลบที่อยู่ที่ไม่ดีสามารถหลีกเลี่ยงการทำให้แคชยุ่งเหยิงซึ่งปรับปรุงประสิทธิภาพของที่อยู่ที่ดีอย่างมีนัยสำคัญ

ฉันแยกอินพุตตามสถานะเพื่อให้แน่ใจว่าทุกงานสามารถมีข้อมูลทั้งหมดที่จำเป็นสำหรับการเข้ารหัสทางภูมิศาสตร์แคชใน RAM อย่างไรก็ตามที่อยู่ที่ไม่ดีในงานทำให้ geocoder ค้นหาในสถานะอื่น ๆ ซึ่งอาจทำให้แคชสกปรก


การตอบสนองที่ยอดเยี่ยม ในกล่องของฉันในขณะที่มันเกิดขึ้นการกรองเพื่อเพิ่มความเร็วในการแข่งขันให้ได้ประมาณ 50 (!) แต่ฉันสงสัยว่าฉันอาจมีปัญหาเกี่ยวกับดัชนี
ako

2
  1. ตามหัวข้อการสนทนานี้คุณควรใช้ขั้นตอนการทำให้เป็นมาตรฐานเดียวกันเพื่อประมวลผลข้อมูล Tiger และที่อยู่อินพุตของคุณ เนื่องจากข้อมูล Tiger ได้รับการประมวลผลด้วย Normalizer ในตัวจึงดีกว่าใช้ Normalizer ในตัวเท่านั้น แม้ว่าคุณจะทำให้ pagc_normalizer ทำงานได้ แต่ก็อาจไม่ช่วยถ้าคุณไม่ใช้มันเพื่ออัปเดตข้อมูลไทเกอร์

    ที่ถูกกล่าวว่าฉันคิดว่า geocode () จะเรียก normalizer ต่อไปดังนั้นเพื่อทำให้ปกติอยู่ก่อน geocoding อาจไม่ได้มีประโยชน์จริงๆ การใช้งาน Normalizer หนึ่งที่เป็นไปได้สามารถเปรียบเทียบที่อยู่ปกติกับที่อยู่ที่ส่งคืนโดย geocode () ด้วยการทำให้เป็นมาตรฐานทั้งสองอย่างมันจะง่ายกว่าที่จะหาผลลัพธ์ geocoding ที่ผิด

    หากคุณสามารถกรองที่อยู่ที่ไม่ดีออกจาก geocode โดย normalizer นั่นจะช่วยได้จริงๆ อย่างไรก็ตามฉันไม่เห็นเครื่องมือทำให้ปกติมีอะไรเช่นคะแนนการแข่งขันหรือการให้คะแนน

  2. เธรดการสนทนาเดียวกันยังกล่าวถึงสวิตช์ดีบักgeocode_addressเพื่อแสดงข้อมูลเพิ่มเติม โหนดgeocode_addressต้องการอินพุตแอดเดรสปกติ

  3. Geocoder นั้นเร็วสำหรับการจับคู่ที่แน่นอน แต่ใช้เวลามากขึ้นสำหรับกรณีที่ยากลำบาก ฉันพบว่ามีพารามิเตอร์restrict_regionและคิดว่ามันอาจจะ จำกัด การค้นหาที่ไร้ผลถ้าฉันตั้งค่าขีด จำกัด เป็นสถานะเนื่องจากฉันค่อนข้างแน่ใจว่าสถานะนั้นจะอยู่ในสถานะใดเปิดใช้งานการตั้งค่าเป็นสถานะผิดไม่หยุด geocode เพื่อรับ ที่อยู่ที่ถูกต้องแม้ว่าจะใช้เวลาสักครู่

    ดังนั้น geocoder อาจจะดูในสถานที่ที่เป็นไปได้ทั้งหมดหากการค้นหาที่ตรงกันครั้งแรกไม่ตรงกัน สิ่งนี้ทำให้สามารถประมวลผลอินพุตด้วยข้อผิดพลาดบางอย่าง แต่ยังทำให้การค้นหาบางอย่างช้ามาก

    ฉันคิดว่าเป็นการดีที่บริการแบบโต้ตอบเพื่อรับอินพุตที่มีข้อผิดพลาด แต่บางครั้งเราอาจต้องการให้ที่อยู่ผิดชุดเล็ก ๆ เพื่อให้มีประสิทธิภาพที่ดีขึ้นในการระบุตำแหน่งทางภูมิศาสตร์


ผลกระทบของการrestrict_regionกำหนดเวลาเมื่อคุณตั้งค่าสถานะที่ถูกต้องคืออะไร? นอกจากนี้จากเธรดผู้ใช้ postgis ที่คุณเชื่อมโยงกับด้านบนพวกเขากล่าวถึงเฉพาะปัญหาเกี่ยวกับที่อยู่1020 Highway 20ที่ฉันพบเช่นกัน
aaryno

การตั้งค่าสถานะที่ถูกต้องอาจจะไม่ดีขึ้นเพราะหากที่อยู่มีรูปแบบที่ดี geocoder สามารถรับสถานะได้อยู่ดี
dracodoc

1

ฉันจะโพสต์คำตอบนี้ แต่หวังว่าผู้มีส่วนร่วมคนอื่นจะช่วยทำลายสิ่งต่อไปนี้ซึ่งฉันคิดว่าจะวาดภาพที่เชื่อมโยงกันมากขึ้น:

อะไรคือผลกระทบของจำนวนของรัฐในการโหลดพิกัดทางภูมิศาสตร์? ฉันมีครบทั้ง 50 แล้วและฉันเห็นประสิทธิภาพที่ต่ำกว่า @ LR1234567 (เช่น 8 เท่าต่อครั้งgeocode)

วิธีที่มีประสิทธิภาพที่สุดสำหรับการเข้ารหัสภูมิศาสตร์จำนวนมากคืออะไร ฉันกำลังเรียกใช้กระบวนการแบบอนุกรมเรียกใช้ชุด 100 ซ้ำ ๆ จนกระทั่งโหลดทั้งหมดเสร็จสิ้น วิธีการแบบมัลติเธรดจะดีกว่า แต่แนะนำวิธีใดบ้าง

ผลกระทบของการจำลองเสมือนบน Geocoding ของ PostgreSQL คืออะไร ฉันคาดเดา 10% จากข้อความอื่น ๆ แต่มีความมั่นใจเล็กน้อยในคำตอบนั้น

ตอนนี้คำตอบของฉันซึ่งเป็นเพียงเรื่องเล็ก ๆ น้อย ๆ :

ที่ดีที่สุดของฉันได้รับ (ขึ้นอยู่กับการเชื่อมต่อเดียว) เป็นค่าเฉลี่ยของ 208 geocodeมิลลิวินาทีต่อ สิ่งนี้วัดจากการเลือกที่อยู่แบบสุ่มจากชุดข้อมูลของฉันซึ่งขยายไปทั่วสหรัฐอเมริกา มันมีข้อมูลที่สกปรกอยู่บ้าง แต่ตัวที่รันนานที่สุดก็geocodeไม่ได้แย่ไปในทางที่ชัดเจน

ส่วนสำคัญของมันคือฉันดูเหมือนจะถูกผูกไว้กับ CPU และแบบสอบถามเดียวถูกผูกไว้กับโปรเซสเซอร์เดียว ฉันสามารถทำให้มันขนานกันได้โดยมีการเชื่อมต่อหลายอย่างทำงานโดยUPDATEเกิดขึ้นในส่วนเสริมของaddresses_to_geocodeตารางในทางทฤษฎี ในขณะเดียวกันฉันgeocodeจะใช้เวลาเฉลี่ย 208 ms ในชุดข้อมูลทั่วประเทศ การแจกแจงเบ้ทั้งในแง่ของที่อยู่ของฉันส่วนใหญ่และในแง่ของระยะเวลาที่พวกเขาใช้ (เช่นดูฮิสโทแกรมด้านบน) และตารางด้านล่าง

แนวทางที่ดีที่สุดของฉันคือการทำมันเป็นแบตช์ 10,000 ด้วยการปรับปรุงที่คาดการณ์ได้จากการทำมากขึ้นต่อชุด สำหรับชุดของ 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

นั่นคือประมาณ 4x เร็วเท่ากับว่าฉันทำพวกเขาหนึ่งระเบียนในเวลา เมื่อฉันทำทีละครั้งฉันจะได้รับการแบ่งตามรัฐ (ดูด้านล่าง) ฉันทำสิ่งนี้เพื่อตรวจสอบและดูว่าสถานะ TIGER หนึ่งหรือมากกว่านั้นมีโหลดหรือดัชนีที่ไม่ดีซึ่งฉันคาดว่าจะส่งผลให้เกิดgeocodeประสิทธิภาพที่ต่ำ เห็นได้ชัดว่าฉันมีข้อมูลที่ไม่ดี (ที่อยู่บางแห่งอาจเป็นที่อยู่อีเมล!) แต่ที่อยู่ส่วนใหญ่มีรูปแบบที่ดี ดังที่ฉันได้กล่าวไปแล้วข้อความค้นหาที่ทำงานมานานที่สุดบางรายการไม่มีข้อบกพร่องที่ชัดเจนในรูปแบบ ด้านล่างนี้คือตารางของจำนวนเวลาของการสืบค้นขั้นต่ำเวลาเฉลี่ยของการสืบค้นและเวลาการสืบค้นสูงสุดสำหรับสถานะจากที่อยู่สุ่ม 3,000 ชุดจากชุดข้อมูลของฉัน:

       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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.