PostGIS'in iyi biçimlendirilmiş adresleri coğrafi olarak kodlamasını ne kadar hızlı beklemeliyim?


17

PostGIS'in iyi biçimlendirilmiş adresleri coğrafi olarak kodlamasını ne kadar hızlı beklemeliyim?

PostgreSQL 9.3.7 ve PostGIS 2.1.7'yi yükledim, ülke verilerini ve tüm eyalet verilerini yükledim ancak coğrafi kodlamanın tahmin ettiğimden çok daha yavaş olduğunu gördüm. Beklentilerimi çok yüksek mi ayarladım? Saniyede ortalama 3 ayrı coğrafi kod alıyorum. Yaklaşık 5 milyon yapmam gerekiyor ve bunun için üç hafta beklemek istemiyorum.

Bu dev R matrislerini işlemek için sanal bir makinedir ve bu veritabanını tarafa yükledim, böylece yapılandırma biraz aptalca görünebilir. VM'nin yapılandırmasında büyük bir değişiklik yardımcı olursa, yapılandırmayı değiştirebilirim.

Donanım özellikleri

Bellek: 65 GB işlemciler: 6 lscpubana şunu veriyor:

# 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

İşletim sistemi centos, bunu uname -rvverir:

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

Postgresql yapılandırması

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

Bu tür sorgulara ilişkin önceki önerilere dayanarak shared_buffers,postgresql.conf dosyada kullanılabilir RAM'in 1 / 4'üne ve etkin önbellek boyutunun 1 / 2'si RAM'e :

shared_buffers = 16096MB     
effective_cache_size = 31765MB

Sahibim installed_missing_indexes() ve (bazı tablolara yinelenen ekler çözüldükten sonra) herhangi bir hata yoktu.

Coğrafi kodlama SQL örneği # 1 (toplu) ~ ortalama süre 2.8 / sn'dir

Bana coğrafi kod adresi içeren bir tablo oluşturmak ve daha sonra bir SQL yapıyor http://postgis.net/docs/Geocode.html gelen örneği takip ediyorum 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";

Yukarıda 1000 toplu bir boyutu kullanıyorum ve 337.70 saniye içinde döner. Daha küçük gruplar için biraz daha yavaştır.

Coğrafi kodlama SQL örneği # 2 (satır satır) ~ ortalama süre 1.2 / sn

Coğrafi kodları bir kerede böyle görünen bir ifadeyle yaparak adreslerime girdiğimde (btw, aşağıdaki örnek 4.14 saniye sürdü),

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;

biraz daha yavaş (kayıt başına 2.5x) ama sorgu sürelerinin dağılımına bakabilir ve bunun en yavaşlayan uzun sorguların az bir kısmına bakabilirim (sadece 5 milyonun ilk 2600'ü arama sürelerine sahiptir). Yani, üst% 10 ortalama 100 ms, alt% 10 ortalama 3.69 saniyedir, ortalama 754 ms ve medyan 340 ms'dir.

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

İlk 2600 satır için coğrafi kodlama süreleri

Diğer düşünceler

Performansta bir büyüklük artışı siparişi alamazsam, en azından yavaş coğrafi kod zamanlarını tahmin etme konusunda eğitimli bir tahmin yapabileceğimi düşündüm, ancak yavaş adreslerin neden bu kadar uzun sürdüğü açık değil. geocode()Fonksiyonu almadan önce güzel biçimlendirildiğinden emin olmak için orijinal adresi özel bir normalleştirme adımıyla çalıştırıyorum :

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

nerede myAddressbir[Address], [City], [ST] [Zip] postgresql olmayan bir veritabanından bir kullanıcı adres tablosundan derlenen dize.

pagc_normalize_addressUzantıyı yüklemeyi denedim (başarısız oldum) ama bunun aradığım iyileştirmeyi getireceği açık değil. Öneriye göre izleme bilgisi eklemek için düzenlendi

Verim

Bir CPU sabitlendi: [düzenle, sorgu başına sadece bir işlemci, bu yüzden 5 kullanılmamış CPU'm var]

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

Bir işlem% 100'de sabitlenirken veri bölümündeki disk etkinliği örneği: [değiştir: bu sorgu tarafından kullanılan yalnızca bir işlemci]

# 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

Bu SQL'i analiz edin

Bu şu EXPLAIN ANALYZEsorgudandır:

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

Daha iyi dökümü http://explain.depesz.com/s/vogS adresinde görebilirsiniz.


1
Sorguları çalıştırdığınızda makine ne yapar? ES üzerinde engelliyor mu yoksa darboğaz başka bir yerde mi?
til_b

1
Kaç eyalet yüklediniz? 4-8GB ram'lık bir Windows 64 bitlik kutuda genellikle 30ms - 150 ms adres başına bir yer alıyorum. Genellikle sadece 1 ya da 2 eyaletle çalışıyorum. Daha fazla devletin performansa etkisi konusunda bir kıyaslama yapmadım.
LR1234567

@ LR1234567 50 eyalet
aaryno

1
@til_b CPU% 99.7 oranında sabitlendi
aaryno

Bu bir seferlik bir şey olduğundan ve 100 adres / gün çalışma süresi yüküne yetişmek için bittikten sonra bol miktarda meyve suyumuz olacağı için bu şeyi bitirmek için birkaç hafta bekleyeceğimiz gibi görünüyor. deneyimliyoruz. Pegged CPU'larımızı dolaşmamıza izin veren gerçekten zorlayıcı bir şey ortaya çıktığında bunu bitirene kadar bunu açık tutacağım.
aaryno

Yanıtlar:


7

Bunu denemek için çok zaman harcadım, bence farklı açıdan olduklarından ayrı olarak yayınlamak daha iyi.

Bu gerçekten karmaşık bir konu, blog yazımda coğrafi kodlama sunucusu kurulumu ve kullandığım komut dosyası hakkında daha fazla ayrıntı gör ., İşte bazı kısa özetler:

Yalnızca 2 Durum verisine sahip bir sunucu her zaman 50 durum verisi yüklü bir sunucudan daha hızlıdır.

Bunu ev bilgisayarımla farklı zamanlarda ve iki farklı Amazon AWS sunucusuyla doğruladım.

2 durumlu verilere sahip AWS ücretsiz katman sunucumun yalnızca 1G RAM'i var, ancak 1000 kayıt ve 45.000 kayıt içeren veriler için tutarlı 43 ~ 59 ms performansa sahip.

Tüm durumları yüklü bir 8G RAM AWS sunucusu için tam olarak aynı kurulum prosedürünü, tam olarak aynı komut dosyası ve verileri kullandım ve performans 80 ~ 105 ms'ye düştü.

Benim teorim, geocoder adresle tam olarak eşleşemediğinde, arama aralığını genişletmeye ve posta kodu veya şehir gibi bir kısmı görmezden gelmeye başladı. Bu nedenle coğrafi kod belgesi, 3000 ms sürmesine rağmen yanlış posta kodu ile adresi yeniden kolonlayabildiğinden övünür.

Yalnızca 2 durum verisi yüklendiğinde, sunucunun sonuçsuz aramada veya çok düşük skorlu bir maçta çok daha az zaman alacaktır, çünkü yalnızca 2 durumda arama yapabilir.

Ayarlayarak bunu sınırlamaya çalıştım restrict_region adreslerin çoğu doğru duruma sahip olduğundan eminim çünkü sonuçsuz sonuç arama umuduyla, coğrafi kod fonksiyonu devlet çokgenler parametre . Bu iki sürümü karşılaştırı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';

İkinci sürüm tarafından yapılan tek fark, normalde aynı sorguyu hemen tekrar çalıştırırsam, ilgili verilerin önbelleğe alınması nedeniyle çok daha hızlı olacağı, ancak ikinci sürümün bu efekti devre dışı bırakmasıdır.

Bu yüzden restrict_regionistediğim gibi çalışmıyor, belki sadece arama sonuçlarını sınırlamak için değil, birden çok isabet sonucunu filtrelemek için kullanıldı.

Postgre conf'inizi biraz ayarlayabilirsiniz.

Yükleme eksik dizinlerinin olağan şüphesi olan vakum analizi benim için herhangi bir fark yaratmadı, çünkü indirme betiği, onlarla uğraşmadıkça gerekli bakımı yaptı.

Ancak bu gönderiye göre postgre conf ayarı yardımcı oldu. 50 durumlu tam ölçekli sunucum, daha kötü şekilli veriler için varsayılan yapılandırmayla 320 ms'ye sahipti, 2G paylaşılan_buffer, 5G önbellek ile 185 ms'ye yükseldi ve bu mesaja göre ayarlanan çoğu ayar ile 100 ms'ye çıktı.

Bu postgis ile daha ilgili ve ayarları benzer görünüyordu.

Her taahhüdün toplu boyutu benim durumum için çok önemli değildi. Coğrafi kod dokümantasyonunda bir toplu iş boyutu 3 kullanıldı. 1, 3, 5 ile 10 arasındaki değerleri denedim. Bu konuda önemli bir fark bulamadım. Daha küçük parti boyutu ile daha fazla taahhüt ve güncelleme yaparsınız, ancak bence gerçek şişe boynu burada değil. Aslında şimdi toplu iş boyutu 1 kullanıyorum. Her zaman beklenmedik kötü biçimlendirilmiş adres istisnaya neden olacağından, tüm toplu işi hata olarak göz ardı edilecek şekilde ayarlayacağım ve kalan satırlar için devam edeceğim. Parti boyutu 1 ile, yok sayılan toplu işteki olası iyi kayıtları coğrafi olarak kodlamak için tabloyu ikinci kez işlemem gerekmez.

Tabii ki bu toplu betiğinizin nasıl çalıştığına bağlıdır. Senaryomu daha sonra daha fazla ayrıntıyla göndereceğim.

Kullanımınıza uygunsa bozuk adresi filtrelemek için normalleştirme adresini kullanmayı deneyebilirsiniz. Birinin bundan bir yerde bahsettiğini gördüm, ancak normalleştirme işlevi sadece formatta çalıştığı için bunun nasıl çalıştığından emin değildim, size hangi adresin geçersiz olduğunu gerçekten söyleyemez.

Daha sonra, adresin açıkça kötü durumda olduğunu ve bunları atlamak istiyorsanız, bunun yardımcı olabileceğini fark ettim. Örneğin, sokak adı ve hatta sokak adları eksik olan birçok adresim var. İlk önce tüm adresleri normalleştirin nispeten hızlı olacaktır, daha sonra sizin için bariz kötü adresi filtreleyip atlayabilirsiniz. Ancak, sokak numarasının veya hatta sokak adının olmadığı bir adres hala caddeye veya şehre eşleştirilebildiğinden ve bu bilgiler benim için hala yararlı olduğundan, bu benim kullanımım için uygun değildi.

Ve benim durumumda coğrafi olarak kodlanamayan adreslerin çoğu aslında tüm alanlara sahip, sadece veritabanında eşleşme yok. Bu adresleri yalnızca normalleştirerek filtreleyemezsiniz.

DÜZENLE Daha fazla bilgi için coğrafi kodlama sunucusu kurulumu ve kullandığım komut dosyası hakkındaki blog gönderime bakın .

EDIT 2 Coğrafi kodlamayı 2 milyon adres bitirdim ve coğrafi kodlama sonucuna göre adreslerde çok fazla temizlik yaptım. Daha iyi temizlenmiş girdi ile bir sonraki toplu iş çok daha hızlı çalışır. Temiz demek istediğim, bazı adreslerin açıkça yanlış olduğu ve kaldırılması gerektiği veya coğrafi kodlayıcı için coğrafi kodlamada soruna neden olacak beklenmedik içeriğe sahip olması gerekir. Benim teorim: Kötü adresleri kaldırmak önbelleği karıştırmaktan kaçınabilir, bu da iyi adreslerdeki performansı önemli ölçüde artırır.

Her işin RAM'de önbelleğe alınan coğrafi kodlama için gerekli tüm verilere sahip olduğundan emin olmak için girişi duruma göre ayırdım. Ancak işteki her kötü adres, coğrafi kodlayıcıyı daha fazla durumda arama yapar ve bu da önbelleği bozabilir.


Mükemmel yanıt. Kutumda, olduğu gibi, devlet için filtreleme maçı yaklaşık 50 (!) Bir faktör kadar hızlandırıyor, ancak dizin sorunları olabileceğinden şüpheleniyorum.
ako

2
  1. Bu tartışma konusuna göre , Tiger verilerini ve giriş adresinizi işlemek için aynı normalleştirme prosedürünü kullanmanız gerekir. Tiger verileri yerleşik normalleştirici ile işlendiğinden, yalnızca yerleşik normalleştirici kullanmak daha iyidir. Pagc_normalizer'ı çalıştırmış olsanız bile, Tiger verilerini güncellemek için kullanmazsanız size yardımcı olmayabilir.

    Bu söyleniyor, ben geocode () normalde yine de normal kod çağıracak düşünüyorum böylece coğrafi kodlama gerçekten yararlı olmayabilir önce adresi normalleştirmek. Normalleştiricinin olası bir kullanımı, normalleştirilmiş adresi ve geocode () tarafından döndürülen adresi karşılaştırmak olabilir. Her ikisi de normalleştirildiğinde, yanlış coğrafi kodlama sonucunu bulmak daha kolay olabilir.

    Normalleştirici tarafından hatalı adresi coğrafi koddan filtreleyebilirseniz, bu gerçekten yardımcı olacaktır. Ancak normalleştiricinin maç puanı veya puan gibi bir şey olduğunu görmüyorum.

  2. Aynı tartışma geocode_addressdizisi daha fazla bilgi göstermek için bir hata ayıklama anahtarından da bahsetti . Düğümün geocode_addressnormalleştirilmiş adres girişine ihtiyacı var.

  3. Geocoder tam eşleşme için hızlıdır, ancak zor vakalar için çok daha fazla zaman alır. Bir parametre buldum restrict_regionve hangi eyalette olacağından emin olduğum için limiti eyalet olarak ayarlarsam belki de meyvesiz aramayı sınırlayacağını düşündüm. Yanlış bir duruma getirildiğinde, coğrafi kodu almak için durmadı Doğru adres, biraz zaman alsa da.

    İlk kesin aramanın eşleşmemesi durumunda belki geocoder olası tüm yerlere bakacaktır. Bu, girdinin bazı hatalarla işlenmesini sağlar, ancak bazı aramaları çok yavaş hale getirir.

    Etkileşimli bir hizmetin hatalı girdileri kabul etmesinin iyi olduğunu düşünüyorum, ancak bazen toplu coğrafi kodlamada daha iyi performans elde etmek için küçük bir yanlış adres kümesinden vazgeçmek isteyebiliriz.


restrict_regionDoğru durumu ayarladığınızda zamanlamanın etkisi ne oldu ? Ayrıca, yukarıda bağlandığınız postgis kullanıcıları iş parçacığından, özellikle 1020 Highway 20de karşılaştığım adreslerle ilgili sorun yaşadıklarından bahsediyorlar .
aaryno

Doğru durumun ayarlanması büyük olasılıkla iyileşmeyecektir, çünkü adres iyi biçimlendirilmişse, coğrafi kodlayıcı durumu zaten doğru şekilde alabilir.
dracodoc

1

Bu cevabı göndereceğim, ancak umarım başka bir katılımcı aşağıdakileri parçalamaya yardımcı olacaktır, ki bence daha tutarlı bir resim çizecek:

Coğrafi kodlama üzerine yüklenen durum sayısının etkisi nedir? Ben 50 tüm var ve @ LR1234567 (yani, başına 8x zaman geocode) çok daha düşük bir performans görüyorum .

Toplu coğrafi kodlama için en etkili yöntem nedir? Tüm geri yükleme tamamlanana kadar 100'lük partiler halinde seri bir işlem yürütüyorum. Çok iş parçacıklı bir yaklaşım tercih edilir, ancak hangi yaklaşımlar önerilir?

Sanallaştırmanın PostgreSQL coğrafi kodlaması üzerindeki etkisi nedir? Diğer yazılara dayanarak% 10 tahmin ediyorum, ancak bu cevaba çok az güveniyorum

Şimdi cevabım, bu sadece bir fıkra:

En iyi (tek bir bağlantıya dayanarak) alıyorum en iyi 208 ms başına geocode. Bu, ABD çapında uzanan veri kümemden rastgele adresler seçilerek ölçülür. Bazı kirli veriler içeriyor, ancak en uzun süredir devam eden veriler bariz şekilde kötügeocode görünmüyor .

Bunun özü CPU bağlı gibi görünüyor ve tek bir sorgu tek bir işlemciye bağlı olmasıdır. Teoride tablonun UPDATEtamamlayıcı segmentlerinde meydana gelen çoklu bağlantılarla bunu paralel hale getirebilirim addresses_to_geocode. Bu arada, geocodeülke çapında veri kümesinde ortalama 208 ms alıyorum . Dağıtım, adreslerimin çoğunun nerede olduğu ve ne kadar sürdüğü (örn. Yukarıdaki histograma bakın) ve aşağıdaki tablo açısından çarpıktır.

Şimdiye kadarki en iyi yaklaşımım, 10000'lü partiler halinde yapmak ve parti başına daha fazlasını yapmaktan bazı tahmin edilebilir iyileştirmeler yapmak. 100'lü partiler için yaklaşık 251 ms, 10000 ile 208 ms alıyordum.

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 ile tabloları nasıl oluşturduğu nedeniyle alan adlarını alıntı yapmak zorunda dbWriteTable

Bu, her seferinde bir kayıt yaptığım gibi yaklaşık 4 kat daha hızlı. Bunları teker teker yaptığımda duruma göre bir arıza alabilirim (aşağıya bakın). Bunu bir ya da daha fazla TIGER durumunun kötü geocodeperformansa veya indekse sahip olup olmadığını kontrol etmek ve kötü performansla sonuçlanmayı beklediğimi görmek için yaptım. Açıkçası bazı kötü veriler var (bazı adresler bile e-posta adresleri!), Ancak çoğu iyi biçimlendirilmiş. Daha önce de söylediğim gibi, en uzun süre çalışan sorguların bazılarının biçiminde belirgin eksiklikleri yoktur. Veri kümemdeki 3000-bazı rastgele adreslerden gelen durumlar için sayı, minimum sorgu süresi, ortalama sorgu süresi ve maksimum sorgu süresi tablosu:

       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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.