Daha çox

Sınırlayıcı bir qutu əvəzinə bir məhdudlaşdıran çoxbucaqlı istifadə


Geniş bir LAT / LON koordinatlarım var. İndiyə qədər müəyyən bir bölgəyə düşənləri seçməyim lazım olduğunda, bəzi MINx, MAXx, MINy, MAXy dəyərlərindən istifadə edərək məhdudlaşdırıcı bir qutu yaratardım və olduğum əraziyə mümkün qədər yaxınlaşdırmağa çalışardım. maraqlanır.

Axtarış sahəmin həcmi olaraq 4 bənddən çox, bu halda 14 nöqtədən istifadə edərək daha dəqiq əldə etmək istərdim.

Yəqin ki, bunun üçün Python və ya SQL istifadə edəcəyəm, buna görə hər hansı bir həlldəki xüsusi sintaksis o qədər də vacib deyil, sadəcə bunu tapmaq üçün düsturla maraqlanıram.


Əməliyyatı yerinə yetirmək üçün Shapely istifadə edə bilərsiniz (məs. Daxilində). Hər iki həndəsəni qarşılıqlı fəaliyyət üçün bir Shapely üsulu ilə yükləyə bilərsiniz.


PostGIS, istədiyiniz şeyi etməsi lazım olan əlaqəli operatorlar toplusuna malikdir.


Həcmi məhdudlaşdırmaq

Kompüter qrafika və hesablama həndəsəsində, a hədd həcmi obyektlər dəsti üçün dəstdəki obyektlərin birləşməsini tamamilə ehtiva edən qapalı bir cilddir. Sınaq həcmləri, daha mürəkkəb obyektləri ehtiva etmək üçün sadə həcmlərdən istifadə edərək həndəsi əməliyyatların səmərəliliyini artırmaq üçün istifadə olunur. Normalda, daha sadə cildlərin üst-üstə düşməsini yoxlamaq üçün daha sadə yollar var.

Bir sıra cisimlər üçün hədd həcmi, eyni zamanda onların birləşməsindən və əksinə bir cismdən ibarət olan bir cismdir. Buna görə, təsviri boş olmayan və sərhədli (sonlu) olduğu tək bir obyektin vəziyyəti ilə məhdudlaşdırmaq mümkündür.


Sərhəd qutusu

Sınır qutusu (ümumiyyətlə qutusuna qısaldılmışdır) iki uzunluq və iki enlik ilə təyin olunan bir sahədir, burada:

  • Enlem -90.0 ilə 90.0 arasındakı ondalık rəqəmdir.
  • Boylam -180.0 ilə 180.0 arasındakı ondalık rəqəmdir.

Ümumiyyətlə aşağıdakıların standart formatına əməl edirlər:

Məsələn, Böyük London əlavə olunur:

Əsas veb saytdakı "ixrac məlumatları" bağlantısı bir qutu çəkməyə imkan verir və kənarların koordinatları sizə göstərilir.

Params alt səhifəsinə sahib olan WikiProject-də pBbox şablonunu istifadə edərək hüdud qutusunu əldə edə bilərsiniz.


Lealand qaldırılmış "genişlik" və "hündürlük" bir qədər qeyri-müəyyən şərtlərdir.

AABB-nin enini və hündürlüyünü tapmaq üçün birbaşa bir yanaşma:

Çoxbucağın genişlik hündürlüyü yoxdur, çünki sadəcə təpələr toplusudur. Əslində, bu xüsusiyyətlər yalnız dördüncü olduğunda (düzbucaqlıda olduğu kimi) istifadə etdiyimiz üçün həqiqətən mənalıdır.

Bu xassələri hesablamaq üçün öz metodlarınızı müəyyənləşdirməlisiniz və yazmalısınız. Məsələn, genişlik istənilən iki təpə arasındakı maksimum məsafə kimi müəyyən edilə bilər və hündürlük həmin sətrin orta nöqtəsi ilə üçüncü təpə arasındakı uzunluq ola bilər.


Kodunuz, limitingBox almaq üçün çoxbucaqlıda istifadə olunan faktiki kodla olduqca oxşar görünür. , həddindən artıq min / max dəyərləri ilə başlayın və sonra oradan keçin.

Şərtlərin də ən sürətli olması əvəzinə min () / max () funksiyalarından istifadə seçiminin tez-tez olduğunu görürəm, buna görə kodunuzla razıyam.

Məni bir az narahat edən şey aşağıdakılardan istifadə etməkdir:

Bu, çox iş görən və ya etməyəcək maraqlı bir zəngdir. İcrasını nəzərdən keçirin:

Sərhədlər əvvəllər hesablanmışdısa, o zaman çox sürətli olacaq. Əks təqdirdə, çox iş görməli və əlavə olaraq Dikdörtgen nümunələri yaratmalıdır.

Əslində, sərhədləri tez-tez yoxlayırsınızsa və Çoxbucaqlıları dəyişdirmirsinizsə, məhdudlaşdırılan çek olduqca yaxşı amortizasiya olunur. Olmazsa, o zaman çox lazımsız iş görürsən.

Keçən vaxtı (icra müddəti) yaxşılaşdırmaq üçün tövsiyə edə biləcəyim yalnız iki şey bunlardır:

Kombinə paralellik / ibtidainin Java 8 axınlarını istifadə edərək və çoxbucaqlı məlumatların açıq olmasından sui-istifadə edərək həyata keçirilməsi asan olardı.

Paralelliyi asanlıqla təqdim etdiyi üçün yuxarıdakı kod yaxşı olacaq. Yalnız bir mövzu ilə kifayətlənirsinizsə, yalnız primitivlər kimi bir şey tövsiyə edərdim:

Əks təqdirdə bütün poli hüdudları yenidən hesablamalı olanda yuxarıda göstərilənlər daha sürətli olacaqdır.

Təəssüf ki, hər şey istifadə vəziyyətinizdən və çox işləmə qabiliyyətinizdən asılıdır.

Əgər məhdudlaşırsınızsa, əlinizdəki şeyə də sadiq qala bilərsiniz, sürətli, səliqəli və əksinə yaxşıdır.


Sintaksis

İsti nöqtə analizinin aparılacağı nöqtə və ya çoxbucaqlı xüsusiyyət sinfi.

Z-skoru, p dəyəri və Gi_Bin nəticələrini almaq üçün çıxış xüsusiyyət sinfi.

Rəqəmsal sahə (hadisələrin sayı, cinayət nisbətləri, test balları və s.) Qiymətləndiriləcəkdir.

Hadisə nöqtəsi məlumatlarından təhlil üçün ağırlıqlı xüsusiyyətlər yaratmaq üçün istifadə olunan toplama metodu.

  • COUNT_INCIDENTS_WITHIN_FISHNET_POLYGONS —Balıq toru çoxbucaqlı mesh hadisə nöqtəsi məlumatlarını üst-üstə qoyacaq və hər çoxbucaqlı hüceyrədəki hadisələrin sayı sayılacaqdır. Bounding_Polygons_Defining_Where_Incidents_Are_Possible parametresində heç bir çoxbucaqlı təmin edilmirsə, əks halda analizdə yalnız ən azı bir hadisəsi olan hüceyrələrdən istifadə ediləcəkdir, əks halda sərhəd poliqonlarının içindəki bütün hüceyrələr analiz ediləcəkdir.
  • COUNT_INCIDENTS_WITHIN_AGGREGATION_POLYGONS —Poliqonlar_For_Aggregating_Incidents_Into_Counts parametrində hadisə nöqtəsi məlumatlarını örtmək üçün toplama çoxbucaqlarını təmin edirsiniz. Hər çoxbucaqlıdakı hadisələr sayılır.
  • SNAP_NEARBY_INCIDENTS_TO_CREATE_WEIGHTED_POINTS - Yaxınlıqdakı hadisələr tək bir ağırlıqlı nöqtə yaratmaq üçün birlikdə toplanacaq. Hər nöqtə üçün çəki həmin məkanda cəmlənmiş hadisələrin sayındadır.

Hadisənin Input_Features-un baş verə biləcəyi yeri müəyyən edən bir çoxbucaqlı xüsusiyyət sinfi.

Hər çoxbucaqlı xüsusiyyət üçün hadisə sayını almaq üçün hadisənin Input_Features-ı cəmləşdirmək üçün istifadə ediləcək çoxbucaqlar.

Nöqtə giriş xüsusiyyətlərinin çıxış sıxlığı səthi. Bu parametr yalnız Input_Features nöqtələri olduqda və ArcGIS Spatial Analyst uzantısına sahib olduğunuzda aktivləşdirilir. Yaradılan çıxış səthi mühit parametrlərinizdə göstərilən raster analiz maskasına kəsiləcək. Rastr maskası göstərilməyibsə, çıxış raster qatı giriş xüsusiyyətlərinin qabarıq gövdəsinə kəsiləcək.


Parametrlər

Kümə və kənar analizin aparılacağı nöqtə və ya çoxbucaqlı xüsusiyyət sinfi.

Nəticə sahələrini almaq üçün çıxış xüsusiyyət sinfi.

Rəqəmsal sahə (hadisələrin sayı, cinayət nisbətləri, test balları və s.) Qiymətləndiriləcəkdir.

Hadisə nöqtəsi məlumatlarından təhlil üçün ağırlıqlı xüsusiyyətlər yaratmaq üçün istifadə olunan toplama metodu.

  • Balıq toru içərisindəki hadisələri saymaq - Balıq toru çoxbucaqlı mesh hadisə nöqtəsi məlumatlarını üst-üstə qoyacaq və hər çoxbucaqlı hüceyrədəki hadisələrin sayı sayılacaqdır. Hadisələrin mümkün olduğu yerləri təyin edən Sınaqlı Çoxbucaqlı parametrdə heç bir məhdudlaşdırıcı çoxbucaq verilmirsə, analizdə yalnız ən azı bir hadisəsi olan hüceyrələrdən istifadə ediləcəkdir, əks halda sərhəd poliqonları içərisindəki bütün hüceyrələr analiz ediləcəkdir.
  • Altıbucaqlı şəbəkədəki hadisələri sayın - Altıbucaqlı bir çoxbucaqlı mesh, hadisə nöqtəsi məlumatlarını üst-üstə qoyacaq və hər çoxbucaqlı hüceyrədəki hadisələrin sayı sayılacaqdır. Hadisələrin mümkün olduğu yerləri təyin edən Sınaqlı Çoxbucaqlı parametrdə heç bir məhdudlaşdırıcı çoxbucaq verilmirsə, analizdə yalnız ən azı bir hadisəsi olan hüceyrələrdən istifadə ediləcəkdir, əks halda sərhəd poliqonları içərisindəki bütün hüceyrələr analiz ediləcəkdir.
  • Toplama çoxbucaqlılarındakı hadisələri saymaq - Hadisələri sayımda toplamaq üçün çoxbucaqlılar üçün çoxbucaqlı məlumatların üst-üstə düşməsi üçün birləşmə çoxbucaqlılarını təmin edirsiniz. Hər çoxbucaqlıdakı hadisələr sayılır.
  • Ağırlıqlı nöqtələr yaratmaq üçün yaxınlıqdakı hadisələri çəkin - Yaxınlıqdakı hadisələr tək bir ağırlıqlı nöqtə yaratmaq üçün birlikdə toplanacaq. Hər nöqtə üçün çəki həmin məkanda cəmlənmiş hadisələrin sayındadır.

Hadisənin Giriş Xüsusiyyətlərinin baş verə biləcəyi bir çoxbucaqlı xüsusiyyət sinfi.

Hər çoxbucaqlı xüsusiyyət üçün hadisə sayını almaq üçün hadisə Giriş Xüsusiyyətlərini toplamaq üçün istifadə ediləcək çoxbucaqlar.

Bu analiz bir istinad paylaması yaratmaq üçün permutasiyalardan istifadə edir. Yer dəyişdirmə sayının seçilməsi dəqiqlik və artan işləmə müddəti arasındakı bir tarazlıqdır. Sürətlə dəqiqliyə qarşı seçiminizi seçin. Daha güclü və dəqiq nəticələrin hesablanması daha uzun çəkir.

  • Cəld (199 permütasiya) - 199 permütasiya ilə mümkün olan ən kiçik yalançı p-dəyəri 0,005-dir və bütün digər yalançı p-dəyərlər bu dəyərin hətta qatları olacaqdır.
  • Balanced (499 permutations) - 499 permutations ilə mümkün olan ən kiçik psevdo p-dəyəri 0.002-dir və bütün digər pseudo p-dəyərlər bu dəyərin cüt qatları olacaqdır.
  • Sağlam (999 permütasiya) - 999 permutasiya ilə mümkün olan ən kiçik psevdo p-dəyəri 0.001-dir və digər bütün pseudo p-dəyərlər bu dəyərin bərabər qatları olacaqdır.

Giriş Xüsusiyyətlərini toplamaq üçün istifadə olunan şəbəkə hüceyrələrinin ölçüsü. Altıbucaqlı bir şəbəkəyə toplandıqda, bu məsafə altıbucaqlı çoxbucaqlıları qurmaq üçün hündürlük kimi istifadə olunur.

Analiz qonşuluğunun məkan dərəcəsi. Bu dəyər, yerli klasterləşməni qiymətləndirmək üçün hansı xüsusiyyətlərin birlikdə təhlil edildiyini müəyyənləşdirir.

Kümə və kənar analizin aparılacağı nöqtə və ya çoxbucaqlı xüsusiyyət sinfi.

Nəticə sahələrini almaq üçün çıxış xüsusiyyət sinfi.

Rəqəmsal sahə (hadisələrin sayı, cinayət nisbətləri, test balları və s.) Qiymətləndiriləcəkdir.

Hadisə nöqtəsi məlumatlarından təhlil üçün ağırlıqlı xüsusiyyətlər yaratmaq üçün istifadə olunan toplama metodu.

  • COUNT_INCIDENTS_WITHIN_FISHNET_POLYGONS - Balıq toru çoxbucaqlı mesh hadisə nöqtəsi məlumatlarını üst-üstə qoyacaq və hər çoxbucaqlı hüceyrədəki hadisələrin sayı sayılacaqdır. Bounding_Polygons_Defining_Where_Incidents_Are_Possible parametresində heç bir çoxbucaqlı təmin edilmirsə, əks halda analizdə yalnız ən azı bir hadisəsi olan hüceyrələrdən istifadə ediləcəkdir, əks halda sərhəd poliqonlarının içindəki bütün hüceyrələr analiz ediləcəkdir.
  • COUNT_INCIDENTS_WITHIN_HEXAGON_POLYGONS - Altıbucaqlı bir çoxbucaqlı mesh hadisə nöqtəsi məlumatlarını üst-üstə qoyacaq və hər çoxbucaqlı hüceyrədəki hadisələrin sayı sayılacaqdır. Bounding_Polygons_Defining_Where_Incidents_Are_Possible parametresində heç bir çoxbucaqlı təmin edilmirsə, əks halda analizdə yalnız ən azı bir hadisəsi olan hüceyrələrdən istifadə ediləcəkdir, əks halda sərhəd poliqonları içərisindəki bütün hüceyrələr analiz ediləcəkdir.
  • COUNT_INCIDENTS_WITHIN_AGGREGATION_POLYGONS - Polygons_For_Aggregating_Incidents_Into_Counts parametrində hadisə nöqtəsi məlumatlarını üst-üstə qoymaq üçün toplama çoxbucaqları təmin edirsiniz. Hər çoxbucaqlıdakı hadisələr sayılır.
  • SNAP_NEARBY_INCIDENTS_TO_CREATE_WEIGHTED_POINTS - Yaxınlıqdakı hadisələr tək bir ağırlıqlı nöqtə yaratmaq üçün birlikdə toplanacaq. Hər nöqtə üçün çəki həmin məkanda cəmlənmiş hadisələrin sayındadır.

Hadisənin Input_Features-un baş verə biləcəyi yeri müəyyən edən bir çoxbucaqlı xüsusiyyət sinfi.

Hər çoxbucaqlı xüsusiyyət üçün hadisə sayını almaq üçün hadisənin Input_Features-ı cəmləşdirmək üçün istifadə ediləcək çoxbucaqlar.

Bu analiz bir istinad paylaması yaratmaq üçün permutasiyalardan istifadə edir. Yer dəyişdirmə sayının seçilməsi dəqiqlik və artan işləmə müddəti arasındakı bir tarazlıqdır. Sürətlə dəqiqliyə qarşı seçiminizi seçin. Daha güclü və dəqiq nəticələrin hesablanması daha uzun çəkir.

  • QUICK_199 - 199 permütasiya ilə mümkün olan ən kiçik psevdo p-dəyəri 0.005-dir və bütün digər yalançı p-dəyərlər bu dəyərin hətta qatları olacaqdır.
  • BALANCED_499 - 499 permütasiya ilə mümkün olan ən kiçik yalançı p-dəyəri 0,002-dir və bütün digər yalançı p-dəyərlər bu dəyərin hətta qatları olacaqdır.
  • ROBUST_999 - 999 permütasiya ilə mümkün olan ən kiçik yalançı p-dəyəri 0,001-dir və bütün digər psevdo p-dəyərləri bu dəyərin hətta qatları olacaqdır.

Input_Features toplamaq üçün istifadə olunan şəbəkə hüceyrələrinin ölçüsü. Altıbucaqlı bir şəbəkəyə toplandıqda, bu məsafə altıbucaqlı çoxbucaqların qurulması üçün hündürlük kimi istifadə olunur.

Analiz qonşuluğunun məkan dərəcəsi. Bu dəyər yerli klasterləşdirməni qiymətləndirmək üçün hansı xüsusiyyətlərin birlikdə təhlil edildiyini müəyyənləşdirir.

Kod nümunəsi

Aşağıdakı Python pəncərə skriptində OptimizedOutlierAnalysis alətinin necə istifadə ediləcəyi göstərilir.

Aşağıdakı müstəqil Python skriptində OptimizedOutlierAnalysis alətinin necə istifadə ediləcəyi göstərilir.


Sintaksis

Nöqtə, çoxnöqtəli, sətir, çoxbucaqlı və ya çoxpatch ola bilən giriş xüsusiyyətləri.

Çıxış poliqon xüsusiyyət sinfi.

Çıxış poliqonlarının minimum hədd həndəsəsinin hansı növünü təmsil edəcəyini müəyyənləşdirir.

  • RECTANGLE_BY_AREA - Giriş xüsusiyyətini əhatə edən ən kiçik sahənin düzbucağı. Bu, standartdır.
  • RECTANGLE_BY_WIDTH —Giriş xüsusiyyətini əhatə edən ən kiçik enin düzbucağı.
  • CONVEX_HULL - Giriş xüsusiyyətini əhatə edən ən kiçik qabarıq çoxbucaqlı.
  • CIRCLE — Bir giriş xüsusiyyətini əhatə edən ən kiçik dairə.
  • ENVELOPE — Giriş xüsusiyyətinin zərfi.
Lisenziya:

CONVEX_HULL, CIRCLE və ENVELOPE seçimləri yalnız ArcGIS for Desktop Advanced lisenziyası ilə mövcuddur.

Giriş xüsusiyyətlərinin necə qruplaşdırılacağını, hər qrupun bir çıxış poliqonu ilə əhatə olunacağını müəyyənləşdirir.

  • NONE - Giriş xüsusiyyətləri qruplaşdırılmayacaq. Bu, standartdır. Bu seçim nöqtə girişi üçün mövcud deyil.
  • BÜTÜN - Bütün giriş xüsusiyyətləri bir qrup kimi nəzərdən keçiriləcəkdir.
  • LİSTƏ - Giriş xüsusiyyətləri, göstərilən sahədəki ümumi dəyərlərinə və ya qrup sahəsi parametrindəki sahələrə görə qruplaşdırılacaqdır.

LİSTƏ group_option olaraq təyin edildikdə, xüsusiyyətləri qruplaşdırmaq üçün istifadə ediləcək giriş xüsusiyyətlərindəki sahə və ya sahələr. LIST seçimi üçün ən azı bir qrup sahə tələb olunur. Göstərilən sahə və ya sahələrdə eyni dəyərə sahib olan bütün xüsusiyyətlər bir qrup kimi nəzərdən keçiriləcəkdir.

Çıxış xüsusiyyət sinfində həndəsi atributların əlavə edilməsini və ya çıxış xüsusiyyət sinfində buraxılmayacağını müəyyənləşdirir.

  • NO_MBG_FIELDS —Çıxış xüsusiyyəti sinifindəki hər hansı bir giriş atributunu buraxır. Bu, standartdır.
  • MBG_FIELDS —Çıxış xüsusiyyət sinfinə həndəsi atributları əlavə edir.

Kürənin hədd hüdudlarını hesablamaq, kürə həndəsəsinin sadəliyi nəzərə alınmaqla olduqca əhəmiyyətsizdir.

Fərz edək ki, $ r $ skaler (float və ya tam) dəyər və kürənin ortası $ overrightarrow c $ kimi təyin edilmiş kürənin radiusuna sahibik:

$ overrightarrow c = beginx y z end $

Xarici sərhəd koordinat vektorlarını $ overrightarrow hesablaya bilərik $ və $ overrightarrow $ aşağıdakıları etməklə:

$ başlayın overrightarrow & amp = başlayın c_x - r c_y - r c_z - r end overrightarrow & amp = başlayın c_x + r c_y + r c_z + r end end $

Tercih etsək, eyni şeyi hesablamağın başqa bir yolu, $ overrightarrow vektorunu təyin etməkdir <>>> Sadəcə məhdudlaşdırma qutusunun mərkəzdən bir küncünə qədər olan ofseti əks etdirən əlavə etmək üçün:

$ mətn overrightarrow c = başlamaqx y z end mətn overrightarrow <>>> = başlayın r r r son, başlayın overrightarrow & amp = overrightarrow c - overrightarrow <>>> overrightarrow & amp = overrightarrow c + overrightarrow <>>> end $


Coğrafi Məkan miqyasında İnteraktiv Olunması

SQL Qoşulmaları, xüsusi məlumat bazası əməliyyatıdır. Birləşdirmə, istifadəçiyə bir çox fərqli məlumat dəstini, məsələn, əməliyyat məlumatlarını məhsul SKU'ları ilə və ya müştəri məlumatlarını alış tarixçəsi ilə birləşdirərək dilimləndirməyə və parçalamağa imkan verir. Bənzər nəticələr birləşdirilmədən yaradıla bilər, lakin geniş düz masalar və bəlkə də əvvəlcədən və sonrakı işləmə üçün ağırdır. Düzgün şəkildə həyata keçirilmiş birləşmələr rahatlıq təmin edir, performansı artırır və geniş bir məlumat araşdırmasına imkan verir.

Lakin birləşmələr, tərifə görə, bahalıdır. Birləşdirmə, bir və ya daha çox cədvəldəki sütunları satırlara uyğun bir və ya daha çox predikatlardan istifadə edərək yeni bir cədvəldə birləşdirir. Proqramçılara semantik cəhətdən a-ya bərabər olan QOŞULMA əməliyyatı düşünməsi ibrətamizdir loop üçün. Qeydləri cədvəldən birləşdirən aşağıdakı sorğu verilir t1 və masa t2 predikat sütunundan istifadə etmək a cədvəldə t1 sütuna bərabərdir b cədvəldə t2, yalançı kod yaza bilərik üçün ilmə göstərildiyi kimi:

Belə bir əməliyyat N * M mürəkkəbliyə malikdir, burada N qeydlərin sayıdır t1 və M qeydlərin sayıdır t2. Kiçik masalar üçün bu əhəmiyyətsizdir (xüsusən də GPU-larda). Buna baxmayaraq, böyük masalar və ya mürəkkəb qoşulma predikatları üçün ən güclü tək server sistemlərinin hesablama qabiliyyətini tez bir zamanda aşırıq. Qoşulma optimallaşdırması yaxşı öyrənilmiş bir verilənlər bazası araşdırması sahəsidir və bir çox tanınmış yanaşma yuxarıda ətraflı şəkildə izah edilən “N kvadrat” problemini azaldır. Ümumi bir yanaşma, iki cədvəl arasında tələb olunan uyğunluq testlərinin sayını azaltmaq üçün bir hash masa məlumat quruluşundan istifadə etməkdir. Bu metod, cədvəllərdən birinin üstündə bir hash cədvəli qurur və potensial uyğun sətirlər dəsti əldə etmək üçün döngə hash cədvəlinə baxışla artırılır:

Döngü quruluşu ilk nümunəmizə bənzəyir, hash cədvəli ikinci dövrədəki axtarış sayını əhəmiyyətli dərəcədə azalda bilər. Ən yaxşı halda, hash cədvəli həm daimi vaxt axtarışı, həm də bərabər bərabərlik zəmanəti verə bilər və bu dövrü aşağı salır:

OmniSciDB, həm CPU, həm də GPU-da hash masalarının hərəkətdə qurulması ilə hash qoşulmalarını dəstəkləyir. Birləşmənin bərabərlik predikatının və / və ya ölçüsünün mürəkkəbliyindən asılı olaraq birdən çox hash funksiyası dəstəklənir. Bu gün, hash qoşulmalarından istifadə edərək yerleşim qoşulma suallarını sürətləndirməyi düşünəcəyik.

Bir yerleşim qoşulma sorğusunu birləşdirmə predikatı kimi bir yerleşim operatorundan istifadə edən bir sual olaraq təyin edirik. Bir istifadəçi uzunluq və enlem ilə coğrafi kodlu tweets cədvəlinə sahib ola bilər və tweetin hansı poçt koduna düşdüyünü təyin etmək istəyə bilər - ehtimal ki, Immerse-də göstərilən bir xəritədə tweets poçt kodu ilə rənglənir. Belə bir sorğu aşağıdakı kimi görünə bilər:

(sola qoşulma, kod kodları məlumat dəstlərində uyğun olmayan tvitləri qoruduğunu unutmayın, yəni bir tweet xaric edilmək əvəzinə uyğun poçt kodu olmadığı təqdirdə “NULL” rənginə əlavə ediləcəkdir)

Bir tweetin verilmiş bir poçt kodunun içində olub olmadığını müəyyən etmək üçün tweet yerləşmə nöqtəsini hər bir poçt kodu çoxbucağına qarşı tam şəkildə yoxlamalıyıq. Əksər alqoritmlər hər nöqtəyə qarşı poçt kod poliqonunun hər bir təpəsinin yoxlanmasını tələb edir (bunu etmək üçün bir neçə üsul var, sarma metodundan istifadə edirik). 1 milyon tvitimiz və 33.144 poçt kodumuz olduğunu fərz etsək, hər nöqtəni hər çoxbucaqlı ilə müqayisə etmək 33 milyard müqayisə ilə nəticələnəcəkdir. Orta poçt kodunun 166 zirvəsi olduğundan, 5.501.904.000.000 ümumi müqayisə (5.5 trilyon əməliyyat) üçün daha çox sıfır əlavə edirik. Bu, məlumatları yükləmək, sərhəd şərtlərini yoxlamaq və daha çoxunu həyata keçirmək üçün lazım olan əməliyyatları hesaba almır, belə ki, onu daha aşağı hüdud hesab edə bilərik. Ən son Ampere GPU-ları yuxarıda göstərilən əməliyyatı təxminən 500 saniyəyə qədər həyata keçirən təxminən on teraflopa sahibdir, ancaq tvitlər cədvəlimizi 100 M-ə çatdırsaq, hesablama vaxtını 6 dəqiqəyə qədər görürük. Əksər OmniSci müştəriləri 500 milyondan aşağı milyardlara qədər olan məlumatları istifadə edir və OmniSci-də ən çox sorğu milisaniyədə işləyir. Beləliklə, coğrafi birləşmələri interaktiv etmək üçün bir az optimallaşdırma tətbiq etməliyik.

Bu asanlıqla görünməsə də, yuxarıda müzakirə edilən eyni hash masa texnikasını poçt kodları cədvəlinə tətbiq edə bilərik. Əvvəlcə iki şərt tələb olunur, hash masamızı qurmaq üçün uyğun bir hash funksiyasına ehtiyacımız var. Üstəlik, hash etmək üçün aşağıdakı xassəyə malik bir ifadəyə ehtiyacımız var: ST_Contains doğrudur, əgər hash birləşmə ifadəsi də doğrudursa. Bu mülkü təmin edən üst-üstə düşən adlı yeni bir operator təqdim edirik.

Biz üst-üstə düşür (b, a) və ya a üst-üstə düşür b obyektin hüdud qutusu olduqda doğrudur a obyektin hüdud qutusunu üst-üstə düşür b. Qeyd edək ki, bu operatorun adı daha yaxşı ola bilər Təxminən üst-üstə düşür qısaldılması üçün bu məqalənin sonuna qədər üst-üstə düşəcəyik. Bir nöqtə üçün, məhdudlaşdırıcı qutunun nöqtəyə qədər çökəcəyini düşünürük. Beləliklə əgər a bir nöqtədir və b başqa bir yerleşim obyektidir, üst-üstə düşürsə nöqtə doğrudur a obyektin ətrafındakı məhdudlaşdırıcı qutunun içərisindədir b. İndi ST_Contains-in doğruluğunu sübut edəcəyik və yalnız Çakışmalar doğrudursa. Bir məqamımız olduğunu düşünək a və yerleşim obyekti b və sərhəd qutusu b_box. ST_Contains (b,a) doğrudur (yəni yerleşim obyektidir b nöqtəni ehtiva edir a) və üst-üstə düşmələrini (b,a) yalan (yəni, a üst-üstə düşmür b). Sərhəd qutusu b_box ehtiva edir b tərifə görə. Beləliklə əgər b ehtiva edir a, sonra a üçün məhdudlaşdırıcı qutunun içərisində olmalıdır b. Buna görə a üst-üstə düşür b. Ancaq üst-üstə düşdüyünü düşündük (b,a) yalan idi, buna görə bir ziddiyyətimiz var və ST_Contains (b,a) doğrudur, sonra üst-üstə düşür (b,a) da doğru olmalıdır.

ST_Contains () ifadəsini əvəzləmək üçün bu xassədən istifadə edə bilərikb,a) ikili predikatla üst-üstə düşən sorğuda (b,a) Və ST_Ətrafları (b,a). Sonra üst-üstə düşür (b,a) və birləşmədə müqayisə sayını azaltmaq üçün hash cədvəlindən istifadə edin. Bunu etmək üçün bir hash funksiyasına ehtiyacımız var. Yerleşim cisimlərinin sərhəd qutularını düşünün b. Bütün məhdudlaşdırıcı qutuların birləşməsini götürsək, düzbucaqlı düzəldin və sonra bu bölgəni hər biri eyni ölçüdə olan fərdi qutulara bölsək, hər hansı bir nöqtəni məkan şəklində göstərən bir funksiya yarada bilərik. a zibil qutusuna. Belə funksiyalardan biri, hər bir zibil üçün nöqtə koordinatlarını müvafiq zibil ölçüsünə bölmək və mərtəbə götürməklə hesablanmış bir tam identifikator təyin edir. Yer dolduran əyrilər başqa bir seçimdir. Sadə hash funksiyasını seçdik, çünki giriş məlumatlarımız çeşidlənməyib və sifariş verilməyib və sorğular ümumiyyətlə bir sıra vedrələrə deyil, tək bir vedrəyə yönəlir. Yer dolduran əyrilərin yaddaş yeri xüsusiyyətləri gələcək tədqiqat sahəsidir. Bu funksiya üçün bir hash cədvəli qurmaq üçün hər çoxbucaqlı üçün məhdudlaşdırıcı qutunu götürürük, sərhəd qutusunun üst-üstə düşdüyünü müəyyənləşdiririk və hər qutuya çoxbucaq üçün bir identifikator yazırıq.

Hamısını bir araya gətirərək yeni ifadənin üst-üstə düşməsini birləşdiririk (b, a) Və ST_Ətrafları (b, a) üst-üstə düşən hash cədvəli ilə (b, a). Müəyyən bir nöqtə üçün a, əvvəlcə hash funksiyasını nöqtəyə tətbiq edərək nöqtənin hansı zibil qutusuna aid olduğunu görmək üçün hash masasını yoxlayırıq. Çöp qutusundan çoxbucaqlı şəxsiyyətlərin siyahısını oxuduq. Bu əməliyyat nöqtə üçün üst-üstə düşmələri hesablayır a və bütün çoxbucaqlılar b (şərt biraz daha zəifdir, çünki bir nöqtə çoxbucaqlı ilə eyni zibil qutusunda ola bilər, lakin ikisi üst-üstə düşə bilməz, ancaq bu, məqsədimiz üçün kifayətdir, çünki zibil qutusundakı hər hansı bir çoxbucaqlı nöqtəni ehtiva edə bilməz - - bax Şəkil 1). Bu proses, ST_Contains üçün müqayisələrin ümumi sayını yalnız çoxbucaqlılarla məhdudlaşdırır bilər verilmiş nöqtəni ehtiva edir. Zibil qutuları azdırsa, hər nöqtə üçün lazım olan müqayisə sayını xeyli azalda bilərik. Aşağıdakı psevdokod bu prosesi göstərir:

Bir ifadə ilə başladıq, ST_Contains (b, a) və ifadəni ekvivalent bir ifadəyə yenidən yazın, üst-üstə düşür (b, a) Və ST_Ətrafları (b, a). Daha sonra ifadənin axtarış sahəsini məhdudlaşdırmaq və performansı yaxşılaşdırmaq üçün uyğun bir hash funksiyası və hash masası ilə hash birləşmə çərçivəsini istifadə edə bilərik. Beləliklə, hash masa qurarkən uyğun qutu ölçülərini necə seçirik?

Hash masa ölçüsü, hash cədvəlinin ölçüsü ilə hər zibil qutusundakı qeydlərin sayı arasındakı mübadilədir. Hər zibil qutusundakı qeydlər azdırsa, hər zibil üçün az iş görməliyik, bu yuxarıdakı nümunəmizdə daha az bahalı ST_Contains əməliyyatları deməkdir. Lakin qutular kiçikləşdikcə daha çox qutu eyni ərazini əhatə etməli, hash masasının qurulma müddətini və ölçüsünü artırmalıdır. Alqoritmimiz (şəkil 2-yə baxın) maksimum ölçüyə qapanmış az zibil qutusu olan bir hash masa axtarır. Axtarışı & quotbin eşiği üzərində parametrləşdiririk və hash cədvəlində icazə verəcəyimiz minimum qutu ölçüsünü & quot; Tüner, xaş cədvəlimizə əlavə etmək istədiyimiz bütün məhdudlaşdırıcı qutuların üstündən təkrarlayaraq zibil qutusunun başlanğıcını başlayır və hər bir ölçüdəki hüdud qutusunun ölçüsünü cari qutu həddindən az, lakin cari olduqdan böyük olduqda təyin edir. seçilmiş qutu ölçüsü, bunu yeni qutu ölçüsü olaraq qəbul edirik. Zibil qutusunun həddini endirərək həm hash masa ölçüsü, həm də zibil qutusu daxilində sistematik olaraq axtarış apara bilərik.

Sazlama prosesinin bir addımını təfərrüatlı şəkildə keçəcəyik. Hər addım bir ölçülü zibil qutusu ölçülərini hesablayır (çərçivə hazırda yalnız iki ölçülü zibil qutusunu dəstəkləyir, lakin təsadüfi ölçülü dəstəkləmək üçün qurulub). Hesablanmış zibil ölçülərindən ümumi qarışıq cədvəlinin ölçüsünü və orta zibil qutusu ölçüsünü hesablaya bilərik. Sazlamaya davam edib etməyəcəyimizə qərar vermək üçün hesablanmış ölçü və doluluqdan istifadə edirik. Əvvəlcə hash cədvəlinin çox böyük olub olmadığını görərik. Qarışıq cədvəli çox böyüyübsə, əvvəlcədən təyin olunmuş eşik dəyərini / qutu ölçülərini istifadə edirik. Ancaq əvvəlki heç bir dəyər yoxdursa, ehtimal ki, zibil qutusunun ölçüsünü aşmışıq və daha əhəmiyyətli bir eşik seçməliyik. Bu vəziyyətdə, alqoritm özünü tərsinə çevirir və ölçü hüdudu altında bir hash masa oluncaya qədər daha böyük qutuları seçir. Qalan iki hal sadədir. Çöp başına açarlar, dolulma ölçüsüdür, yəni verilən qutunun üst-üstə düşdüyü neçə məhdudlaşdırıcı qutu (ümumilikdə). Zibil qutusundakı düymələr artmaqdadırsa və ya hər qutu həddinə çatmışıqsa, daha böyük bir hash cədvəlinin ölçüsü xərclərinin daha çox doldurma qazancını üstələyəcəyini düşünərək alqoritmi sonlandırırıq və əvvəlki təkrarlamanın dəyərlərindən istifadə edirik.

Alqoritm axtarış prosesini və zibil qutusu ilə qarışıq cədvəl ölçüsü arasındakı qarşıdurmanı göstərmək üçün bir neçə təcrübə aparmışıq. Aşağıdakı təcrübələrdə Twitter və # x27s public API-nin (& quottweets & quot cədvəli) coğrafi etiketli qeydləri olan bir sol masadan istifadə olunur. İkiqat NVIDIA RTX 2080 GPU ilə AMD Threadripper 2950X istifadə etdik. Tvitlər, hər iki GPU-da bərabər şəkildə bölünən standart fraqment ölçüsü ilə yükləndi (fraqment başına 32M sətir). Əlavə optimallaşdırma tətbiq edilmədi. Amerika Birləşmiş Ştatlarında üç çoxbucaqlı cədvəl bölgəsindən (bütün çoxbucaqlılar arasında 7.944.863 ümumi təpə ilə 3.233 sətir), ABŞ-dakı poçt kodlarından (52.210.207 cəmi zirvələri olan 33.144 sətir) və Amerika Birləşmiş Ştatlarında siyahıyaalma bloklarından (67.581.813 ümumi köşə ilə 220.740 sıra) istifadə etdik. Sorğu, tweets cədvəli ilə əlaqəli çoxbucaqlı cədvəl arasında sol birləşmə idi və məlumatların başlanğıc disk götürülməsini aradan qaldırmaq üçün ilk qaçış xaric edildi.Proeksiyada filtrləri olmayan bir sayma aqreqatı istifadə etdik.Hər bir təcrübə üçün məlumatlar aşağıdakı rəqəmlərdə.

Bütün təcrübələr, hər bir parametr üçün hədəf açarını təyin etmək və nəticədə qarışıq cədvəlindən istifadə edərək xaş cədvəlinin ölçüsünü, qurma vaxtını və sorğunun icra müddətini təyin etməkdən ibarət idi. Bu rəqəmlərdən istifadə edərək alqoritmin müxtəlif parametrlərdə necə davrandığını və qarışıq cədvəli ölçüsü ilə zibil qutusu arasındakı qarşıdurmanın hash cədvəl qurma vaxtı və sorğu icrası üçün nə demək olduğunu başa düşə bilərik.

Ümumiyyətlə, nəticələr göstərir ki, hash cədvəli böyüdükcə qurma müddəti xeyli bahalaşır və icra müddəti orta dərəcədə azalır, eyni qalır və ya hətta arta bilər. ABŞ-ın Tweet-lərdəki rəqəmləri y oxunda vaxt göstərir, gördük ki, qurma müddəti qırmızı nöqtəli xəttin solunda, hər qutu üçün nisbətən aşağı düymələrdə vəhşicəsinə tərpənir. Haş cədvəlinin ölçüsündə müvafiq rəqsləri də görürük. Şəkil 4 (aşağıda) seçilmiş qutu eşiklərini Şəkil 3 (b) -də göstərildiyi kimi hər bir qab üçün eyni hədəf düymələrinə qarşı qurmuşdur. Ağlabatan bir gözlənildiyi kimi, ən böyük hash masası ən kiçik qutu ölçüsünə cavab verir. Lakin dolğunluq və qarışıq masası ölçüsü bu kiçik qutu ölçüləri ilə əlaqəli görünmür.

Bu korrelyasiyanı (və ya korrelyasiyanın olmamasını) anlamaq üçün tənzimləmə qərarları vermək üçün tənzimləmə alqoritminə qayıdırıq, hər addım üçün yeni qutu ölçüləri seçməliyik. Əvvəlki zibil ölçüsünün sabit bir addım ilə azaldılması və yeni eşik altında ən böyük məhdudlaşdırıcı qutu ölçüsünün tapılması, ölçüyə görə yeni zibil ölçüsünü təyin edir. Bu şəkildə alqoritm ən azı bir məhdudlaşdırıcı qutunun təxminən bir zibil qutusuna sığmasını təmin edərək fərqli ölçülü məhdudlaşdırıcı qutulardan keçir. Təcrübədə, bu, əsas həndəsə ilə uyğun gəlməyən sabit bir ölçü ilə ölçülən qab ölçülərindən çəkinir (əsasən altdakı həndəsənin vahidləri koordinat sisteminə görə dəyişə bilər). Zibil ölçüsü seçicisini qarışıq cədvəli ölçüsü və hər ölçmə ölçüsü başına düymələrlə birləşdirərək, yığma müddətlərini nəzarətdə saxlamaq üçün hər bidon düyməsindən istifadə edərək icra müddətini minimuma endirə bilərik. Həqiqətən, standart həll ya da Şəkil 2-də optimal nisbətdədir.

Zibil qutuları kiçildikdə nə olur? Kiçik miqyaslı zibil qutusundakı cüzi bir dəyişiklik, hash masa ölçüsündə dramatik bir fərqlə nəticələnir. Kiçik qutu ölçüsü adətən bir çox addımın nəticəsidir, çünki alqoritm mövcud məlumatlara əsaslanaraq qutu ölçülərini axtarır və sabit bir addım ölçüsü ilə hər təkrarlanmada daha kiçik məhdudlaşdırıcı qutuları seçir. Bənzər ölçülü məhdudlaşdırıcı qutulardan keçdiyimiz zaman hər qab dolusu metrikində düymələr dəyişir. Birdən, daha kiçik bir məhdudiyyət qutusuna atlandıq, bu hash masa ölçüsünün kəskin şəkildə artmasına və əvvəlki iterasiyada alqoritmi sonlandıran doluluğun dəyişdirilməsinə səbəb olur (bax Şəkil 4b). Əslində, zibil qutusu ölçüsü, məlumat qutusundakı “orta” hədd qutusunun ölçüsündən xeyli kiçik olan qutulara “düşməyimizi” qarşısını alır.

Xülasə olaraq, təcrübələrimiz göstərir ki, doldurma metriki tənzimləmə alqoritminə, təcrübə qrupumuzdan xeyli kiçik ola biləcək məhdudlaşdırıcı qutular qrupuna & aşağıya köçürmək & quot səbəbindən hash masa ölçüsündə dramatik dəyişikliklərin qarşısını almağa kömək edir. Təcrübə ilə müəyyən edilmiş minimum doluluq həddini dolğunluq meyli ilə birləşdirərək, qarışıq cədvəlinin ölçüsünün sifarişlər səviyyəsində arta biləcəyi qeyri-sabit bir bölgəyə düşmədən sazlamanı düz bir şəkildə böyük bir qarışıq masasının kənarında ləğv edə bilərik (az qutu dolusu və yaxşı performans veririk). böyüklük və ya oxşar doldurma göstəricilərində vəhşicəsinə salınır. Bu alqoritm güclü nəticələr əldə etsə də, əlavə optimallaşdırmalar mümkündür. Müəyyən bir dolma həddi üçün qarışıq cədvəlinin ölçüsünü maksimuma çatdırmaq və əsassız bir qurma vaxtı yaratmadan sorğu icra müddətini maksimuma çatdıran bir doluluq həddini seçmək üçün optimallaşdırma problemini həll etmək istəyirik. Bir həll yolu yaxınlaşdırmaq üçün ilk cəhdimizi düşünün.

Paralelliyi artırmaq və üst-üstə düşmə qoşulma yanaşmamızın performansını artırmaq üçün əlavə optimallaşdırmalara baxsaq da, böyük coğrafi birləşmələrin interaktiv və ya interaktivə yaxın performans səviyyələrinə gətirilməsinin onsuz da böyük bir faydası var. Bir maşın üzərində, 2 Nvidia RTX 3090 GPU ilə üst-üstə düşən dövrlər, müxtəlif misallarda 200 ilə 1200X arasındakı dövrə birləşməsində artan performansı birləşdirir və bu, ABŞ tweetlərinin ABŞ siyahıyaalma blok qruplarına saniyədə 11.3K axtarışdan loop ilə birləşdirilməsini ən həddindən artıq artırır. üst-üstə qoşulmaqla saniyədə 22.38M axtarışlara qoşulun. Nəhayət, əlavə sürətlənmələrin mümkün olduğuna inanırıq. Məsələn, məlumatları sifariş etmək və boşlaşdırmaq üçün boşluq doldurma əyrilərindən istifadə edən təcrübələr, məkan lokallığını artırmaq və qarışıq birləşməsinin prob mərhələsində icra fərqliliyini azaltmaqla əlavə 3-4x performans əldə etmək potensialını təklif edir. bu ön.

Çoxbucaqlı birləşmələrdə nöqtə yuxarıda göstərilən üsulların yalnız bir nümunəsidir. Ümumi OVERLAPS operatoru, məkan və müvəqqəti sorğular (və ya ikisinin kombinasiyası) daxil olmaqla müxtəlif sorğulara tətbiq olunur. In general, two broad applications emerge queries requiring an algorithm to construct the hash table and queries that dictate the construction of the hash table based on the predicate defining the OVERLAPS relationship in the query. We have implemented distance joins between geospatial points as an example of the latter type if a user requests all points within N units of each other, we can construct the hash table such that a simple search of neighboring bins is always guaranteed to return the points which might be within N units of each other. While we are in the early stages of productionizing these techniques, the point in polygon join is available in OmniSci as of version 5.6 across all product modalities, including desktop, OmniSci Free, and the Enterprise Edition.

Alex Baden is the Technical Director leading the Query Engine team at OmniSci. Prior to OmniSci, he was a graduate student at Johns Hopkins University, studying computer science and developing terabyte scale databases and visualization tools, optimized for range queries across three dimensional image datasets. He has contributed code to various open source projects across the big data landscape and has worked with organizations such as the Allen Institute for Brain Science to develop tools for the analysis of large and complex datasets. He holds a MSE in Computer Science from Johns Hopkins University and a BS in Mathematics from the University of Maryland.


Videoya baxın: Test toplusu. Çoxbucaqlılar. Dördbucaqlılar. Qabarıq çixbucaqlı. Düzgün çoxbucaqlı. (Oktyabr 2021).