{"id":33793,"date":"2019-10-31T21:54:42","date_gmt":"2019-10-31T18:54:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\/"},"modified":"2019-10-31T21:54:42","modified_gmt":"2019-10-31T18:54:42","slug":"bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","title":{"rendered":"Bitmap-indeksid Go-s: metsik kiirus","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/86ef928e6741022b2c0e5885a031408a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Sissejuhatus<\/h2>\n<p>\nEsitasin selle ettekande inglise keeles GopherCon Russia 2019 konverentsil Moskvas ja vene keeles mitmal korral Nizhni Novgorodis. R\u00e4\u00e4gin bitmap-indeksist \u2014 v\u00e4hem levinud kui B-puu, kuid mitte v\u00e4hem huvitav. Jagame <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/WvlUH6MjUuI?list=PL3xVZC4USRNSO_kb2lh_J_no6C-KJ7Phg\">salvestust<\/a><\/noindex> konverentsiettekandest inglise keeles ja skripti vene keeles.<\/p>\n<p>K\u00fclastame, kuidas bitmap-indeks t\u00f6\u00f6tab, millal see on parem ja millal halvem kui teised indeksid ning millal on see neist m\u00e4rkimisv\u00e4\u00e4rselt kiirem; n\u00e4eme, millistes populaarsetes DBMS-ides on juba bitmap-indeksid; proovime kirjutada enda oma Go-s. Ja \"magustoiduks\" kasutame valmis teeke, et luua oma superkiire spetsialiseeritud andmebaas.<\/p>\n<p>Loodan v\u00e4ga, et minu t\u00f6\u00f6tooted on teile kasulikud ja huvitavad. Olgu alustame!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Sissejuhatus<\/h2>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"WvlUH6MjUuI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/WvlUH6MjUuI\/hqdefault.jpg\" alt=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/bitmapindexes\">http:\/\/bit.ly\/bitmapindexes<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mkevac\/gopherconrussia2019\">https:\/\/github.com\/mkevac\/gopherconrussia2019<\/a><\/noindex><\/p>\n<p>Tere k\u00f5igile! Praegu on kell kuus \u00f5htul, me k\u00f5ik oleme v\u00e4sinud. Suurep\u00e4rane aeg r\u00e4\u00e4kida igavast andmebaasi indeksite teooriast, eks? \u00c4rge muretsege, mul on siin ja seal paar rida l\u00e4htekoodi. \ud83d\ude42<\/p>\n<p>Kui t\u00f5siselt r\u00e4\u00e4kida, siis ettekand praktiliselt uputab meid informatsiooniga, ja meil ei ole palju aega. Seega, alustame.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/e778e13727700f0335a4b5558a0d8db3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u00e4na r\u00e4\u00e4gin j\u00e4rgmistest teemadest:<\/p>\n<ul>\n<li>mis on indeksid;\n<\/li>\n<li>mis on bitmap-indeks;\n<\/li>\n<li>kus seda kasutatakse ja kus seda EI KASUTATA ja miks;\n<\/li>\n<li>lihtne teostus Go keeles ja veidi v\u00f5itlust kompilaatoriga;\n<\/li>\n<li>veidi v\u00e4hem lihtne, kuid palju t\u00f5husam teostus Go-assembleris;\n<\/li>\n<li>bitmap-indeksite 'probleemid';\n<\/li>\n<li>olemasolevad rakendused.\n<\/li>\n<\/ul>\n<h2>Mis on siis indeksid?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/b80e5b990c44814afe9150a9a82351fd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIndeks on eraldi andmestruktuur, mida hoiame ja uuendame koos peamistest andmetest. Seda kasutatakse otsingu kiirendamiseks. Ilma indeksiteta n\u00f5uaks otsing t\u00e4ielikku andmete l\u00e4bivaatamist (protsess, mida nimetatakse t\u00e4isakaane skaneerimiseks), ja selle protsessi keerukus on lineaarne. Kuid andmebaasid sisaldavad tavaliselt tohutult palju andmeid ja lineaarne keerukus on liiga aeglane. Ideaalis sooviksime logaritmilist v\u00f5i konstantset keerukust.<\/p>\n<p>See on tohutu keeruline teema, mis on t\u00e4is n\u00fcansse ja kompromisse, kuid vaadates mitme aastak\u00fcmne arendust ja uurimist erinevates andmebaasides, olen valmis v\u00e4itma, et on vaid paar laialdaselt kasutatavat l\u00e4henemist andmebaasi indeksite loomisele.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/08a74dbb365035cd99bc94d72644a1b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEsimene l\u00e4henemine seisneb otsinguala hierarhilises v\u00e4hendamises, jagades otsinguala v\u00e4iksemateks osadeks.<\/p>\n<p>Tavaliselt teeme seda erinevat t\u00fc\u00fcpi puude abil. N\u00e4iteks v\u00f5ib see olla suur kast materjalidega teie kapis, kus on v\u00e4iksemad kastid, mis on jagatud erinevateks teemadeks. Kui teil on materjale vaja, otsite neid kindlasti kastist, mille peal on kiri \u201eMaterjalid\u201c, mitte sellest, mille peal on kirjutatud \u201eK\u00fcpsised\u201c, eks?<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/423fac47c748980b18af434644af4dae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeine l\u00e4henemine on kohe vajalik elemendi v\u00f5i elementide r\u00fchma tuvastamine. Me teeme seda hash-kaartide v\u00f5i p\u00f6\u00f6rdkataloogide abil. Hash-kaartide kasutamine on v\u00e4ga sarnane eelnevale n\u00e4itele, ainult et teie kapis on hunnik v\u00e4ikseid karpe l\u00f5ppartiklitega, mitte kastid karpidega.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/088fed0a2a0feea4a23edbf0ca654805.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKolmas l\u00e4henemine on eemaldada vajadus otsimise j\u00e4rele. Seda teeme Bloom-filterite v\u00f5i cuckoo-filterite abil. Esimesed annavad vastuse viivitamatult, vabastades teid otsimise vajadusest.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/493bc4f20baacc0a5dc0faf15cc46285.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViimane l\u00e4henemine seisneb k\u00f5ikide kaasaegse riistvara pakkumiste t\u00e4ielikus kasutamises. Just seda teeme bitmap-indeksite abil. Jah, nende kasutamise puhul peab meil m\u00f5nikord kogu indeks l\u00e4bi k\u00e4ima, kuid teeme seda superefektiivselt.<\/p>\n<p>Nagu ma juba \u00fctlesin, on andmebaasi indeksite teema ulatuslik ja t\u00e4is kompromisse. See t\u00e4hendab, et m\u00f5nikord saame kasutada mitut l\u00e4henemist koos: kui peame otsingu veelgi kiiremaks muutma v\u00f5i kui on vaja katta k\u00f5ikv\u00f5imalikud otsingut\u00fc\u00fcbid.<\/p>\n<p>T\u00e4na r\u00e4\u00e4gin ma k\u00f5ige v\u00e4hem tuntud l\u00e4henemisviisist \u2014 bitmap-indeksite kohta.<\/p>\n<h2>Kes ma olen, et sellest r\u00e4\u00e4kida?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/42a9d17a507c392bc202254a92dfaf41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOlen Badoo tiimijuht (v\u00f5ib-olla tunnete te paremini meie teist toodet \u2014 Bumble). Meie hulgas on juba \u00fcle 400 miljoni kasutaja \u00fcle kogu maailma ning palju funktsioone, mis aitavad neil leida parima paari. Teeme seda kohandatud teenuste abil, mis kasutavad sealhulgas ka bitmap-indekseid.<\/p>\n<h2>Mis siis ikkagi on bitmap-indeks?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/14f20f3697a20c02f6b3510dc7f0ae4d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBitmap-indeksid, nagu nimi viitab, kasutavad bitmap'e ehk bitisette, et ellu viia otsinguindeks. Lindude k\u00f5rguselt n\u00e4eb see indeks v\u00e4lja nagu \u00fcks v\u00f5i mitu sellist bitmap'i, mis kujutavad erinevaid entiteete (nt inimesi) ja nende omadusi v\u00f5i parameetreid (vanus, silmade v\u00e4rv jms), ning algoritm, mis kasutab bititehteid (AND, OR, NOT) otsingu p\u00e4ringute vastamiseks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/f815720330a51b1f0798e45d23160d3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMeile \u00f6eldakse, et bitmap-indeksid sobivad k\u00f5ige paremini ja on v\u00e4ga t\u00f5husad juhtudel, kui otsing \u00fchendab p\u00e4ringuid paljude v\u00e4he arvu saavutavate veergude kaudu (kujuta ette \"silmade v\u00e4rv\" v\u00f5i \"peresituatsioon\" v\u00f5rreldes millegagi nagu \"kaugus kesklinnast\"). Kuid hiljem n\u00e4itan, et need t\u00f6\u00f6tavad suure arvn\u00e4itajaga veergude puhul samuti suurep\u00e4raselt.<\/p>\n<p>Vaadakem k\u00f5ige lihtsamat bitmap-indeksi n\u00e4idet.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/33fe23476e0931c10345d7175b83d68b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKujutage ette, et meil on nimekiri Moskvast restoranidest, millel on binaarsed omadused nagu:<\/p>\n<ul>\n<li>l\u00e4hedal metroo (near metro);\n<\/li>\n<li>privaatne parkimine (has private parking);\n<\/li>\n<li>terrass (has terrace);\n<\/li>\n<li>on v\u00f5imalik broneerida laud (accepts reservations);\n<\/li>\n<li>sobib taimetoitlastele (vegan friendly);\n<\/li>\n<li>kallis (expensive).\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/fcbad539ea12f79a9d06966ce308637e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAnname igale restoranile j\u00e4rjestusnumber, alates 0, ja eraldame m\u00e4lu 6 bitmapi jaoks (\u00fcks iga omaduse jaoks). Siis t\u00e4idame need bitmapi s\u00f5ltuvalt sellest, kas restoran omab antud omadust v\u00f5i mitte. Kui restoranil 4 on terrass, siis bit \u21164 bitmapi \u00abon terrass\u00bb asetatakse v\u00e4\u00e4rtuseks 1 (kui terrassi pole, siis 0).<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/3709c426617d4364f392ee6b68f92b00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00fc\u00fcd on meil k\u00f5ige lihtsam bitmap-indeks, mida saab kasutada vastamiseks p\u00e4ringutele nagu:<\/p>\n<ul>\n<li>\u201eN\u00e4ita mulle restorane, mis sobivad taimetoitlastele\u201d;\n<\/li>\n<li>\u201eN\u00e4ita mulle soodsaid restorane terrassiga, kus saab laudadele broneerida\u201d.\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/90acb0f890686bd52c3db1fc667f0b0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/0fd0b7fe9f7b7039022ad5c79fe873bc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuidas? Vaatame. Esimene p\u00e4ring on v\u00e4ga lihtne. K\u00f5ik, mida meil vaja on, on v\u00f5tta bitmap \u00absobib taimetoitlastele\u00bb ja muuta see restoranide nimekirjaks, mille bitid on aktiivsed.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ef4a5cfd658ff4ef8bc0c638c4522d11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/9cc175bae55c16018fdf5ff95517a61a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTeine p\u00e4ring on natuke keerulisem. Peame rakendama bititehet NOT bitmapi \"kallis\" kasutamiseks, et saada nimekiri soodsamate restoranide kohta, seej\u00e4rel ANDime selle \"broneeritava kaupluse\" bitmapiga ja ANDime tulemuse \"on terrass\" bitmapiga. Saadud bitmap sisaldab k\u00f5iki meie kriteeriume vastavaid asutusi. Antud n\u00e4ites on see ainult restoran \"Noorus\".<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/f1cdda0cbf7f15278553899cf876c17e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/126b50e0f622b6e36c461cd74e708c38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSiin on palju teooriat, kuid \u00e4rge muretsege, peagi n\u00e4eme koodi.<\/p>\n<h2>Kus kasutatakse bitmap-indekseid?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/406132236c71a4f66ae79957b6e633b3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKui otsite \"bitmap-indekseid\", on 90% vastustest seotud Oracle DB-ga. Kuid teised andmebaasi haldustarkvarad toetavad kindlasti ka selliseid \u00e4gedaid asju, eks? Mitte p\u00e4ris. <\/p>\n<p>Vaatame peamiste kahtlusaluste nimekirja.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/d18d66451a8a26b0ddf121f8ec0204cd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMySQL ei toeta veel bitmap-indekseid, kuid on olemas ettepanek selle valiku lisamiseks (<noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/worklog\/task\/?id=1524\">https:\/\/dev.mysql.com\/worklog\/task\/?id=1524<\/a><\/noindex>).<\/p>\n<p>PostgreSQL ei toeta bitmap-indekseid, kuid kasutab lihtsaid bitmape ja bititehteid, et \u00fchendada otsingu tulemusi mitme teise indeksi kaudu.<\/p>\n<p>Tarantoolil on bitset-indeksid, see toetab nendega lihtsat otsingut.<\/p>\n<p>Redisel on lihtsad bitiv\u00e4ljad<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/commands\/bitfield\"> (https:\/\/redis.io\/commands\/bitfield<\/a><\/noindex>) ilma nende otsimisv\u00f5imaluseta.<\/p>\n<p>MongoDB ei toeta veel bitmap-indekseid, kuid on olemas ettepanek selle v\u00f5imaluse lisamiseks. <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1723\">https:\/\/jira.mongodb.org\/browse\/SERVER-1723<\/a><\/noindex><\/p>\n<p>Elasticsearch kasutab bitmap'e sees.<noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/blog\/frame-of-reference-and-roaring-bitmaps\"> (https:\/\/www.elastic.co\/blog\/frame-of-reference-and-roaring-bitmaps<\/a><\/noindex>).<\/p>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/232d335963603d6e6dec98839fc9f486.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Kuid meie majas on uus naaber: Pilosa. See on uus mitte-relineeriv andmebaas, kirjutatud Go keeles. See sisaldab ainult bitmap-indekseid ja p\u00f5hineb t\u00e4ielikult nende peal. R\u00e4\u00e4gime sellest hiljem.\n<\/li>\n<\/ul>\n<h2>Rakendus Go-s<\/h2>\n<p>\nAga miks on bitmap-indeksid nii harva kasutusel? Enne kui vastan sellele k\u00fcsimusele, tahaksin n\u00e4idata teile v\u00e4ga lihtsa bitmap-indeksi rakendust Go-s.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ae7f4c1a4a740fe709b05dfaee27ac9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBitmap'id on p\u00f5him\u00f5tteliselt lihtsalt andmeosad. Go-s kasutame selleks baitide arvutust\u00fckke.<\/p>\n<p>Meil on \u00fcks bitmap iga restorani omaduse kohta, ja iga bit bitmap'is n\u00e4itab, kas konkreetses restoranis on see omadus v\u00f5i mitte.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/1ab628ee15887d6b3c6c99855aa610c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMe vajame kahte abifunktsiooni. \u00dcks neist kasutatakse meie bitikaartide t\u00e4itmiseks juhuslike andmetega. Juhuslike, kuid teatud t\u00f5en\u00e4osusega, et restoranil on iga omadus. N\u00e4iteks arvan, et Moskvas on v\u00e4ga v\u00e4he restorane, kus ei saa broneerida lauda, ja mulle tundub, et umbes 20% kohtadest sobib taimetoitlastele.<\/p>\n<p>Teine funktsioon muudab bitikaardi restoranide nimekirjaks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ab9c87a0ba63750116e2e7968f842a9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/498cf7a33611d99b90197d4ee82e2834.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00fcsimusele \u00abN\u00e4ita mulle odavaid restorane, kus on terrass ja kus saab broneerida lauda\u00bb vastamiseks vajame kahte bititehnikat: NOT ja AND.<\/p>\n<p>Me saame oma koodi veidi lihtsustada, kasutades keerukamat AND NOT operatsiooni.<\/p>\n<p>Meil on iga\u00fcks neist operatsioonidest kohta funktsioonid. M\u00f5lemad l\u00e4bivad viisil p\u00f5hjalikult, v\u00f5tavad iga\u00fche vastavad elemendid ja \u00fchendavad need bititehnikaga ning paneb tulemuse tulemuste viisi.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ec5652a34f0370dfb03df199f341f153.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00fc\u00fcd saame kasutada oma bitikaarte ja funktsioone, et vastata otsingup\u00e4ringule.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/cf9500ccfe75995a6008191c16729689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJ\u00f5udlus ei ole kuigi k\u00f5rge, kuigi funktsioonid on v\u00e4ga lihtsad ja me s\u00e4\u00e4stsime kenasti, kuna me ei tagastanud uut tulemuste massi igal funktsiooni kutsumisel.<\/p>\n<p>Tehes natuke profiliseerimist pprof'iga, m\u00e4rkasin, et Go kompilaator j\u00e4ttis \u00fche v\u00e4ga lihtsa, kuid v\u00e4ga olulise optimeerimise vahele: funktsiooni sisenemine.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/9092f5ba3940d0a4f3fbfa90b364d716.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAsi on selles, et Go kompilaator kardab kohutavalt silmusid, mis k\u00e4ivad massiivide kaudu, ja keelab resoluutselt funktsioonide sisenemise, mis sisaldavad selliseid silmuseid.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/d1bddd62b61b367dd1f680f223fa0ce7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAga mina ei karda ja saan petta kompilaatorit, kasutades goto ts\u00fckli asemel, nagu vanad head ajad.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/5b1c3cb26b923972686047910ecd1c31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/1ca31d12dc90931b674c6a86a4ea23bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa nagu n\u00e4ete, kompilaator r\u00f5\u00f5muga siseneb meie funktsiooni! L\u00f5puks \u00f5nnestub meil kokku hoida umbes 2 mikrosekundit. Mitte paha!<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/bdd6735d16082573e600bffe2cdd5662.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeise kitsaskoha v\u00f5ib kergesti m\u00e4rgata, kui vaadata assembleri v\u00e4ljundit hoolikalt. Kompilaator lisas piiride kontrolli otse meie k\u00f5ige kuumemasse ts\u00fcklisse. Asi on selles, et Go on turvaline keel; kompilaator kardab, et minu kolm argumenti (kolm slicet) v\u00f5ivad olla erineva suurusega. Sel juhul oleks teoreetiliselt v\u00f5imalik nii-\u00f6elda puhverdus\u00fclekoormus.<\/p>\n<p>Rahu nimel, n\u00e4itame kompilaatorile, et k\u00f5igil slicetel on sama suurus. Saame selle saavutada, lisades meie funktsiooni algusesse lihtsa kontrolli.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/59b4ce687a11dd653e9f12fc3130d89a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSeda n\u00e4hes laseb kompilaator kontrolli r\u00f5\u00f5muga m\u00f6\u00f6da ning me s\u00e4\u00e4stame l\u00f5puks veel 500 nanosekundit.<\/p>\n<h2>Suured partiid<\/h2>\n<p>\nOkei, me suutsime okkar midagi meie lihtsast rakendusest v\u00e4lja pigistada, kuid see tulemus on tegelikult palju hullem, kui praeguse rauaga v\u00f5imalik oleks.<\/p>\n<p>K\u00f5ik, mida me teeme, on p\u00f5hilised bititehingud, ja meie protsessorid t\u00e4idavad neid v\u00e4ga efektiivselt. Kahjuks \"toidame\" meie protsessorit v\u00e4ga v\u00e4ikeste t\u00f6\u00f6osadega. Meie funktsioonid t\u00f6\u00f6tlevad tehinguid byte kaupa. Saame oma koodi v\u00e4ga lihtsalt h\u00e4\u00e4lestada, et see t\u00f6\u00f6taks 8-baidiste t\u00fckkidega, kasutades UInt64 l\u00f5ike.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/8d1b60ba4b7046c836601631cadd0b6a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNagu n\u00e4ete, kiirendas see v\u00e4ike muudatus meie programmi kaheksa korda, suurendades partii suurust kaheksa korda. Kasu on \u00fctleme, lineaarne.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/0fc663412d04dd38b927de5c8776f69d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Rakendamine assembleris<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/b3ef133167b89da983356b1c7389aecd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAga see ei ole veel l\u00f5pp. Meie protsessorid saavad t\u00f6\u00f6tada t\u00fckkidega, mis on 16, 32 ja isegi 64 baiti. Selliseid \u201elaiade\u201c tehingute nimetatakse single instruction multiple data (SIMD; \u00fcks k\u00e4sk, palju andmeid), ja protsessi, mille k\u00e4igus kood muudetakse nii, et see kasutab selliseid tehinguid, nimetatakse vektoreerimiseks.<\/p>\n<p>Kahjuks ei ole Go kompilaator kaugeltki vektoreerimise meister. Praegu on ainus viis Go koodi vektoreerida, v\u00f5ttes ja asetades andmed tehingud k\u00e4sitsi, kasutades Go assemblerit.<\/p>\n<p><img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/91278be45df67e1f9572d68fab7ebad1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGo assembler on kummaline loom. Te t\u00f5en\u00e4oliselt teadsite, et assembler on midagi, mis on tugevalt seotud arvuti arhitektuuriga, mille jaoks te kirjutate, kuid Go puhul ei ole see nii. Go assembler sarnaneb pigem IRL (vahe-representatsioonikeel) v\u00f5i vahekeelele: see on praktiliselt platvormist s\u00f5ltumatu. Rob Pike esitas sellel teemal suurep\u00e4rase <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KINIAgRpkDA\">ettekanne<\/a><\/noindex> k\u00f5ne paar aastat tagasi GopherCon'il Denvers.<\/p>\n<p>Lisaks sellele kasutab Go ebatavalist Plan 9 formaati, mis erineb tunnustatud AT&amp;T ja Intel formaatidest.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/526f75eb18edfc2f851f2725e9d6f69e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00f5ib julgelt \u00f6elda, et Go assembleri k\u00e4sitsi kirjutamine ei ole k\u00f5ige l\u00f5busam tegevus.<\/p>\n<p>Kuid \u00f5nneks on juba olemas kaks k\u00f5rgema taseme t\u00f6\u00f6riista, mis aitavad meil Go assemblerit kirjutada: PeachPy ja avo. M\u00f5lemad utiliidid genereerivad Go-assemblerit k\u00f5rgema taseme koodist, mis on kirjutatud vastavalt Pythonis ja Go's.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/b8a7aa2c585b805e9b1f2ada186b84e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNeed utiliidid lihtsustavad selliseid asju nagu register allocation (protsessoriregistri valimine), ts\u00fcklite kirjutamine ja muudavad \u00fcldiselt Go assembleri maailma sisenemise protsessi lihtsamaks.<\/p>\n<p>Kasutame avo't, nii et meie programmid on peaaegu tavalised Go programmid.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/128e4adef14e5f2cf00fb5b6302ef58e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNii n\u00e4eb v\u00e4lja k\u00f5ige lihtsam n\u00e4ide avo-programmist. Meil on funktsioon main(), mille sees on defineeritud funktsioon Add(), mille eesm\u00e4rk on kahe numbri liitmine. Siin on ka abifunktsioonid parameetride saamiseks nime j\u00e4rgi ja \u00fchte vaba ning sobivat protsessori registrit saamiseks. Igal protsessoritegevusel on vastav funktsioon avo keeles, nagu n\u00e4ha ADDQ-st. Ja l\u00f5puks n\u00e4eme abifunktsiooni tulemuse v\u00e4\u00e4rtuse salvestamiseks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/01ccaa6aa6d394ef598ea2dbc9257d87.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00e4ivitades go generate, t\u00e4idame programmi avo ja genereerime l\u00f5puks kaks faili:<\/p>\n<ul>\n<li>add.s, mis sisaldab Go-montaa\u017eikoodi;\n<\/li>\n<li>stub.go, mis sisaldab funktsioonide pealkirju kahe maailma \u00fchendamiseks: Go ja montaa\u017e.\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/72a9443776ecf45eef6fb97a4e08acba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00fc\u00fcd, kui oleme n\u00e4inud, mida ja kuidas avo teeb, vaatame meie funktsioone. Olen rakendanud nii skalaarset kui ka vektorkujulist (SIMD) versiooni funktsioonidest.<\/p>\n<p>Esmalt vaatame skalaarseid versioone.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ec31dbb8b97b9d7c1012a120fa18cdaf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNagu eelnevas n\u00e4ites, palume anda meile vaba ja \u00f5ige \u00fcldotstarbeline register, me ei pea argumentide nihkeid ja m\u00f5\u00f5tmeid arvutama. K\u00f5ike seda teeb avo meie eest.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/88085e927dd943ea0f808a28fb3ccf9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVarem kasutasime silte ja h\u00fcppeid (v\u00f5i h\u00fcppeid), et parandada j\u00f5udlust ja petta Go kompilaatorit, kuid n\u00fc\u00fcd teeme seda algusest peale. T\u00f5de on see, et ts\u00fcklid on k\u00f5rgema taseme m\u00f5isted. Assembleris on meil ainult sildid ja h\u00fcpped.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/9a4181248eb279d89c1445a820b06649.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00dclej\u00e4\u00e4nud kood peaks olema juba tuttav ja arusaadav. Me emuleerime ts\u00fcklit siltide ja h\u00fcpetega, v\u00f5tame v\u00e4ikese osa andmeid kahest meie slice'ist, \u00fchendame need bititehte (AND NOT sel juhul) ja paneme tulemuse tulemuslikku slice'i. K\u00f5ik.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/19275ead27f63092fc6596bed38a8d03.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNii n\u00e4eb v\u00e4lja l\u00f5plik kood assembleris. Me ei pidanud arvutama nihkeid ja suurusi (marked green) ega j\u00e4lgima kasutatavaid registreid (marked red).<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ed68528a6f852634a5b536670c6315f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKui v\u00f5rrelda assembleri rakenduse j\u00f5udlust parima Go rakenduse j\u00f5udlusega, n\u00e4eme, et need on v\u00f5rdv\u00e4\u00e4rsed. Ja see on ootusp\u00e4rane. Me ei teinud midagi erilist \u2014 me lihtsalt kopeerisime, mida teeks Go kompilaator.<\/p>\n<p>Kahjuks ei saa me kompilaatorit sundida meie assembleris kirjutatud funktsioone inlinesema. Go kompilaatoril puudub t\u00e4nase p\u00e4evani selline v\u00f5imalus, kuigi selle lisamise soov on juba pikka aega olemas.<\/p>\n<p>Just sellep\u00e4rast ei saa me mingit kasu v\u00e4ikestest assembleri funktsioonidest. Peame kas kirjutama suuri funktsioone v\u00f5i kasutama uut math\/bits paketti, v\u00f5i v\u00e4ltima assemblerit \u00fcldse.<\/p>\n<p>Vaadakem n\u00fc\u00fcd meie funktsioonide vektorkoopiaid.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/7f67c3cc855908fb47c7900d6e5d7f54.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelle n\u00e4ite jaoks otsustasin kasutada AVX2, seega kasutame 32-baidiste t\u00fckkidega t\u00f6\u00f6tavaid operatsioone. Koodi struktuur on v\u00e4ga sarnane skalaarversiooniga: parameetrite laadimine, palve meie jaoks vaba \u00fcldregistredi saamiseks jne.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/021e0424a0d733ec7db9edeb98ce1f65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00dcks uuendus on see, et laiemad vektori operatsioonid kasutavad spetsiaalseid laiu registreid. 32-baidiste t\u00fckkide puhul on need Y-prefiksiga registrid. Seet\u00f5ttu n\u00e4ete koodis funktsiooni YMM(). Kui ma oleksin kasutanud AVX-512 koos 64-bitiste t\u00fckkidega, oleks prefiks olnud Z.<\/p>\n<p>Teine uuendus seisneb selles, et otsustasin kasutada optimeerimist, mida nimetatakse ts\u00fckli avamiseks (loop unrolling), s.t. teha kaheksa ts\u00fcklioperatsiooni k\u00e4sitsi, enne kui h\u00fcppame ts\u00fckli algusesse. See optimeerimine v\u00e4hendab koodis harude arvu ja on piiratud olemasolevate vabade registeride hulgaga.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/f54631d9e8c69f6f70ecace3133ae1e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAga kuidas siis j\u00f5udlus? See on suurep\u00e4rane! Saime kiirusetaotluse umbes seitse korda kiiremini v\u00f5rreldes parima lahendusega Go-s. Muljetavaldav, eks?<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/d7e85c933eecb243cfb49225b4d92c6c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuid isegi seda rakendust oleks potentsiaalselt v\u00f5imalik kiirendada, kasutades AVX-512, eelprefetchingut v\u00f5i JIT (just-in-time compiler) p\u00e4ringute planeerijale. Kuid see on kindlasti eraldi ettekande teema.<\/p>\n<h2>Bitmap-indekside probleemid<\/h2>\n<p>\nN\u00fc\u00fcd, kui oleme juba uurinud lihtsat bitmap-indeksi rakendust Go-s ja palju tootlikumat assembleris, r\u00e4\u00e4gime l\u00f5puks sellest, miks bitmap-indekseid kasutatakse nii harva.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/83d36a5c92ba90fd680fe8afb6cfc11f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVanades teadusartiklites mainitakse kolme bitmap-indeksi problema, kuid uuemad teadust\u00f6\u00f6d ja mina v\u00e4idame, et need on juba aegunud. Ei lasku s\u00fcgavale igasse neist problemidest, vaid k\u00e4sitleme neid pinnapealselt.<\/p>\n<h2>Suur kardinaalsuse probleem<\/h2>\n<p>\nNii et meile \u00f6eldakse, et bitmap-indeksid sobivad ainult v\u00e4he v\u00e4\u00e4rtustega v\u00e4lja jaoks, see t\u00e4hendab, et neil on v\u00e4he v\u00e4\u00e4rtusi (n\u00e4iteks sugu v\u00f5i silmade v\u00e4rv), ja p\u00f5hjus on see, et tavaline kujutamine selliste v\u00e4lja (\u00fcks bitt v\u00e4\u00e4rtuse kohta) suure kardinaalsuse puhul v\u00f5taks liiga palju ruumi ja peale selle oleksid need bitmap-indeksid halvasti (harva) t\u00e4idetud.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/0787efc4d2cb4ea4d404ca7888b33697.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/44ab4bc7c25d14fe2f53caf5d9da399d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00f5nikord saame kasutada muud kujutamist, n\u00e4iteks standardset, mida kasutame numbrite kujutamiseks. Aga just kokkusurumismeetodite ilmumine muutis k\u00f5ike. Viimase paarik\u00fcmne aasta jooksul on teadlased ja uurijad v\u00e4lja m\u00f5elnud rohkelt algorytme bitmapide kokkusurutamiseks. Nende peamine eelis on see, et bitmapide avamiseks pole vaja \u2014 me saame bitoperatsioone teha otse kokkusurutud bitmapide peal.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/ecb54fbf15aa11271bbbab01ecbda880.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nViimase ajal on hakanud ilmnema ka h\u00fcbriidlahendused, nagu n\u00e4iteks roaring bitmaps. Need kasutavad samaaegselt kolme erinevat esitlemisviisi bitmappide jaoks \u2014 nimelt bitmaps, massiivid ja nn bit runs \u2014 ning tasakaalustavad nende vahel, et maksimeerida j\u00f5udlust ja minimeerida m\u00e4lutarvet.<\/p>\n<p>Roaring bitmaps'e v\u00f5ib leida paljudes populaarsetes rakendustes. Juba on olemas tohutult palju teostusi erinevates programmeerimiskeeltes, sealhulgas \u00fcle kolme teostuse Go jaoks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/de2adfebc431ff48c996247b453f02ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVeel \u00fcks l\u00e4henemine, mis v\u00f5ib aidata meil toime tulla suure kardinaalsusega, on r\u00fchmitamine (binning). Kujutage ette, et teil on v\u00e4li, mis esindab inimese pikkust. Pikkus on ujuvnumber, kuid meie, inimesed, ei m\u00f5tle sellele nii. Meie jaoks pole vahet 185,2 cm ja 185,3 cm vahel.<\/p>\n<p>Seega saame sarnased v\u00e4\u00e4rtused grupeerida r\u00fchmadesse, mille suurus on 1 cm ulatuses.<\/p>\n<p>Ja kui me veel teame, et v\u00e4ga v\u00e4hestel inimestel on pikkus alla 50 cm v\u00f5i \u00fcle 250 cm, siis saame p\u00f5him\u00f5tteliselt muuta l\u00f5pmatu kardinaalsusega v\u00e4lja umbes 200 v\u00e4\u00e4rtusega v\u00e4ljaks.<\/p>\n<p>Muidugi, vajadusel saame teha t\u00e4iendava filtreerimise ka hiljem.<\/p>\n<h2>Suure l\u00e4bilaskev\u00f5ime probleem<\/h2>\n<p>\nJ\u00e4rgmine bitmap-indeksite probleem on see, et nende uuendamine v\u00f5ib olla v\u00e4ga kulukas.<\/p>\n<p>Andmebaasid peavad v\u00f5imaldama andmete uuendamist hetkel, kui potentsiaalselt sajad muud p\u00e4ringud otsivad neid andmeid. Me vajame lukke, et v\u00e4ltida andmete samasuguseid probleeme v\u00f5i muid juurdep\u00e4\u00e4sulubade probleeme. Kui on olemas \u00fcks suur lukk, siis tekib probleem \u2014 lock contention, kui see lukk muutub kitsaskohaks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/0ae1bf925542d286f8b7b245c160a35e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSeda probleemi saab lahendada v\u00f5i \u00fcmber minna andmete jagamise v\u00f5i versioneeritud indeksite kasutamise kaudu.<\/p>\n<p>Andmete jagamine on lihtne ja \u00fcldtuntud asi. Saate jagada bitmap-indeksi nii, nagu jagaksite k\u00f5iki teisi andmeid. \u00dche suure luku asemel saate hulga v\u00e4ikeseid lukke ja seel\u00e4bi vabanete lock contention'ist.<\/p>\n<p>Teine v\u00f5imalus probleemi lahendamiseks on versioonitud indeksite kasutamine. Teil v\u00f5ib olla \u00fcks indeksikoor, mida te otsimiseks v\u00f5i lugemiseks kasutate, ja teine - kirjutamiseks v\u00f5i uuendamiseks. Ja iga teatud aja j\u00e4rel (nt iga 100 ms v\u00f5i 500 ms) teete neist koopiad ja vahetate neid. Loomulikult on see l\u00e4henemine rakendatav ainult juhtudel, kui teie rakendus suudab t\u00f6\u00f6tada veidi aeglasema otsinguindeksi abil.<\/p>\n<p>Neid kahte l\u00e4henemist saab kasutada samaaegselt: teil v\u00f5ib olla jaotatud versioonitud indeks.<\/p>\n<h2>Komplekssemad p\u00e4ringud<\/h2>\n<p>Bitmap-indeksite viimane probleem on see, et nagu \u00f6eldakse, ei sobi nad h\u00e4sti keerukamate p\u00e4ringute, n\u00e4iteks \u201evahemiku\u201d p\u00e4ringute jaoks.<\/p>\n<p>Ja t\u00f5epoolest, kui sellele m\u00f5elda, ei sobi bititehteid nagu AND, OR jms p\u00e4ringuteks, mis \u00fctlevad \u201eN\u00e4ita mulle hotelle, mille toade maksumus on 200 kuni 300 dollarit \u00f6\u00f6 kohta\u201d.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/7bc2e129cad46fb5875c2b3018c39ff7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNaiv ja v\u00e4ga m\u00f5istlik lahendus oleks v\u00f5tta tulemused iga dollari v\u00e4\u00e4rtuse jaoks ja \u00fchendada need bititehte OR abil.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/b9f8fc7945caa1866f8e0cfa8a04bd98.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVeidi parema lahendusena oleks kasutada r\u00fchmitamist. N\u00e4iteks 50 dollari kaupa. See kiirendaks meie protsessi 50 korda.<\/p>\n<p>Kuid probleem lahendatakse samuti kergesti, kasutades ettevalmistatud esitust, mis on loodud spetsiaalselt selliste p\u00e4ringute jaoks. Teadusartiklites nimetatakse seda vahemikku kodeeritud bitmapideks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/644a420628b21f220a7af1ff15c4031f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSellises esituses me ei pane lihtsalt \u00fchte bitti mingi v\u00e4\u00e4rtuse (n\u00e4iteks 200) jaoks, vaid esitame selle v\u00e4\u00e4rtuse ja k\u00f5ik, mis on k\u00f5rgem. 200 ja rohkem. Sama kehtib 300 kohta: 300 ja rohkem. Nii edasi.<\/p>\n<p>Kasutades seda esitust, saame sellistele otsingup\u00e4ringutele vastata, l\u00e4bides indeksi vaid kaks korda. Esiteks saame nimekirja hotelle, kus toa hind on alla 300 dollari, ja seej\u00e4rel eemaldame neist need, kus toa hind on alla 199 dollari. Valmis.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/cc2bb58d7d7a51495c62ec7da81e2d12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTe \u00fcllatute, kuid isegi geok\u00fcsimused on v\u00f5imalikud bitmap-indeksite abil. Trikk on kasutada geoesitust, mis \u00fcmbritseb teie koordinaati geomeetrilise kujundi abil. N\u00e4iteks Google'i S2. Kujundit tuleks olla v\u00f5imalik esitada kolme v\u00f5i enama \u00fcksteisega ristuva joonega, mida saab nummerdada. Nii saame muuta meie geok\u00fcsimuse mitmeks \u00abvahe\u00bb p\u00e4ringuks ( nende nummerdatud joonte j\u00e4rgi).<\/p>\n<h2>Valmis lahendused<\/h2>\n<p>\nLoodan, et see huvi tekitas ja Teie arsenali lisandusid veel \u00fcks kasulik t\u00f6\u00f6riist. Kui teil kunagi tuleb teha midagi sarnast, teate, kuhu vaadata.<\/p>\n<p>Kahjuks ei ole k\u00f5igil aega, kannatust ja ressursse, et luua bitmap-indekseid nullist. Eriti keerukamaid, kasutades n\u00e4iteks SIMD-tehnoloogiat.<\/p>\n<p>\u00d5nneks on mitmeid valmis lahendusi, mis v\u00f5ivad teid aidata.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/817b47cb189a758756b602ec9cf319e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Roaring bitmaps<\/h2>\n<p>\nEsiteks on olemas see tuntud roaring bitmaps raamatukogu, millest ma juba r\u00e4\u00e4kisin. See sisaldab k\u00f5iki vajalikke konteinerite ja bititegevusi, mida vajate t\u00e4iusliku bitmap-indeksi loomiseks.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/57f61a51485c174666b52dc2063fabe8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKahjuks ei kasuta hetkel \u00fckski Go teostus SIMD-d, mis t\u00e4hendab, et Go teostused on v\u00e4hem tootlikud kui C keeltes teostused.<\/p>\n<h2>Pilosa<\/h2>\n<p>\nTeine toode, mis v\u00f5ib aidata, on andmebaas Pilosa, millel on p\u00f5him\u00f5tteliselt ainult bitmap-indeksid. See on suhteliselt uus lahendus, kuid vallutab s\u00fcdameid tohutu kiirus.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/d3870a979e1e73d093fe5d5e9bb71cd8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPilosa kasutab enda sees roaring bitmaps'i, andes teile v\u00f5imaluse neid kasutada, lihtsustades ja selgitades k\u00f5iki eelnevalt mainitud aspekte: gruppeerimine, range-encoded bitmaps, v\u00e4lja m\u00f5isted jne.<\/p>\n<p>Vaatame kiirelt Pilosa kasutamise n\u00e4idet, et vastata juba tuttavale k\u00fcsimusele.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/dfee7abfd653cc19d9aa8b64c64f3e4e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00e4ide on v\u00e4ga sarnane sellele, mida olete varem n\u00e4inud. Loome Pilosa serveri kliendi, loome indeksi ja vajalikud v\u00e4ljad, seej\u00e4rel t\u00e4idame meie v\u00e4ljad juhuslike andmetega t\u00f5en\u00e4osustega ning l\u00f5puks sooritan tuttava p\u00e4ringu.<\/p>\n<p>Peale seda kasutame NOT v\u00e4lja \u00abexpensive\u00bb peale, seej\u00e4rel ristsime tulemuse (v\u00f5i AND-ime) v\u00e4lja \u00abterrace\u00bb ja v\u00e4lja \u00abreservations\u00bb. Ja l\u00f5puks saame l\u00f5pliku tulemuse.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/8d66c6d68019c2297b6c15b700f06a3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLoodan t\u00f5eliselt, et peagi ilmuvad sellised uued indeksit\u00fc\u00fcbid nagu bitmap-indeksid ka andmebaasidesse nagu MySQL ja PostgreSQL.<br \/>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/7a8e33d576c7fb6376a173ee038b4206.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Bitmap-indeksid Go-s: metsik kiirus\" src=\"\/wp-content\/uploads\/2019\/05\/c62caa9ad6f2d96056c80326f4fa9a0d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKui te pole veel uinunud, siis ait\u00e4h. Mul tuli puudutada paljusid teemasid ajapiirangu t\u00f5ttu, kuid loodan, et ettekandest oli kasu ja see oli v\u00f5ib-olla isegi inspireeriv.<\/p>\n<p>Bitmap-indeksite kohta on hea teada, isegi kui need ei ole teile hetkel vajalikud. Las nad j\u00e4\u00e4vad teie t\u00f6\u00f6riistakasti veel \u00fcheks t\u00f6\u00f6riistaks.<\/p>\n<p>Me oleme arutanud erinevaid nippe Go j\u00f5udluse suurendamiseks ja asju, millega Go kompilaator veel liiga h\u00e4sti toime ei tule. Seda on t\u00f5eliselt kasulik teada igale Go programmeerijale.<\/p>\n<p>See on k\u00f5ik, mida tahtsin jagada. Ait\u00e4h!<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/451938\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 GopherCon Russia 2019 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u2014 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 \u0432 \u041d\u0438\u0436\u043d\u0435\u043c \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0435. \u0420\u0435\u0447\u044c \u0432 \u043d\u0451\u043c \u0438\u0434\u0451\u0442 \u043e bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2014 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c, \u0447\u0435\u043c B-tree, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c. \u0414\u0435\u043b\u044e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 GopherCon Russia 2019 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u2014 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 \u0432 \u041d\u0438\u0436\u043d\u0435\u043c \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0435. \u0420\u0435\u0447\u044c \u0432 \u043d\u0451\u043c \u0438\u0434\u0451\u0442 \u043e bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2014 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c, \u0447\u0435\u043c B-tree, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c. \u0414\u0435\u043b\u044e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 Go: \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0434\u0438\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 GopherCon Russia 2019 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u2014 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 \u0432 \u041d\u0438\u0436\u043d\u0435\u043c \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0435. \u0420\u0435\u0447\u044c \u0432 \u043d\u0451\u043c \u0438\u0434\u0451\u0442 \u043e bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2014 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c, \u0447\u0435\u043c B-tree, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c. \u0414\u0435\u043b\u044e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:54:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:54:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bitmap-indeksid Go-s: metsiku kiirusel otsing | ProHoster","description":"Avak\u00f5ne Ma esitasin selle ettekande inglise keeles GopherCon Russia 2019 konverentsil Moskvas ja vene keeles kohtumisel Nizhni Novgorodis. R\u00e4\u00e4gime bitmap-indeksist \u2014 harvemini kasutatav, kui B-puu, kuid mitte v\u00e4hem huvitav. Jagame video salvestust konverentsilt inglise keeles ja tekstiversiooni vene keeles. Vaatleme,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 Go: \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0434\u0438\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 | ProHoster","og:description":"\u0412\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u042f \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 GopherCon Russia 2019 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u2014 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 \u0432 \u041d\u0438\u0436\u043d\u0435\u043c \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0435. \u0420\u0435\u0447\u044c \u0432 \u043d\u0451\u043c \u0438\u0434\u0451\u0442 \u043e bitmap-\u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2014 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c, \u0447\u0435\u043c B-tree, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c. \u0414\u0435\u043b\u044e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:54:42+00:00","article:modified_time":"2019-10-31T18:54:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33793","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 16:43:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:33:25","updated":"2026-01-21 16:43:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/33793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=33793"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/33793\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/25469"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=33793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=33793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=33793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}