{"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\/sq\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","title":{"rendered":"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/86ef928e6741022b2c0e5885a031408a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Fjal\u00ebt e hapjes<\/h2>\n<p>\nUn\u00eb e mbajta k\u00ebt\u00eb prezantim n\u00eb anglisht n\u00eb konferenc\u00ebn GopherCon Rusia 2019 n\u00eb Mosk\u00eb dhe n\u00eb rusisht n\u00eb meet-up n\u00eb Nizhny Novgorod. Tema \u00ebsht\u00eb mbi indeksin bitmap \u2014 m\u00eb pak i zakonsh\u00ebm se B-tree, por aspak m\u00eb pak interesant. Po ndajem <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/WvlUH6MjUuI?list=PL3xVZC4USRNSO_kb2lh_J_no6C-KJ7Phg\">regjistrimin<\/a><\/noindex> e prezantimit n\u00eb konferenc\u00eb n\u00eb anglisht dhe p\u00ebrkthimin tekstual n\u00eb rusisht.<\/p>\n<p>Ne do t\u00eb shikojm\u00eb se si funksionon indeksi bitmap, kur ai \u00ebsht\u00eb m\u00eb i mir\u00eb, kur \u00ebsht\u00eb m\u00eb i keq se indekset e tjera dhe n\u00eb cilat rastet ai \u00ebsht\u00eb ndjesh\u00ebm m\u00eb i shpejt\u00eb; do t\u00eb shohim n\u00eb cilat sisteme t\u00eb njohura DBMS tashm\u00eb ekzistojn\u00eb indekse bitmap; do t\u00eb p\u00ebrpiqemi t\u00eb shkruajm\u00eb t\u00eb tonin n\u00eb Go. Dhe p\u00ebr \"dessert\", do t\u00eb p\u00ebrdorim biblioteka t\u00eb gatshme p\u00ebr t\u00eb krijuar nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb specializuar super t\u00eb shpejt\u00eb.<\/p>\n<p>Shpresoj shum\u00eb q\u00eb pun\u00ebt e mia do t\u00eb jen\u00eb t\u00eb dobishme dhe interesante p\u00ebr ju. Le t\u00eb fillojm\u00eb!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hyrje<\/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=\"Luaj videon\" 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>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! Tani \u00ebsht\u00eb gjasht\u00eb pasdite, ne jemi t\u00eb gjith\u00eb t\u00eb lodhur. Koha e shk\u00eblqyer p\u00ebr t\u00eb folur p\u00ebr teorin\u00eb e m\u00ebrzitshme t\u00eb indekseve t\u00eb bazave t\u00eb t\u00eb dh\u00ebnave, apo jo? Mos u shqet\u00ebsoni, do t\u00eb kem disa rreshta kod k\u00ebtu e atje. \ud83d\ude42<\/p>\n<p>N\u00ebse flasim seriozisht, prezantimi \u00ebsht\u00eb i mbushur me informacion, dhe nuk kemi shum\u00eb koh\u00eb. Pra, le t\u00eb fillojm\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/e778e13727700f0335a4b5558a0d8db3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSot do t\u00eb flas p\u00ebr:<\/p>\n<ul>\n<li>\u00e7far\u00eb jan\u00eb indekset;\n<\/li>\n<li>\u00e7far\u00eb \u00ebsht\u00eb indeksi bitmap;\n<\/li>\n<li>ku p\u00ebrdoret dhe ku NUK p\u00ebrdoret ai dhe pse;\n<\/li>\n<li>nj\u00eb implementim i thjesht\u00eb n\u00eb Go dhe pak p\u00ebrpjekje me kompilatorin;\n<\/li>\n<li>nj\u00eb implementim pak m\u00eb pak t\u00eb thjesht\u00eb, por shum\u00eb m\u00eb t\u00eb efikas n\u00eb Go-assembler;\n<\/li>\n<li>\"problemet\" e indekseve bitmap;\n<\/li>\n<li>implementime ekzistuese.\n<\/li>\n<\/ul>\n<h2>Pra, \u00e7far\u00eb jan\u00eb indekset?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/b80e5b990c44814afe9150a9a82351fd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIndeksi \u00ebsht\u00eb nj\u00eb struktur\u00eb t\u00eb dh\u00ebnash e ve\u00e7ant\u00eb q\u00eb e mbahet dhe e p\u00ebrdit\u00ebsohet p\u00ebrve\u00e7 t\u00eb dh\u00ebnave kryesore. P\u00ebrdoret p\u00ebr t\u00eb p\u00ebrshpejtuar k\u00ebrkimin. Pa indekse, k\u00ebrkimi do t\u00eb k\u00ebrkonte nj\u00eb kalim t\u00eb plot\u00eb p\u00ebrmes t\u00eb dh\u00ebnave (procesi i quajtur skanim i plot\u00eb), dhe ky proces ka nj\u00eb kompleksitet algoritmik linear. Por bazat e t\u00eb dh\u00ebnave zakonisht p\u00ebrmbajn\u00eb nj\u00eb sasi t\u00eb madhe t\u00eb dh\u00ebnash dhe kompleksiteti linear \u00ebsht\u00eb shum\u00eb i ngadalsh\u00ebm. N\u00eb m\u00ebnyr\u00eb ideale, do t\u00eb donim t\u00eb merrnim nj\u00eb kompleksitet logjaritmik ose konstant.<\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb tem\u00eb e madhe e komplikuar, e mbushur me nuanca dhe kompromise, por, duke par\u00eb mbi dhjet\u00eb vite zhvillimi dhe k\u00ebrkimi t\u00eb bazave t\u00eb t\u00eb dh\u00ebnave t\u00eb ndryshme, jam i gatsh\u00ebm t\u00eb pretendoj se ekzistojn\u00eb vet\u00ebm disa qasje t\u00eb njohura p\u00ebr krijimin e indekseve t\u00eb DB.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/08a74dbb365035cd99bc94d72644a1b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e par\u00eb p\u00ebrfshin reduktimin hierarkik t\u00eb zon\u00ebs s\u00eb k\u00ebrkimit, duke ndar\u00eb zon\u00ebn e k\u00ebrkimit n\u00eb pjes\u00eb m\u00eb t\u00eb vogla.<\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, ne e b\u00ebjm\u00eb k\u00ebt\u00eb duke p\u00ebrdorur lloje t\u00eb ndryshme pem\u00ebsh. Nj\u00eb shembull mund t\u00eb jet\u00eb nj\u00eb kuti e madhe me materiale n\u00eb dollapin tuaj, n\u00eb t\u00eb cil\u00ebn ndodhen kutia m\u00eb t\u00eb vogla me materiale, t\u00eb ndara sipas temave t\u00eb ndryshme. N\u00ebse ju nevojiten materiale, me siguri do t\u00eb k\u00ebrkoni ato n\u00eb kutin\u00eb e etiketuar \"Materiale\", dhe jo n\u00eb at\u00eb me etiket\u00eb \"Biskota\", apo jo?<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/423fac47c748980b18af434644af4dae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e dyt\u00eb \u00ebsht\u00eb q\u00eb t\u00eb nxjerrim menj\u00ebher\u00eb elementin e nevojsh\u00ebm ose grupin e elementeve. Ne e b\u00ebjm\u00eb k\u00ebt\u00eb n\u00eb harta hash ose n\u00eb indekse t\u00eb kund\u00ebrta. P\u00ebrdorimi i harta hash \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me shembullin e m\u00ebparsh\u00ebm, vet\u00ebm se n\u00eb dollapin tuaj keni shum\u00eb kutia t\u00eb vogla me objekte p\u00ebrfundimtare.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/088fed0a2a0feea4a23edbf0ca654805.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e tret\u00eb \u00ebsht\u00eb t\u00eb hiqni nevoj\u00ebn p\u00ebr k\u00ebrkim. Kjo e b\u00ebjm\u00eb me ndihm\u00ebn e filtreve Bloom ose filtreve cuckoo. E para jep p\u00ebrgjigjen menj\u00ebher\u00eb, duke ju shp\u00ebtuar nga nevoja p\u00ebr t\u00eb kryer k\u00ebrkimin.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/493bc4f20baacc0a5dc0faf15cc46285.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e fundit \u00ebsht\u00eb t\u00eb p\u00ebrdorim plot\u00ebsisht t\u00eb gjitha kapacitetet q\u00eb na ofron hardueri modern. K\u00ebt\u00eb e b\u00ebjm\u00eb n\u00eb indekset bitmap. Po, kur i p\u00ebrdorim, ndonj\u00ebher\u00eb na nevojitet t\u00eb kalojm\u00eb n\u00ebp\u00ebr t\u00eb gjith\u00eb indeksin, por e b\u00ebjm\u00eb k\u00ebt\u00eb super efikas.<\/p>\n<p>Si\u00e7 thash\u00eb, tema e indekseve t\u00eb DB \u00ebsht\u00eb e gjer\u00eb dhe e mbushur me kompromise. Kjo do t\u00eb thot\u00eb q\u00eb ndonj\u00ebher\u00eb ne mund t\u00eb p\u00ebrdorim disa qasje nj\u00ebkoh\u00ebsisht: n\u00ebse na nevojitet t\u00eb p\u00ebrshpejtojm\u00eb m\u00eb tej k\u00ebrkimin ose n\u00ebse \u00ebsht\u00eb e nevojshme t\u00eb mbulojm\u00eb t\u00eb gjitha llojet e mundshme t\u00eb k\u00ebrkimit.<\/p>\n<p>Sot do t\u00eb flas p\u00ebr qasjen m\u00eb pak t\u00eb njohur nga ato \u2014 p\u00ebr indekset bitmap.<\/p>\n<h2>Kush jam un\u00eb p\u00ebr t\u00eb folur rreth k\u00ebsaj teme?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/42a9d17a507c392bc202254a92dfaf41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn\u00eb punoj si lider ekipi n\u00eb Badoo (ndoshta e njihni m\u00eb mir\u00eb produktin ton\u00eb tjet\u00ebr \u2014 Bumble). Ne kemi m\u00eb shum\u00eb se 400 milion p\u00ebrdorues n\u00eb t\u00eb gjith\u00eb bot\u00ebn dhe shum\u00eb karakteristika q\u00eb merren me at\u00eb q\u00eb gjejn\u00eb \u00e7iftin m\u00eb t\u00eb mir\u00eb p\u00ebr ta. Kjo e b\u00ebjm\u00eb p\u00ebrmes sh\u00ebrbimeve t\u00eb personalizuara, duke p\u00ebrdorur gjithashtu indekset bitmap.<\/p>\n<h2>Pra, \u00e7far\u00eb \u00ebsht\u00eb indeksi bitmap?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/14f20f3697a20c02f6b3510dc7f0ae4d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIndeksat bitmap, si\u00e7 sugjerohet nga emri, p\u00ebrdorin bitmap ose bitset p\u00ebr t\u00eb implementuar nj\u00eb indeks k\u00ebrkimi. Nga nj\u00eb perspektiv\u00eb e lart\u00eb, ky indeks p\u00ebrb\u00ebhet nga nj\u00eb ose disa prej k\u00ebtyre bitmap-eve, q\u00eb p\u00ebrfaq\u00ebsojn\u00eb entitete t\u00eb tilla si njer\u00ebz dhe pronat ose parametrat e tyre (mosha, ngjyra e syve, etj.), dhe nga nj\u00eb algorit\u00ebm q\u00eb p\u00ebrdor operacione bitore (AND, OR, NOT) p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkesat e k\u00ebrkimit.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/f815720330a51b1f0798e45d23160d3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa thuhet se indeksat bitmap jan\u00eb m\u00eb t\u00eb p\u00ebrshtatsh\u00ebm dhe shum\u00eb efikas p\u00ebr raste kur ka k\u00ebrkesa q\u00eb bashkojn\u00eb k\u00ebrkesa mbi shum\u00eb kolona me cardinalitet t\u00eb ul\u00ebt (imagjinoni \"ngjyr\u00ebn e syve\" ose \"statusin familjar\" kund\u00ebr di\u00e7kaje si \"distanca nga qendra e qytetit\"). Por m\u00eb von\u00eb do t'ju tregoj se ata funksionojn\u00eb edhe n\u00eb rastin e kolonave me cardinalitet t\u00eb lart\u00eb.<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb nj\u00eb shembull t\u00eb thjesht\u00eb t\u00eb nj\u00eb indeksi bitmap.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/33fe23476e0931c10345d7175b83d68b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nImagjinoni se kemi nj\u00eb list\u00eb restoranesh n\u00eb Mosk\u00eb me prona binare si k\u00ebto:<\/p>\n<ul>\n<li>pran\u00eb metros\u00eb (near metro);\n<\/li>\n<li>ka parkim privat (has private parking);\n<\/li>\n<li>ka verande (has terrace);\n<\/li>\n<li>pranon rezervime (accepts reservations);\n<\/li>\n<li>\u00ebsht\u00eb vegetarian-friendly (vegan friendly);\n<\/li>\n<li>eshte i shtrenjt\u00eb (expensive).\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/fcbad539ea12f79a9d06966ce308637e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe t\u00eb japim \u00e7do restoranti nj\u00eb num\u00ebr rendor duke filluar nga 0 dhe t'i rezervojm\u00eb hap\u00ebsir\u00eb p\u00ebr 6 bitmap-e (nj\u00eb p\u00ebr \u00e7do karakteristik\u00eb). Pastaj ne do t\u2019i mbushim k\u00ebto bitmap-e n\u00eb var\u00ebsi t\u00eb faktit n\u00ebse restoranti ka k\u00ebt\u00eb pron\u00eb apo jo. N\u00ebse restoranti 4 ka verande, at\u00ebher\u00eb biti nr. 4 n\u00eb bitmapin \"ka verande\" do t\u00eb vendoset n\u00eb 1 (n\u00ebse nuk ka verande, at\u00ebher\u00eb n\u00eb 0).<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/3709c426617d4364f392ee6b68f92b00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani kemi indeksin bitmap m\u00eb t\u00eb thjesht\u00eb t\u00eb mundsh\u00ebm, dhe mund ta p\u00ebrdorim at\u00eb p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkesa si:<\/p>\n<ul>\n<li>\"M\u00eb trego restoranet q\u00eb jan\u00eb vegetarian-friendly\";\n<\/li>\n<li>\"M\u00eb trego restorantet e lira me verande, ku mund t\u00eb rezervoj nj\u00eb tavolin\u00eb\".\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/90acb0f890686bd52c3db1fc667f0b0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/0fd0b7fe9f7b7039022ad5c79fe873bc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSi? Le t\u00eb shohim. K\u00ebrkesa e par\u00eb \u00ebsht\u00eb shum\u00eb e thjesht\u00eb. E gjith\u00eb ci\u00f2 q\u00eb na nevojitet \u00ebsht\u00eb t\u00eb marrim bitmapin \"\u00ebsht\u00eb vegetarian-friendly\" dhe ta shnd\u00ebrrojm\u00eb at\u00eb n\u00eb nj\u00eb list\u00eb restorantesh, t\u00eb cil\u00ebt kan\u00eb bitet e vendosura.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ef4a5cfd658ff4ef8bc0c638c4522d11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/9cc175bae55c16018fdf5ff95517a61a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebrkesa e dyt\u00eb \u00ebsht\u00eb pak m\u00eb e komplikuar. Na nevojitet t\u00eb p\u00ebrdorim operacionin bitor NOT n\u00eb bitmapin \"i shtrenjt\u00eb\" p\u00ebr t\u00eb marr\u00eb list\u00ebn e restoranteve t\u00eb lira, pastaj ta AND-me me bitmapin \"pranon rezervime\" dhe t\u00eb AND-me rezultatin me bitmapin \"ka verande\". Bitmapi rezultues do t\u00eb p\u00ebrmbaj\u00eb nj\u00eb list\u00eb t\u00eb sh\u00ebrbimeve q\u00eb p\u00ebrfshijn\u00eb t\u00eb gjitha kriteret tona. N\u00eb k\u00ebt\u00eb shembull, kjo \u00ebsht\u00eb vet\u00ebm restoranti \"Junost\".<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/f1cdda0cbf7f15278553899cf876c17e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/126b50e0f622b6e36c461cd74e708c38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebtu ka shum\u00eb teori, por mos u shqet\u00ebsoni, do t\u00eb shohim kodin shum\u00eb shpejt.<\/p>\n<h2>Ku p\u00ebrdoren indeksat bitmap?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/406132236c71a4f66ae79957b6e633b3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse e \"Google-oni\" indeksat bitmap, 90% e p\u00ebrgjigjeve do t\u00eb jen\u00eb n\u00eb nj\u00eb far\u00eb m\u00ebnyre t\u00eb lidhura me Oracle DB. Por sistemet e tjera DB gjithashtu sigurisht q\u00eb mb\u00ebshtesin nj\u00eb gj\u00eb kaq t\u00eb mahnitshme, apo jo? Jo sakt\u00ebsisht. <\/p>\n<p>Le t\u00eb shkojm\u00eb p\u00ebrmes list\u00ebs s\u00eb dyshuarve kryesor\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/d18d66451a8a26b0ddf121f8ec0204cd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMySQL nuk mb\u00ebshtet ende indeksat bitmap, por ka nj\u00eb propozim p\u00ebr t\u00eb shtuar k\u00ebt\u00eb opsion (<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 nuk mb\u00ebshtet indeksat bitmap, por p\u00ebrdor bitmap t\u00eb thjesht\u00eb dhe operacione bitore p\u00ebr t\u00eb bashkuar rezultatet e k\u00ebrkimit mbi shum\u00eb indekse t\u00eb tjera.<\/p>\n<p>Tarantool ka indekse bitset, ai mb\u00ebshtet k\u00ebrkimin e thjesht\u00eb mbi to.<\/p>\n<p>Redis ka fushat e thjeshta bitore<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/commands\/bitfield\"> (https:\/\/redis.io\/commands\/bitfield<\/a><\/noindex>) pa mund\u00ebsi p\u00ebr k\u00ebrkim mbi to.<\/p>\n<p>MongoDB ende nuk mb\u00ebshtet indeksat bitmap, por gjithashtu ka nj\u00eb propozim p\u00ebr t\u00eb shtuar k\u00ebt\u00eb opsion. <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 p\u00ebrdor bitmap brenda<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=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/232d335963603d6e6dec98839fc9f486.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Por n\u00eb sht\u00ebpin\u00eb ton\u00eb ka nj\u00eb fqinj t\u00eb ri: Pilosa. Kjo \u00ebsht\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash jo-relacionale e shkruar n\u00eb Go. Ajo vet\u00ebm p\u00ebrmban indekse bitmap dhe bazohet krejt\u00ebsisht n\u00eb to. Do t\u00eb flasim p\u00ebr t\u00eb m\u00eb von\u00eb.\n<\/li>\n<\/ul>\n<h2>Implementimi n\u00eb Go<\/h2>\n<p>\nPor pse indekset bitmap p\u00ebrdorenaq m\u00eb rrall\u00eb? Para se t\u00eb p\u00ebrgjigjem n\u00eb k\u00ebt\u00eb pyetje, do t\u00eb doja t'ju demonstroja implementimin e nj\u00eb indeksi bitmap shum\u00eb t\u00eb thjesht\u00eb n\u00eb Go.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ae7f4c1a4a740fe709b05dfaee27ac9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBitmap jan\u00eb, n\u00eb thelb, b\u00ebr\u00eb thjesht nga copa t\u00eb t\u00eb dh\u00ebnave. N\u00eb Go, le t'i p\u00ebrdorim p\u00ebr k\u00ebt\u00eb slice e byte.<\/p>\n<p>Kemi nj\u00eb bitmap p\u00ebr nj\u00eb karakteristik\u00eb restoranti, dhe \u00e7do bit n\u00eb bitmap tregon n\u00ebse nj\u00eb restorant konkret ka k\u00ebt\u00eb pron\u00eb apo jo.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/1ab628ee15887d6b3c6c99855aa610c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa duhen dy funksione ndihm\u00ebse. Nj\u00ebra do t\u00eb p\u00ebrdoret p\u00ebr t\u00eb mbushur bitmapet tona me t\u00eb dh\u00ebna rast\u00ebsore. Rast\u00ebsore, por me nj\u00eb probabilitet t\u00eb caktuar p\u00ebr secilin pron\u00eb q\u00eb restoranti ka. P\u00ebr shembull, un\u00eb besoj se n\u00eb Mosk\u00eb ka shum\u00eb pak restorante ku nuk mund t\u00eb rezervosh nj\u00eb tavolin\u00eb, dhe mendoj se rreth 20% e sh\u00ebrbimeve jan\u00eb vegetarian-friendly.<\/p>\n<p>Funksioni i dyt\u00eb do t\u00eb shnd\u00ebrroj\u00eb bitmapin n\u00eb nj\u00eb list\u00eb restorantesh.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ab9c87a0ba63750116e2e7968f842a9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/498cf7a33611d99b90197d4ee82e2834.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkes\u00ebn \"M\u00eb trego restoranet e lira, q\u00eb kan\u00eb verande dhe ku mund t\u00eb rezervosh nj\u00eb tavolin\u00eb\", na nevojiten dy operacione bitore: NOT dhe AND.<\/p>\n<p>Mund t\u00eb thjeshtojm\u00eb pak kodin ton\u00eb duke p\u00ebrdorur nj\u00eb operacion m\u00eb t\u00eb avancuar AND NOT.<\/p>\n<p>Kemi funksione p\u00ebr secilin prej k\u00ebtyre operacioneve. T\u00eb dyja kalojn\u00eb p\u00ebrmes slice-ve, marrin elementet p\u00ebrkat\u00ebse nga secili, i bashkojn\u00eb ata me operacionin bitor dhe e vendosin rezultatin n\u00eb slice-n p\u00ebrfundimtar.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ec5652a34f0370dfb03df199f341f153.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDhe tani mund t\u2019i shfryt\u00ebzojm\u00eb bit-mapet dhe funksionet tona p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkes\u00ebn e k\u00ebrkimit.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/cf9500ccfe75995a6008191c16729689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPerformanca nuk \u00ebsht\u00eb kaq e lart\u00eb, edhe pse funksionet jan\u00eb shum\u00eb t\u00eb thjeshta dhe ne kemi kursyer shum\u00eb duke mos kthyer nj\u00eb slice p\u00ebrfundimtar t\u00eb ri me \u00e7do thirrje funksioni.<\/p>\n<p>Pasi profilioj pak me pprof, vura re se kompajleri Go kaloi nj\u00eb optimizim shum\u00eb t\u00eb thjesht\u00eb, por shum\u00eb t\u00eb r\u00ebnd\u00ebsish\u00ebm: inlining i funksioneve.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/9092f5ba3940d0a4f3fbfa90b364d716.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nE v\u00ebrteta \u00ebsht\u00eb se kompajleri Go ka frik\u00eb nga ciklet q\u00eb kalojn\u00eb p\u00ebrmes slice-ve dhe kurr\u00eb nuk pranon t\u00eb inline funksione q\u00eb p\u00ebrmbajn\u00eb k\u00ebto cikle.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/d1bddd62b61b367dd1f680f223fa0ce7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor un\u00eb nuk kam frik\u00eb dhe mund ta g\u00ebnjej kompajlerin duke p\u00ebrdorur goto n\u00eb vend t\u00eb ciklit, si n\u00eb dit\u00ebt e mira t\u00eb vjetra.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/5b1c3cb26b923972686047910ecd1c31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/1ca31d12dc90931b674c6a86a4ea23bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe, si\u00e7 e shihni, tani kompajleri me k\u00ebnaq\u00ebsi inline-ona funksionin ton\u00eb! N\u00eb fund, arrijm\u00eb t\u00eb kursejm\u00eb rreth 2 mikrosekonda. Jo keq!<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/bdd6735d16082573e600bffe2cdd5662.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNgushtica e dyt\u00eb nuk \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb shihet, n\u00ebse shikoni me kujdes daljen e assembler-it. Kompajleri shtoi nj\u00eb kontroll n\u00eb kufijt\u00eb e slice-it brenda ciklit ton\u00eb m\u00eb t\u00eb nxeht\u00eb. E v\u00ebrteta \u00ebsht\u00eb se Go \u00ebsht\u00eb nj\u00eb gjuh\u00eb e sigurt, kompajleri \u00ebsht\u00eb i shqet\u00ebsuar q\u00eb tre argumentet e mia (tre slice) kan\u00eb p\u00ebrmasa t\u00eb ndryshme. Sepse at\u00ebher\u00eb do t\u00eb kishte mund\u00ebsi teorike p\u00ebr t\u00eb ndodhur ajo q\u00eb quhet mbushja e tamponit (buffer overflow).<\/p>\n<p>Le t\u00eb qet\u00ebsojm\u00eb kompajlerin, duke i treguar atij se t\u00eb gjith\u00eb slice-t kan\u00eb t\u00eb nj\u00ebjt\u00ebn madh\u00ebsi. Mund ta b\u00ebjm\u00eb k\u00ebt\u00eb duke shtuar nj\u00eb kontroll t\u00eb thjesht\u00eb n\u00eb fillim t\u00eb funksionit ton\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/59b4ce687a11dd653e9f12fc3130d89a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDuke e par\u00eb k\u00ebt\u00eb, kompajleri me k\u00ebnaq\u00ebsi kalon kontrollin, dhe ne p\u00ebrfundojm\u00eb me kursim t\u00eb tjera 500 nanosekonda.<\/p>\n<h2>Batches t\u00eb m\u00ebdha<\/h2>\n<p>\nOK, arrit\u00ebm t\u00eb nxjerrim ndonj\u00eb performanc\u00eb nga implementimi yn\u00eb i thjesht\u00eb, por rezultati n\u00eb t\u00eb v\u00ebrtet\u00eb \u00ebsht\u00eb shum\u00eb m\u00eb i dob\u00ebt se sa mund t\u00eb jet\u00eb me harduerin aktual.<\/p>\n<p>E gjitha q\u00eb po b\u00ebjm\u00eb \u00ebsht\u00eb operacione t\u00eb baza bitore, dhe procesor\u00ebt tan\u00eb i kryejn\u00eb k\u00ebto operacione shum\u00eb efikas. Por, fatkeq\u00ebsisht, ne 'ushqejm\u00eb' procesorin ton\u00eb me cop\u00ebza shum\u00eb t\u00eb vogla pune. Funksionet tona kryejn\u00eb operacione n\u00eb bajta. Mund ta p\u00ebrmir\u00ebsojm\u00eb shum\u00eb leht\u00eb kodin ton\u00eb q\u00eb t\u00eb punoj\u00eb me cop\u00ebza 8-bajt\u00ebshe, duke p\u00ebrdorur slice UInt64.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/8d1b60ba4b7046c836601631cadd0b6a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi\u00e7 e shihni, kjo ndryshim e vog\u00ebl e p\u00ebrshpejton programin ton\u00eb n\u00eb tet\u00eb her\u00eb duke rritur batch-in n\u00eb tet\u00eb her\u00eb. Fitimi, mund t\u00eb thuhet, \u00ebsht\u00eb linear.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/0fc663412d04dd38b927de5c8776f69d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Implementimi n\u00eb assembler<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/b3ef133167b89da983356b1c7389aecd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor kjo nuk \u00ebsht\u00eb fundi. Procesor\u00ebt tan\u00eb mund t\u00eb punojn\u00eb me cop\u00ebza 16, 32 dhe madje edhe 64 bajt. K\u00ebto operacione 't\u00eb gjera' quhen single instruction multiple data (SIMD; nj\u00eb instruktion, shum\u00eb t\u00eb dh\u00ebna), dhe procesi p\u00ebr t\u00eb transformuar kodin n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb p\u00ebrdor\u00eb k\u00ebto operacione quhet vektorizim.<\/p>\n<p>Fatkeq\u00ebsisht, kompajleri Go nuk \u00ebsht\u00eb nj\u00eb student i shk\u00eblqyer n\u00eb vektorizim. Aktualisht, m\u00ebnyra e vetme p\u00ebr t\u00eb vektorizuar kodin n\u00eb Go \u00ebsht\u00eb t\u00eb marr\u00ebsh t\u00eb dh\u00ebnat e operacionit manualisht duke p\u00ebrdorur assembler-in Go.<\/p>\n<p><img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/91278be45df67e1f9572d68fab7ebad1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAssembler-i Go \u00ebsht\u00eb nj\u00eb krijes\u00eb e \u00e7uditshme. Ju me siguri e dini se assembler-i \u00ebsht\u00eb di\u00e7ka shum\u00eb e lidhur me arkitektur\u00ebn e kompjuterit p\u00ebr t\u00eb cilin shkruani, por n\u00eb Go nuk \u00ebsht\u00eb k\u00ebshtu. Assembler-i Go \u00ebsht\u00eb m\u00eb shum\u00eb si IRL (intermediate representation language) ose nj\u00eb gjuh\u00eb p\u00ebrfaq\u00ebsimi t\u00eb mes\u00ebm: \u00ebsht\u00eb praktikisht platform\u00eb e pavarur. Rob Pike mbajti nj\u00eb prezantim t\u00eb shk\u00eblqyer <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KINIAgRpkDA\">prezentim<\/a><\/noindex> n\u00eb k\u00ebt\u00eb tem\u00eb disa vjet m\u00eb par\u00eb n\u00eb GopherCon n\u00eb Denver.<\/p>\n<p>P\u00ebrve\u00e7 k\u00ebsaj, Go p\u00ebrdor nj\u00eb format t\u00eb pazakont\u00eb Plan 9, q\u00eb ndryshon nga formatet e njohura AT&amp;T dhe Intel.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/526f75eb18edfc2f851f2725e9d6f69e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMund t\u00eb thuhet me besim se t\u00eb shkruash assembler Go me dor\u00eb nuk \u00ebsht\u00eb aktiviteti m\u00eb arg\u00ebtues.<\/p>\n<p>Por, fatmir\u00ebsisht, tashm\u00eb ka dy mjete t\u00eb nivelit t\u00eb lart\u00eb q\u00eb na ndihmojn\u00eb n\u00eb shkruarjen e assembler-it Go: PeachPy dhe avo. T\u00eb dyja mjetet gjenerojn\u00eb assembler Go nga kod m\u00eb t\u00eb lart\u00eb t\u00eb shkruar n\u00eb Python dhe Go p\u00ebrkat\u00ebsisht.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/b8a7aa2c585b805e9b1f2ada186b84e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebto mjete thjeshtojn\u00eb gj\u00ebrat si alokimi i regjistrit (zgjedhja e regjistrit t\u00eb procesorit), shkruarja e cikleve, dhe n\u00eb p\u00ebrgjith\u00ebsi e thjeshtojn\u00eb procesin e hyrjes n\u00eb bot\u00ebn e programimit assembler n\u00eb Go.<\/p>\n<p>Ne do t\u00eb p\u00ebrdorim avo, k\u00ebshtu q\u00eb programet tona do t\u00eb jen\u00eb pothuajse si programet normale n\u00eb Go.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/128e4adef14e5f2cf00fb5b6302ef58e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKjo \u00ebsht\u00eb nj\u00eb shembull shum\u00eb i thjesht\u00eb i nj\u00eb programi avo. Ne kemi nj\u00eb funksion main() q\u00eb p\u00ebrcakton brenda vetes nj\u00eb funksion Add(), ku synimi \u00ebsht\u00eb t\u00eb mbledh\u00eb dy numra. K\u00ebtu ka funksione ndihm\u00ebse p\u00ebr t\u00eb marr\u00eb parametrat sipas emrit dhe p\u00ebr t\u00eb marr\u00eb nj\u00eb nga regjistrat e procesorit t\u00eb lir\u00eb dhe t\u00eb p\u00ebrshtatsh\u00ebm. \u00c7do operacion t\u00eb procesorit ka nj\u00eb funksion p\u00ebrkat\u00ebs n\u00eb avo, si\u00e7 tregohet nga ADDQ. Dhe n\u00eb fund, shohim funksionin ndihm\u00ebs p\u00ebr t\u00eb ruajtur vler\u00ebn e rezultatit.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/01ccaa6aa6d394ef598ea2dbc9257d87.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDuke thirrur go generate, ne do t\u00eb ekzekutojm\u00eb programin n\u00eb avo dhe p\u00ebrfundimisht do t\u00eb gjenerohen dy skedar\u00eb:<\/p>\n<ul>\n<li>add.s me kodin e rezultuar n\u00eb Go-assembly;\n<\/li>\n<li>stub.go me tituj funksionesh p\u00ebr lidhjen e dy bot\u00ebve: Go dhe assembly.\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/72a9443776ecf45eef6fb97a4e08acba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani, kur kemi par\u00eb se \u00e7far\u00eb b\u00ebn dhe si funksionon avo, le t\u00eb shohim funksionet tona. Kam realizuar si versionet skalar, ashtu edhe ato vektoriale (SIMD).<\/p>\n<p>M\u00eb par\u00eb, le t\u00eb shohim versionet skalar.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ec31dbb8b97b9d7c1012a120fa18cdaf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAshtu si n\u00eb shembullin e m\u00ebparsh\u00ebm, ne k\u00ebrkojm\u00eb t\u00eb na sigurohet nj\u00eb regjistr\u00eb t\u00eb lir\u00eb dhe t\u00eb duhur t\u00eb p\u00ebrgjithsh\u00ebm, ne nuk kemi nevoj\u00eb t\u00eb llogarisim zhvendosjet dhe madh\u00ebsit\u00eb p\u00ebr argumentet. T\u00eb gjitha k\u00ebto i b\u00ebn avo p\u00ebr ne.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/88085e927dd943ea0f808a28fb3ccf9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00eb par\u00eb kemi p\u00ebrdorur etiketat dhe goto (ose skenar\u00eb) p\u00ebr t\u00eb p\u00ebrmir\u00ebsuar performanc\u00ebn dhe p\u00ebr t\u00eb mashtruar kompajlerin Go, por tani po e b\u00ebjm\u00eb k\u00ebt\u00eb qysh n\u00eb fillim. Arsyeja \u00ebsht\u00eb se ciklet jan\u00eb nj\u00eb koncept m\u00eb i avancuar. N\u00eb assembly kemi vet\u00ebm etiketat dhe skenar\u00ebt.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/9a4181248eb279d89c1445a820b06649.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKodi i mbetur duhet t\u00eb jet\u00eb tashm\u00eb i njohur dhe i qart\u00eb. Ne po imitojm\u00eb ciklin me etiketa dhe skenar\u00eb, marrim nj\u00eb pjes\u00eb t\u00eb vog\u00ebl t\u00eb t\u00eb dh\u00ebnave nga dy sllajsat tona, i bashkojm\u00eb ato me nj\u00eb operacion bit\u00ebsh (AND NOT n\u00eb k\u00ebt\u00eb rast) dhe m\u00eb pas vendosim rezultatin n\u00eb sllajsin rezultues. Kaq.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/19275ead27f63092fc6596bed38a8d03.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKjo \u00ebsht\u00eb si duket kodi p\u00ebrfundimtar n\u00eb assembly. Ne nuk keni pasur nevoj\u00eb t\u00eb llogarisim zhvendosjet dhe madh\u00ebsit\u00eb (gj\u00eb q\u00eb \u00ebsht\u00eb theksuar me t\u00eb gjelb\u00ebr) ose t\u00eb monitorojm\u00eb regjistrat e p\u00ebrdorur (theksuar me t\u00eb kuqe).<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ed68528a6f852634a5b536670c6315f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse krahasojm\u00eb performanc\u00ebn e implementimit n\u00eb assembly me performanc\u00ebn e implementimit m\u00eb t\u00eb mir\u00eb n\u00eb Go, ne do t\u00eb shohim se ato jan\u00eb t\u00eb nj\u00ebjta. Dhe kjo \u00ebsht\u00eb e parashikueshme. Sepse ne nuk b\u00ebm\u00eb asgj\u00eb t\u00eb ve\u00e7ant\u00eb - thjesht riprodhuam at\u00eb q\u00eb do t\u00eb b\u00ebnte kompajleri Go.<\/p>\n<p>P\u00ebr fat t\u00eb keq, ne nuk mund t\u00eb detyrojm\u00eb kompajlerin t\u00eb b\u00ebj\u00eb inlinin e funksioneve tona t\u00eb shkruara n\u00eb assembly. Kompajleri Go aktualisht nuk ka k\u00ebt\u00eb mund\u00ebsi, megjithat\u00eb k\u00ebrkesa p\u00ebr ta shtuar at\u00eb ekziston prej nj\u00eb kohe t\u00eb gjat\u00eb.<\/p>\n<p>Pik\u00ebrisht p\u00ebr k\u00ebt\u00eb arsye \u00ebsht\u00eb e pamundur t\u00eb fitojm\u00eb ndonj\u00eb p\u00ebrfitim nga funksionet e vogla n\u00eb assembly. Duhet t\u00eb shkruajm\u00eb ose funksione t\u00eb m\u00ebdha, ose t\u00eb p\u00ebrdorim paket\u00ebn e re math\/bits, ose t\u00eb anashkalojm\u00eb assembly-n.<\/p>\n<p>Tani le t\u00eb shohim versionet vektoriale t\u00eb funksioneve tona.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/7f67c3cc855908fb47c7900d6e5d7f54.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr k\u00ebt\u00eb shembull kam vendosur t\u00eb p\u00ebrdor\u00eb AVX2, k\u00ebshtu q\u00eb ne do t\u00eb p\u00ebrdorim operacionet q\u00eb punojn\u00eb me cop\u00ebza 32-byte. Struktura e kodit \u00ebsht\u00eb shum\u00eb e ngjashme me versionin skalar: ngarkimi i parametrave, k\u00ebrkesa p\u00ebr nj\u00eb regjist\u00ebr t\u00eb p\u00ebrgjithsh\u00ebm t\u00eb lir\u00eb, etj.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/021e0424a0d733ec7db9edeb98ce1f65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb nga risit\u00eb ka t\u00eb b\u00ebj\u00eb me faktin se operacionet m\u00eb t\u00eb gjera vektoriale p\u00ebrdorin regjistra t\u00eb ve\u00e7ant\u00eb t\u00eb gj\u00ebr\u00eb. N\u00eb rastin e cop\u00ebzave 32-byte, k\u00ebta jan\u00eb regjistrat me prefix Y. Kjo \u00ebsht\u00eb arsyeja pse ju shihni funksionin YMM() n\u00eb kod. N\u00ebse do t\u00eb p\u00ebrdorja AVX-512 me cop\u00ebza 64-bit, at\u00ebher\u00eb prefixi do t\u00eb ishte Z.<\/p>\n<p>Risia e dyt\u00eb ka t\u00eb b\u00ebj\u00eb me faktin se kam vendosur t\u00eb p\u00ebrdor optimizimin q\u00eb quhet zhvillimi i ciklit (loop unrolling), dometh\u00ebn\u00eb t\u00eb b\u00ebj tet\u00eb operacione cikli manualisht, para se t\u00eb hidhem n\u00eb fillimin e ciklit. Ky optimizim zvog\u00eblon numrin e deg\u00ebzimeve (branching) n\u00eb kod, dhe ai \u00ebsht\u00eb i kufizuar nga numri i regjistrave t\u00eb lir\u00eb q\u00eb kemi n\u00eb dispozicion.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/f54631d9e8c69f6f70ecace3133ae1e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNd\u00ebrsa, \u00e7far\u00eb \u00ebsht\u00eb p\u00ebr performanc\u00ebn? Ajo \u00ebsht\u00eb e shk\u00eblqyer! Kemi arritur nj\u00eb p\u00ebrshpejtim rreth shtat\u00eb her\u00eb krahasuar me zgjidhjen m\u00eb t\u00eb mir\u00eb n\u00eb Go. Impressive, apo jo?<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/d7e85c933eecb243cfb49225b4d92c6c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor edhe kjo implementim potencialisht mund t\u00eb optimizohet duke p\u00ebrdorur AVX-512, pr\u00eb-fetching ose JIT (just-in-time compiler) p\u00ebr planifikuesin e k\u00ebrkesave. Por kjo \u00ebsht\u00eb sigurisht nj\u00eb tem\u00eb p\u00ebr nj\u00eb prezantim t\u00eb ve\u00e7ant\u00eb.<\/p>\n<h2>Problemet e indekseve bitmap<\/h2>\n<p>\nTani q\u00eb kemi shqyrtuar implementimin e thjesht\u00eb t\u00eb indekseve bitmap n\u00eb Go dhe shum\u00eb m\u00eb t\u00eb performuesh\u00ebm n\u00eb assembly, le t\u00eb flasim p\u00ebrse indekset bitmap p\u00ebrdoren kaq rrall\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/83d36a5c92ba90fd680fe8afb6cfc11f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb studimet e vjetra shkencore p\u00ebrmenden tre probleme t\u00eb indekseve bitmap, por studimet e reja shkencore dhe un\u00eb pretendojm\u00eb se ato tashm\u00eb nuk jan\u00eb t\u00eb vlefshme. Nuk do t\u00eb thellohemi shum\u00eb n\u00eb secil\u00ebn nga k\u00ebto probleme, por do t'i shqyrtojm\u00eb ato nga sip\u00ebr.<\/p>\n<h2>Problemi i kardinalitetit t\u00eb lart\u00eb<\/h2>\n<p>\nPra, na thuhet se indeks\u00ebt bitmap funksionojn\u00eb vet\u00ebm p\u00ebr fushat me kardinalitet t\u00eb ul\u00ebt, pra ato q\u00eb kan\u00eb pak vlera (p.sh., gjinia ose ngjyra e syve), dhe arsyeja \u00ebsht\u00eb se paraqitja e zakonshme e k\u00ebtyre fushave (nj\u00eb bit p\u00ebr vler\u00eb) do t\u00eb merrte shum\u00eb hap\u00ebsir\u00eb n\u00eb rastin e kardinalitetit t\u00eb lart\u00eb, dhe madje, k\u00ebta indekse bitmap do t\u00eb ishin t\u00eb mbushur dob\u00ebt (rrall\u00eb).<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/0787efc4d2cb4ea4d404ca7888b33697.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/44ab4bc7c25d14fe2f53caf5d9da399d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNdonj\u00ebher\u00eb mund t\u00eb p\u00ebrdorim nj\u00eb paraqitje tjet\u00ebr, p.sh., at\u00eb standard q\u00eb p\u00ebrdorim p\u00ebr t\u00eb paraqitur numrat. Por \u00ebsht\u00eb pik\u00ebrisht shfaqja e algoritmeve t\u00eb kompresimit q\u00eb ndryshoi gjith\u00e7ka. Gjat\u00eb dy dekadave t\u00eb fundit, shkenc\u00ebtar\u00ebt dhe hulumtuesit kan\u00eb krijuar shum\u00eb algoritme kompresimi p\u00ebr bitmap-et. Avantazhi kryesor i tyre \u00ebsht\u00eb se nuk \u00ebsht\u00eb e nevojshme t\u00eb dekompresojm\u00eb bitmap-et p\u00ebr t\u00eb kryer operacione bitore \u2014 mund t\u00eb kryejm\u00eb operacione bitore direkt mbi bitmap-et e kompresuar.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/ecb54fbf15aa11271bbbab01ecbda880.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS\u00eb fundmi, kan\u00eb filluar t\u00eb shfaqen edhe qasje hibride, si\u00e7 jan\u00eb bitmap-et roaring. Ato p\u00ebrdorin n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb tre p\u00ebrfaq\u00ebsime t\u00eb ndryshme p\u00ebr bitmap-et \u2014 n\u00eb thelb bitmap-et, masa dhe t\u00eb ashtuquajturat bit runs \u2014 dhe balancojn\u00eb midis tyre p\u00ebr t\u00eb maksimizuar performanc\u00ebn dhe minimizuar konsumimin e memories.<\/p>\n<p>Mund t\u00eb takoni bitmap-et roaring n\u00eb aplikacionet m\u00eb t\u00eb njohura. Tani ekziston nj\u00eb num\u00ebr i madh implementimesh p\u00ebr gjuh\u00eb t\u00eb ndryshme programimi, duke p\u00ebrfshir\u00eb m\u00eb shum\u00eb se tre implementime p\u00ebr Go.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/de2adfebc431ff48c996247b453f02ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb tjet\u00ebr qasje q\u00eb mund t\u00eb na ndihmoj\u00eb t\u00eb p\u00ebrballojm\u00eb kardinalitetin e lart\u00eb quhet grupimi (binning). Imagjinoni se keni nj\u00eb fush\u00eb q\u00eb p\u00ebrfaq\u00ebson rritjen e nj\u00eb personi. Rritja \u00ebsht\u00eb nj\u00eb num\u00ebr me pik\u00eb t\u00eb l\u00ebvizshme, por ne, njer\u00ebzit, nuk mendojm\u00eb k\u00ebshtu. P\u00ebr ne, nuk ka ndonj\u00eb ndryshim midis rritjes 185.2 cm dhe 185.3 cm.<\/p>\n<p>K\u00ebshtu, mund t\u00eb grupojm\u00eb vlerat e ngjashme n\u00eb grupe brenda 1 cm.<\/p>\n<p>Dhe n\u00ebse dim\u00eb se shum\u00eb pak njer\u00ebz kan\u00eb rritje m\u00eb t\u00eb vog\u00ebl se 50 cm dhe m\u00eb t\u00eb madhe se 250 cm, at\u00ebher\u00eb ne mund t\u00eb kthejm\u00eb nj\u00eb fush\u00eb me kardinalitet t\u00eb pafund n\u00eb nj\u00eb fush\u00eb me kardinalitet rreth 200 vlerash.<\/p>\n<p>Sigurisht, n\u00ebse nevojitet, mund t\u00eb b\u00ebjm\u00eb filtrimin shtes\u00eb pas k\u00ebsaj.<\/p>\n<h2>Problemi i kapacitetit t\u00eb lart\u00eb<\/h2>\n<p>\nProblemi tjet\u00ebr me indeks\u00ebt bitmap \u00ebsht\u00eb se p\u00ebrdit\u00ebsimi i tyre mund t\u00eb jet\u00eb shum\u00eb i shtrenjt\u00eb.<\/p>\n<p>Bashk\u00ebt e dh\u00ebnave duhet t\u00eb lejojn\u00eb p\u00ebrdit\u00ebsimin e t\u00eb dh\u00ebnave n\u00eb momentin kur potencialisht qindra k\u00ebrkesa t\u00eb tjera po k\u00ebrkojn\u00eb mbi k\u00ebto t\u00eb dh\u00ebna. Na duhen bllokime p\u00ebr t\u00eb shmangur problemet me qasjen e p\u00ebrbashk\u00ebt mbi t\u00eb dh\u00ebnat ose probleme t\u00eb tjera t\u00eb qasjes. Dhe atje ku ka nj\u00eb bllok t\u00eb madh, aty ka nj\u00eb problem \u2014 kontestimi i bllokut, kur ky bllok b\u00ebhet ngushtic\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/0ae1bf925542d286f8b7b245c160a35e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKy problem mund t\u00eb zgjidhet ose t\u00eb shmanget p\u00ebrmes shardingut ose p\u00ebrdorimit t\u00eb indeks\u00ebve me versi\u00f3ne.<\/p>\n<p>Shardingu \u00ebsht\u00eb di\u00e7ka e thjesht\u00eb dhe e njohur. Mund t\u00eb b\u00ebni sharding t\u00eb indeksit bitmap ashtu si\u00e7 do t\u00eb sharding-ronit t\u00eb dh\u00ebna t\u00eb tjera. N\u00eb vend t\u00eb nj\u00eb blloku t\u00eb madh, do t\u00eb merrni shum\u00eb blloqe t\u00eb vogla, duke eliminuar k\u00ebshtu kontestimin e bllokut.<\/p>\n<p>M\u00ebnyra e dyt\u00eb p\u00ebr t\u00eb zgjidhur problemin \u00ebsht\u00eb p\u00ebrdorimi i indeks\u00ebve me version. Mund t\u00eb keni nj\u00eb kopje t\u00eb indeksit q\u00eb p\u00ebrdorni p\u00ebr k\u00ebrkimin ose leximin, dhe nj\u00eb tjet\u00ebr p\u00ebr shkruajtur ose p\u00ebrdit\u00ebsuar. Dhe \u00e7do her\u00eb pas nj\u00eb intervali t\u00eb caktuar (p.sh., \u00e7do 100 ms ose 500 ms) i kopjoni ato dhe i nd\u00ebrrojn\u00eb vendet. Sigurisht, ky qasje \u00ebsht\u00eb e aplikueshme vet\u00ebm n\u00eb ato raste kur aplikacioni juaj mund t\u00eb punoj\u00eb me nj\u00eb indeks k\u00ebrkimi paksa pas.<\/p>\n<p>K\u00ebto dy qasje mund t\u00eb p\u00ebrdoren nj\u00ebkoh\u00ebsisht: mund t\u00eb keni nj\u00eb indeks t\u00eb ndar\u00eb dhe me versione.<\/p>\n<h2>K\u00ebrkesat m\u00eb t\u00eb nd\u00ebrlikuara<\/h2>\n<p>Problemi i fundit me indeks\u00ebt bitmap \u00ebsht\u00eb se, si\u00e7 na thuhet, ata nuk funksionojn\u00eb mir\u00eb me tipe m\u00eb t\u00eb nd\u00ebrlikuara k\u00ebrkesash, si p.sh. k\u00ebrkesat \"n\u00eb interval\".<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, n\u00ebse mendoni, operacionet bitore si AND, OR, etj., nuk jan\u00eb shum\u00eb t\u00eb p\u00ebrshtatshme p\u00ebr k\u00ebrkesat si \"M\u00eb trego hotelet me \u00e7mimin e dhom\u00ebs nga 200 deri n\u00eb 300 dollar\u00eb p\u00ebr nat\u00eb\".<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/7bc2e129cad46fb5875c2b3018c39ff7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb zgjidhje naive dhe shum\u00eb e pamenduar do t\u00eb ishte t\u00eb merrni rezultatet p\u00ebr \u00e7do vler\u00eb dollar\u00ebsh dhe t'i bashkoni ato me nj\u00eb operacion bitor OR.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/b9f8fc7945caa1866f8e0cfa8a04bd98.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb zgjidhje pak m\u00eb e sakt\u00eb do t\u00eb ishte t\u00eb p\u00ebrdorim grupimin. P\u00ebr shembull, n\u00eb grupe prej 50 dollar\u00ebsh. Kjo do ta p\u00ebrshpejtonte procesin ton\u00eb 50 her\u00eb.<\/p>\n<p>Por problemi gjithashtu zgjidhet leht\u00ebsisht duke p\u00ebrdorur nj\u00eb paraqitje t\u00eb krijuar ve\u00e7an\u00ebrisht p\u00ebr k\u00ebt\u00eb lloj k\u00ebrkesash. N\u00eb punimet shkencore, ajo quhet bitmap-e t\u00eb koduara n\u00eb interval.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/644a420628b21f220a7af1ff15c4031f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb k\u00ebt\u00eb paraqitje, ne nuk vendosim vet\u00ebm nj\u00eb bit p\u00ebr ndonj\u00eb vler\u00eb (p.sh., 200), por vendosim k\u00ebt\u00eb vler\u00eb dhe gjith\u00e7ka m\u00eb lart\u00eb. 200 dhe m\u00eb lart. E nj\u00ebjta gj\u00eb p\u00ebr 300: 300 dhe m\u00eb lart. Dhe k\u00ebshtu me radh\u00eb.<\/p>\n<p>Duke k\u00ebt\u00eb pamje, ne mund t\u00eb p\u00ebrgjigjemi ndaj k\u00ebtij lloji t\u00eb k\u00ebrkimit duke kaluar n\u00ebp\u00ebr indeksin vet\u00ebm dy her\u00eb. Fillimisht do t\u00eb marrim nj\u00eb list\u00eb hotelesh ku \u00e7mimi i dhom\u00ebs \u00ebsht\u00eb m\u00eb pak se 300 dollar\u00eb, dhe m\u00eb pas do t'i heqim ato ku \u00e7mimi i dhom\u00ebs \u00ebsht\u00eb m\u00eb pak se 199 dollar\u00eb. P\u00ebrfunduar.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/cc2bb58d7d7a51495c62ec7da81e2d12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDo t\u00eb habiteni, por edhe k\u00ebrkimet gjeografike jan\u00eb t\u00eb mundshme duke p\u00ebrdorur bitmap-indekset. Truku q\u00ebndron n\u00eb p\u00ebrdorimin e paraqitjes gjeografike, e cila rrethon koordinat\u00ebn tuaj me nj\u00eb figur\u00eb gjeometrike. P\u00ebr shembull, S2 nga Google. Figura duhet t\u00eb jet\u00eb e mundur t\u00eb p\u00ebrfaq\u00ebsohet si tre ose m\u00eb shum\u00eb linja q\u00eb prekin nj\u00ebra-tjetr\u00ebn, t\u00eb cilat mund t\u00eb num\u00ebrohen. K\u00ebshtu, ne do t\u00eb jemi n\u00eb gjendje ta kthejm\u00eb k\u00ebrkes\u00ebn ton\u00eb gjeografike n\u00eb disa k\u00ebrkesa \"n\u00eb interval\" (p\u00ebr k\u00ebto linja t\u00eb num\u00ebruara).<\/p>\n<h2>Zgjidhje t\u00eb gatshme<\/h2>\n<p>\nShpresoj q\u00eb t\u00eb keni marr\u00eb pak interes dhe t\u00eb keni shtuar nj\u00eb mjet tjet\u00ebr t\u00eb dobish\u00ebm n\u00eb arsenalin tuaj. N\u00ebse ndonj\u00ebher\u00eb do t'ju nevojitet t\u00eb b\u00ebni di\u00e7ka t\u00eb ngjashme, do t\u00eb dini se ku t\u00eb shikoni.<\/p>\n<p>Megjithat\u00eb, nuk t\u00eb gjith\u00eb kan\u00eb koh\u00ebn, durimin dhe burimet p\u00ebr t\u00eb krijuar bitmap-indekse nga e para. Ve\u00e7an\u00ebrisht ato m\u00eb t\u00eb avancuara, duke p\u00ebrdorur SIMD, p\u00ebr shembull.<\/p>\n<p>N\u00eb fat t\u00eb mir\u00eb, ka disa zgjidhje t\u00eb gatshme q\u00eb do t'ju ndihmojn\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/817b47cb189a758756b602ec9cf319e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Roaring bitmaps<\/h2>\n<p>\nS\u00eb pari, ka biblotek\u00ebn e famshme roaring bitmaps, p\u00ebr t\u00eb cil\u00ebn kam folur m\u00eb par\u00eb. Ajo p\u00ebrmban t\u00eb gjitha en\u00eb dhe operacione bit q\u00eb do t'ju nevojiten p\u00ebr t\u00eb krijuar nj\u00eb bitmap-indeks t\u00eb plot\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/57f61a51485c174666b52dc2063fabe8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFatkeq\u00ebsisht, p\u00ebr momentin asnj\u00eb nga realizimet n\u00eb Go nuk p\u00ebrdorin SIMD, dhe k\u00ebshtu, realizimet n\u00eb Go jan\u00eb m\u00eb pak efikase se ato n\u00eb C, p\u00ebr shembull.<\/p>\n<h2>Pilosa<\/h2>\n<p>\nNj\u00eb produkt tjet\u00ebr q\u00eb mund t'ju ndihmoj\u00eb \u00ebsht\u00eb DB Pilosa, e cila n\u00eb thelb ka vet\u00ebm bitmap-indekse. Ky \u00ebsht\u00eb nj\u00eb zgjidhje relativisht e re, por po fiton shpesh zemrat me nj\u00eb rit\u00ebm t\u00eb madh.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/d3870a979e1e73d093fe5d5e9bb71cd8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPilosa p\u00ebrdor roaring bitmaps brenda saj dhe ju jep mund\u00ebsin\u00eb p\u00ebr t'i p\u00ebrdorur ato, duke thjeshtuar dhe shpjeguar t\u00eb gjitha ato gj\u00ebra p\u00ebr t\u00eb cilat kam folur m\u00eb par\u00eb: grumbullim, bitmap-e t\u00eb koduar me interval, konceptin e fush\u00ebs dhe t\u00eb tjer\u00eb.<\/p>\n<p>Le t\u00eb hedhim nj\u00eb shikim t\u00eb shpejt\u00eb n\u00eb nj\u00eb shembull t\u00eb p\u00ebrdorimit t\u00eb Pilosa p\u00ebr t'u p\u00ebrgjigjur n\u00eb nj\u00eb pyetje q\u00eb ju \u00ebsht\u00eb njohur.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/dfee7abfd653cc19d9aa8b64c64f3e4e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nShembulli \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me at\u00eb q\u00eb keni par\u00eb m\u00eb par\u00eb. Ne krijojm\u00eb nj\u00eb klient p\u00ebr serverin Pilosa, krijojm\u00eb nj\u00eb indeks dhe fushat e nevojshme, pastaj mbushim fushat tona me t\u00eb dh\u00ebna aksidente me probabilitete dhe, p\u00ebrfundimisht, ekzekutojm\u00eb k\u00ebrkes\u00ebn e njohur.<\/p>\n<p>Pas k\u00ebsaj, ne p\u00ebrdorim NOT n\u00eb fush\u00ebn \"e shtrenjt\u00eb\", pastaj kryq\u00ebzojm\u00eb rezultatin (ose AND-ojm\u00eb) me fush\u00ebn \"terace\" dhe me fush\u00ebn \"rezervime\". Dhe p\u00ebrfundimisht, marrim rezultatin p\u00ebrfundimtar.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/8d66c6d68019c2297b6c15b700f06a3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nShpresoj shum\u00eb q\u00eb n\u00eb t\u00eb ardhmen e af\u00ebrt n\u00eb DB-t\u00eb si MySQL dhe PostgreSQL t\u00eb ket\u00eb edhe k\u00ebt\u00eb lloj t\u00eb ri indeksesh \u2013 bitmap-indekse.<br \/>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/7a8e33d576c7fb6376a173ee038b4206.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>P\u00ebrfundimi<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indeksat Bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi t\u00eb pabesueshme\" src=\"\/wp-content\/uploads\/2019\/05\/c62caa9ad6f2d96056c80326f4fa9a0d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse nuk keni fjetur ende, faleminderit. M\u00eb duhej t\u00eb preka shum\u00eb tema me kusht p\u00ebr koh\u00ebn e kufizuar, por shpresoj se prezantimi ishte i dobish\u00ebm dhe ndoshta edhe motivues.<\/p>\n<p>\u00cbsht\u00eb mir\u00eb t\u00eb dini p\u00ebr bitmap-indekset, edhe n\u00ebse p\u00ebr momentin nuk ju nevojiten. Le t'i kemi ato si nj\u00eb mjet tjet\u00ebr n\u00eb kutin\u00eb tuaj.<\/p>\n<p>Ne kemi shqyrtuar disa truke p\u00ebr rritjen e performanc\u00ebs p\u00ebr Go dhe ato gj\u00ebra q\u00eb kompileri Go ende nuk i menaxhon mir\u00eb. Kjo \u00ebsht\u00eb absolutisht di\u00e7ka e dobishme p\u00ebr \u00e7do programues Go.<\/p>\n<p>Kjo \u00ebsht\u00eb gjith\u00e7ka q\u00eb doja t\u00eb flisja. Faleminderit!<br \/>\n<br \/>Burimi: <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 5.0.0.1 - 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\/sq\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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-indekset n\u00eb Go: k\u00ebrkimi me shpejt\u00ebsi t\u00eb \u00e7mendur | ProHoster","description":"Fjalimi hyr\u00ebs Un\u00eb e mbajta k\u00ebt\u00eb prezantim n\u00eb anglisht n\u00eb konferenc\u00ebn GopherCon Russia 2019 n\u00eb Mosk\u00eb dhe n\u00eb rusisht n\u00eb mitap n\u00eb Nizhny Novgorod. Fjalimi ka t\u00eb b\u00ebj\u00eb me bitmap-indeksin \u2013 m\u00eb pak t\u00eb zakonsh\u00ebm se B-tree, por jo m\u00eb pak interesant. Po ndaj me ju regjistrimin e prezantimit n\u00eb konferenc\u00eb n\u00eb anglisht dhe transkriptin n\u00eb rusisht. Ne do t\u00eb shqyrtojm\u00eb,","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/bitmap-indeksy-v-go-poisk-na-dikoj-skorosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/33793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=33793"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/33793\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/25469"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=33793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=33793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=33793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}