Tôi nên mong đợi PostGIS nhanh như thế nào để mã hóa địa chỉ được định dạng tốt?


17

Tôi nên mong đợi PostGIS nhanh như thế nào để mã hóa địa chỉ được định dạng tốt?

Tôi đã cài đặt PostgreSQL 9.3.7 và PostGIS 2.1.7, tải dữ liệu quốc gia và tất cả dữ liệu trạng thái nhưng nhận thấy mã hóa địa lý chậm hơn nhiều so với tôi dự đoán. Tôi đã đặt kỳ vọng của mình quá cao? Tôi nhận được trung bình 3 mã địa lý cá nhân mỗi giây. Tôi cần làm khoảng 5 triệu và tôi không muốn đợi ba tuần cho việc này.

Đây là một máy ảo để xử lý ma trận R khổng lồ và tôi đã cài đặt cơ sở dữ liệu này ở bên cạnh để cấu hình có thể nới lỏng một chút. Nếu một sự thay đổi lớn trong cấu hình của VM sẽ giúp ích, tôi có thể thay đổi cấu hình.

Thông số phần cứng

Bộ nhớ: Bộ xử lý 65GB: 6 lscpumang lại cho tôi điều này:

# 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

Hệ điều hành là centos, uname -rvcung cấp cho điều này:

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

Cấu hình 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"

Dựa trên đề xuất trước đây đối với các loại truy vấn, tôi upped shared_bufferstrong postgresql.conftập tin xuống còn khoảng 1/4 RAM có sẵn và kích thước bộ nhớ cache hiệu quả để 1/2 RAM:

shared_buffers = 16096MB     
effective_cache_size = 31765MB

Tôi có installed_missing_indexes()và (sau khi giải quyết các phần chèn trùng lặp vào một số bảng) không có bất kỳ lỗi nào.

Ví dụ SQL mã hóa địa lý # 1 (đợt) ~ thời gian trung bình là 2,8 / giây

Tôi đang theo dõi ví dụ từ http://postgis.net/docs/Geocode.html , nơi tôi tạo một bảng chứa địa chỉ cho mã địa lý, sau đó thực hiện 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";

Tôi đang sử dụng kích thước lô 1000 ở trên và nó sẽ trả về sau 337,70 giây. Nó chậm hơn một chút đối với các lô nhỏ hơn.

Ví dụ SQL mã hóa địa lý # 2 (hàng theo hàng) ~ thời gian trung bình là 1,2 / giây

Khi tôi khai thác địa chỉ của mình bằng cách thực hiện mã địa lý một lần với một câu lệnh trông như thế này (btw, ví dụ dưới đây mất 4,14 giây),

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;

chậm hơn một chút (2,5 lần trên mỗi bản ghi) nhưng tôi có thể xem xét phân phối thời gian truy vấn và thấy rằng đó là một số ít các truy vấn dài làm chậm điều này nhất (chỉ 2600 trong 5 triệu đầu tiên có thời gian tra cứu). Nghĩa là, 10% hàng đầu đang lấy trung bình khoảng 100 ms, 10% dưới cùng trung bình 3,69 giây, trong khi trung bình là 754 ms và trung bình là 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]

Thời gian mã hóa cho 2600 hàng đầu tiên

Những suy nghĩ khác

Nếu tôi không thể đạt được thứ tự tăng hiệu suất, tôi nghĩ rằng ít nhất tôi có thể đưa ra một phỏng đoán có giáo dục về việc dự đoán thời gian mã hóa chậm nhưng đối với tôi, tại sao các địa chỉ chậm lại dường như mất nhiều thời gian hơn. Tôi đang chạy địa chỉ gốc thông qua bước chuẩn hóa tùy chỉnh để đảm bảo địa chỉ được định dạng độc đáo trước khi geocode()chức năng nhận được:

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

trong đó myAddressmột [Address], [City], [ST] [Zip]chuỗi được biên dịch từ bảng địa chỉ người dùng từ cơ sở dữ liệu không phải postgresql.

Tôi đã thử (thất bại) để cài đặt pagc_normalize_addresstiện ích mở rộng nhưng không rõ ràng rằng điều này sẽ mang lại loại cải tiến mà tôi đang tìm kiếm. Đã chỉnh sửa để thêm thông tin giám sát theo đề xuất

Hiệu suất

Một CPU được chốt: [chỉnh sửa, chỉ một bộ xử lý cho mỗi truy vấn, vì vậy tôi có 5 CPU không sử dụng]

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

Mẫu hoạt động của đĩa trên phân vùng dữ liệu trong khi một Proc được chốt ở mức 100%: [chỉnh sửa: chỉ có một bộ xử lý được sử dụng bởi truy vấn này]

# 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

Phân tích SQL đó

Đây là từ EXPLAIN ANALYZEtrên truy vấn đó:

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

Xem phân tích tốt hơn tại http://explain.depesz.com/s/vogS


1
Máy làm gì khi bạn chạy các truy vấn? Nó chặn trên IO hoặc là nút cổ chai ở một nơi khác?
til_b

1
Có bao nhiêu tiểu bang bạn đã tải. Tôi thường nhận được bất cứ nơi nào từ 30ms - 150 ms mỗi địa chỉ trên hộp windows 64 bit với ram 4-8GB. Thông thường mặc dù tôi chỉ làm việc với 1 hoặc 2 tiểu bang. Không thực hiện điểm chuẩn về tác động của nhiều quốc gia đến hiệu suất.
LR1234567

@ LR1234567 50 tiểu bang
aaryno

1
CPU @til_b được chốt ở mức 99,7%
aaryno

Có vẻ như chúng ta sẽ đợi vài tuần để hoàn thành việc này vì đây là việc một lần và chúng ta sẽ còn rất nhiều nước trái cây sau khi hoàn thành việc tải thời gian chạy 100 địa chỉ / ngày chúng tôi đang trải nghiệm. Tôi sẽ tiếp tục mở cho đến khi chúng tôi hoàn thành trong trường hợp có thứ gì đó thực sự hấp dẫn xuất hiện cho phép chúng tôi đi xung quanh các CPU được chốt.
aaryno

Câu trả lời:


7

Tôi đã dành rất nhiều thời gian để thử nghiệm điều này, tôi nghĩ tốt hơn là nên đăng bài riêng vì chúng ở các góc độ khác nhau.

Đây thực sự là một chủ đề phức tạp, xem thêm chi tiết trong bài đăng trên blog của tôi về thiết lập máy chủ mã hóa địa lýtập lệnh tôi đã sử dụng ., Đây chỉ là một số tóm tắt ngắn gọn:

Một máy chủ chỉ có dữ liệu 2 Bang luôn nhanh hơn máy chủ được tải với tất cả 50 dữ liệu trạng thái.

Tôi đã xác minh điều này với máy tính ở nhà của tôi trong các thời điểm khác nhau và hai máy chủ Amazon AWS khác nhau.

Máy chủ cấp miễn phí AWS của tôi với dữ liệu 2 trạng thái chỉ có RAM 1G, nhưng nó có hiệu suất 43 ~ 59 ms phù hợp cho dữ liệu với 1000 bản ghi và 45.000 bản ghi.

Tôi đã sử dụng chính xác quy trình thiết lập tương tự cho máy chủ AWS RAM 8G với tất cả các trạng thái được tải, chính xác cùng một tập lệnh và dữ liệu và hiệu suất giảm xuống 80 ~ 105 ms.

Lý thuyết của tôi là khi trình mã hóa địa lý không thể khớp chính xác địa chỉ, nó bắt đầu mở rộng phạm vi tìm kiếm và bỏ qua một số phần, như mã zip hoặc thành phố. Đó là lý do tại sao tài liệu mã địa lý tự hào rằng nó có thể tái tổ hợp địa chỉ với mã zip sai, mặc dù phải mất 3000 ms.

Chỉ với 2 trạng thái được tải, máy chủ sẽ mất ít thời gian hơn trong tìm kiếm không hiệu quả hoặc một trận đấu có điểm rất thấp, bởi vì nó chỉ có thể tìm kiếm ở 2 trạng thái.

Tôi đã cố gắng hạn chế điều này bằng cách đặt restrict_regiontham số thành đa trạng thái trong hàm mã địa lý, hy vọng rằng sẽ tránh được tìm kiếm không hiệu quả vì tôi khá chắc chắn rằng hầu hết các địa chỉ đều có trạng thái chính xác. So sánh hai phiên bản:

  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';

Sự khác biệt duy nhất được tạo bởi phiên bản thứ hai là thông thường nếu tôi chạy cùng một truy vấn ngay lập tức thì nó sẽ nhanh hơn nhiều vì dữ liệu liên quan đã được lưu trong bộ nhớ cache, nhưng phiên bản thứ hai đã vô hiệu hóa hiệu ứng này.

Vì vậy, restrict_regionnó không hoạt động như tôi mong muốn, có lẽ nó chỉ được sử dụng để lọc kết quả nhiều lần truy cập, không giới hạn phạm vi tìm kiếm.

Bạn có thể điều chỉnh postgre conf của bạn một chút.

Nghi ngờ thông thường về việc cài đặt các chỉ mục bị thiếu, phân tích chân không không tạo ra bất kỳ sự khác biệt nào đối với tôi, bởi vì tập lệnh tải xuống đã thực hiện bảo trì cần thiết, trừ khi bạn nhầm lẫn với chúng.

Tuy nhiên, thiết lập postgre conf theo bài đăng này đã giúp. Máy chủ quy mô đầy đủ của tôi với 50 trạng thái có 320 ms với cấu hình mặc định cho một số dữ liệu có hình dạng xấu hơn, nó được cải thiện thành 185 ms với 2G shared_buffer, bộ đệm 5G và tiếp tục 100 ms với hầu hết các cài đặt được điều chỉnh theo bài đăng đó.

Điều này có liên quan nhiều hơn đến postgis và cài đặt của chúng có vẻ giống nhau.

Kích thước lô của mỗi cam kết không quan trọng đối với trường hợp của tôi. Tài liệu mã địa lý đã sử dụng kích thước lô 3. Tôi đã thử nghiệm các giá trị từ 1, 3, 5 đến 10. Tôi không tìm thấy bất kỳ sự khác biệt đáng kể nào với điều này. Với kích thước lô nhỏ hơn, bạn thực hiện nhiều cam kết và cập nhật hơn, nhưng tôi nghĩ rằng cổ chai thực sự không có ở đây. Thực tế bây giờ tôi đang sử dụng kích thước lô 1. Bởi vì luôn có một số địa chỉ hình thành không mong muốn sẽ gây ra ngoại lệ, tôi sẽ đặt toàn bộ lô có lỗi là bỏ qua và tiến hành cho các hàng còn lại. Với kích thước lô 1, tôi không cần xử lý bảng lần thứ hai để mã hóa địa lý các hồ sơ tốt có thể có trong lô được đánh dấu là bỏ qua.

Tất nhiên điều này phụ thuộc vào cách tập lệnh bó của bạn hoạt động. Tôi sẽ đăng kịch bản của tôi với nhiều chi tiết sau.

Bạn có thể thử sử dụng địa chỉ chuẩn hóa để lọc địa chỉ xấu nếu phù hợp với việc sử dụng của bạn. Tôi thấy ai đó đã đề cập đến vấn đề này ở đâu đó, nhưng tôi không chắc nó hoạt động như thế nào vì chức năng chuẩn hóa chỉ hoạt động ở định dạng, nó thực sự không thể cho bạn biết địa chỉ nào không hợp lệ.

Sau đó tôi nhận ra rằng nếu địa chỉ rõ ràng là xấu và bạn muốn bỏ qua chúng, điều này có thể giúp ích. Ví dụ: tôi có rất nhiều địa chỉ thiếu tên đường hoặc thậm chí tên đường. Bình thường hóa tất cả địa chỉ đầu tiên sẽ tương đối nhanh, sau đó bạn có thể lọc địa chỉ xấu rõ ràng cho bạn sau đó bỏ qua chúng. Tuy nhiên, điều này không phù hợp với việc sử dụng của tôi vì một địa chỉ không có số đường hoặc thậm chí tên đường vẫn có thể được ánh xạ tới đường hoặc thành phố và thông tin đó vẫn hữu ích cho tôi.

Và hầu hết các địa chỉ không thể mã hóa địa lý trong trường hợp của tôi thực sự có tất cả các trường, chỉ là không có kết quả khớp trong cơ sở dữ liệu. Bạn không thể lọc các địa chỉ này chỉ bằng cách bình thường hóa chúng.

EDIT Để biết thêm chi tiết, xem bài đăng trên blog của tôi về thiết lập máy chủ mã hóa địa lýtập lệnh tôi đã sử dụng .

EDIT 2 Tôi đã hoàn thành mã hóa địa lý 2 triệu địa chỉ và đã dọn sạch rất nhiều địa chỉ dựa trên kết quả mã hóa địa lý. Với đầu vào được làm sạch tốt hơn, công việc hàng loạt tiếp theo sẽ chạy nhanh hơn nhiều. Bằng cách sạch, tôi có nghĩa là một số địa chỉ rõ ràng là sai và cần được xóa hoặc có nội dung không mong muốn cho trình mã hóa địa lý gây ra vấn đề về mã hóa địa lý. Lý thuyết của tôi là: Loại bỏ các địa chỉ xấu có thể tránh làm hỏng bộ đệm, giúp cải thiện hiệu suất trên các địa chỉ tốt đáng kể.

Tôi đã tách đầu vào dựa trên trạng thái để đảm bảo mọi công việc đều có thể có tất cả dữ liệu cần thiết cho mã hóa địa lý được lưu trong bộ nhớ cache. Tuy nhiên, mọi địa chỉ xấu trong công việc đều khiến trình mã hóa địa lý tìm kiếm ở nhiều trạng thái hơn, điều này có thể làm rối bộ đệm.


Phản ứng tuyệt vời. Trên hộp của tôi, như đã xảy ra, việc lọc trạng thái sẽ tăng tốc độ trận đấu khoảng 50 (!) Nhưng tôi nghi ngờ mình có thể có vấn đề về chỉ số.
ako

2
  1. Theo chuỗi thảo luận này , bạn phải sử dụng cùng một quy trình chuẩn hóa để xử lý dữ liệu Tiger và địa chỉ đầu vào của bạn. Vì dữ liệu Tiger đã được xử lý với bộ chuẩn hóa tích hợp, tốt hơn là chỉ sử dụng bộ chuẩn hóa tích hợp. Ngay cả khi bạn đã làm cho pagc_n normalizer hoạt động, nó có thể không giúp bạn nếu bạn không sử dụng nó để cập nhật dữ liệu Tiger.

    Điều đó đang được nói, tôi nghĩ mã địa lý () dù sao cũng sẽ gọi trình chuẩn hóa để bình thường hóa địa chỉ trước khi mã hóa địa lý có thể không thực sự hữu ích. Một cách sử dụng có thể của bộ chuẩn hóa có thể là so sánh địa chỉ chuẩn hóa và địa chỉ được trả về bởi mã địa lý (). Với cả hai đều được chuẩn hóa, có thể dễ dàng tìm thấy kết quả mã hóa địa lý sai.

    Nếu bạn có thể lọc địa chỉ xấu ra khỏi mã địa lý bằng trình chuẩn hóa, điều đó thực sự có ích. Tuy nhiên tôi không thấy bình thường hóa có bất cứ điều gì như điểm số trận đấu hoặc xếp hạng.

  2. Chủ đề thảo luận tương tự cũng đề cập đến một công tắc gỡ lỗi geocode_addressđể hiển thị thêm thông tin. Nút geocode_addresscần đầu vào địa chỉ chuẩn hóa.

  3. Geocoder là nhanh cho trận đấu chính xác nhưng mất nhiều thời gian hơn cho các trường hợp khó khăn. Tôi thấy có một tham số restrict_regionvà nghĩ rằng có thể nó sẽ giới hạn tìm kiếm không có kết quả nếu tôi đặt giới hạn là trạng thái vì tôi khá chắc chắn rằng nó sẽ ở trạng thái nào. địa chỉ chính xác, mặc dù phải mất một thời gian.

    Vì vậy, có thể trình mã hóa địa lý sẽ tìm kiếm ở tất cả các vị trí có thể nếu tìm kiếm chính xác đầu tiên không khớp. Điều này làm cho nó có thể xử lý đầu vào với một số lỗi, nhưng cũng làm cho một số tìm kiếm rất chậm.

    Tôi nghĩ rằng một dịch vụ tương tác chấp nhận đầu vào có lỗi, nhưng đôi khi chúng ta có thể muốn từ bỏ một tập nhỏ địa chỉ sai để có hiệu suất tốt hơn trong mã hóa địa lý hàng loạt.


Ảnh hưởng của restrict_regionthời gian khi bạn đặt trạng thái chính xác là gì? Ngoài ra, từ chủ đề người dùng postgis mà bạn đã liên kết ở trên, họ đề cập cụ thể là gặp sự cố với các địa chỉ 1020 Highway 20mà tôi gặp phải.
aaryno

Đặt trạng thái chính xác có thể sẽ không cải thiện, vì nếu địa chỉ được định dạng tốt, trình mã hóa địa lý có thể có trạng thái đúng.
dracodoc

1

Tôi sẽ đăng câu trả lời này nhưng hy vọng một cộng tác viên khác sẽ giúp phá vỡ những điều sau đây, mà tôi nghĩ sẽ vẽ ra một bức tranh mạch lạc hơn:

Tác động của số lượng trạng thái được tải lên mã hóa địa lý là gì? Tôi đã có tất cả 50 và tôi đang thấy hiệu suất thấp hơn nhiều so với @ LR1234567 (tức là 8 lần mỗi lần geocode).

Phương pháp hiệu quả nhất cho mã hóa địa lý số lượng lớn là gì? Tôi đang chạy một quy trình nối tiếp, chạy các lô 100 lần liên tục cho đến khi hoàn thành toàn bộ tải sau. Một cách tiếp cận đa luồng sẽ được ưa thích hơn, nhưng phương pháp nào được khuyến nghị?

Tác động của ảo hóa lên mã hóa địa lý PostgreSQL là gì? Tôi đoán 10% dựa trên một số bài đăng khác, nhưng có chút tự tin về câu trả lời đó

Bây giờ câu trả lời của tôi, đó chỉ là một giai thoại:

Điều tốt nhất tôi nhận được (dựa trên một kết nối duy nhất) là trung bình là 208 ms mỗi geocode. Điều này được đo bằng cách chọn ngẫu nhiên các địa chỉ từ bộ dữ liệu của tôi, trải dài trên khắp Hoa Kỳ. Nó bao gồm một số dữ liệu bẩn nhưng geocodes chạy lâu nhất dường như không tệ theo những cách rõ ràng.

Điểm chính của nó là tôi dường như bị ràng buộc CPU và một truy vấn duy nhất được liên kết với một bộ xử lý. Tôi có thể song song điều này bằng cách có nhiều kết nối chạy với UPDATExảy ra trên các phân đoạn bổ sung của addresses_to_geocodebảng trong lý thuyết. Trong khi đó, tôi nhận được geocodetrung bình là 208 ms trên bộ dữ liệu toàn quốc. Phân phối bị sai lệch cả về vị trí của hầu hết các địa chỉ của tôi và về thời gian họ sử dụng (ví dụ: xem biểu đồ bên trên) và bảng bên dưới.

Cách tiếp cận tốt nhất của tôi cho đến nay là thực hiện theo lô 10000, với một số cải tiến có thể ước tính từ việc làm nhiều hơn mỗi đợt. Đối với lô 100 tôi nhận được khoảng 251ms, với 10000 tôi nhận được 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";

Tôi phải trích dẫn tên trường vì cách RPostgreSQL tạo các bảng với dbWriteTable

Đó là khoảng 4 lần nhanh như thể tôi làm cho họ một bản ghi tại một thời điểm. Khi tôi làm chúng một lần, tôi có thể bị hỏng theo trạng thái (xem bên dưới). Tôi đã làm điều này để kiểm tra và xem liệu một hoặc nhiều trạng thái của TIGER có tải hoặc chỉ số xấu, mà tôi dự kiến ​​sẽ dẫn đến geocodehiệu suất kém theo trạng thái. Rõ ràng tôi đã có một số dữ liệu xấu (một số địa chỉ thậm chí là địa chỉ email!), Nhưng hầu hết chúng đều được định dạng tốt. Như tôi đã nói trước đây, một số truy vấn chạy dài nhất không có thiếu sót rõ ràng trong định dạng của chúng. Dưới đây là bảng số lượng, thời gian truy vấn tối thiểu, thời gian truy vấn trung bình và thời gian truy vấn tối đa cho các trạng thái từ 3000-một số địa chỉ ngẫu nhiên từ tập dữ liệu của tôi:

       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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.