{"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":"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/86ef928e6741022b2c0e5885a031408a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Fjal\u00eb hyr\u00ebse<\/h2>\n<p>\nUn\u00eb e prezantova k\u00ebt\u00eb dokument n\u00eb anglisht n\u00eb konferenc\u00ebn GopherCon Rusia 2019 n\u00eb Mosk\u00eb dhe n\u00eb rusisht n\u00eb mitap n\u00eb Nizhny Novgorod. Fjala \u00ebsht\u00eb p\u00ebr indeksin bitmap \u2014 m\u00eb pak i zakonsh\u00ebm se B-tree, por jo m\u00eb pak interesant. Po ndaja <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/WvlUH6MjUuI?list=PL3xVZC4USRNSO_kb2lh_J_no6C-KJ7Phg\">regjistrimin<\/a><\/noindex> e fjalimit n\u00eb konferenc\u00eb n\u00eb anglisht dhe transkriptin tekstual n\u00eb rusisht.<\/p>\n<p>Ne do t\u00eb shqyrtojm\u00eb se si funksionon indeksi bitmap, kur \u00ebsht\u00eb m\u00eb i mir\u00eb, kur \u00ebsht\u00eb m\u00eb inferior ndaj indekseve t\u00eb tjera dhe n\u00eb cilat raste \u00ebsht\u00eb ndjesh\u00ebm m\u00eb i shpejt\u00eb se ato; do t\u00eb shohim n\u00eb cilat DBMS-popullore tashm\u00eb ekzistojn\u00eb indekse bitmap; do t\u00eb p\u00ebrpiqemi t\u00eb shkruajm\u00eb t\u00eb tonin n\u00eb Go. Dhe p\u00ebr \"desert\" do t\u00eb p\u00ebrdorim biblioteka t\u00eb gatshme p\u00ebr t\u00eb krijuar nj\u00eb baz\u00eb t\u00eb dh\u00ebnash specializuar super t\u00eb shpejt\u00eb.<\/p>\n<p>Shpresoj shum\u00eb q\u00eb punimet e mia do t'i dalin t\u00eb vlefshme 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 ora gjasht\u00eb pasdite, ne t\u00eb gjith\u00eb jemi shum\u00eb t\u00eb lodhur. Nj\u00eb koh\u00eb e mrekullueshme 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 kodi burimor k\u00ebtu e aty. \ud83d\ude42<\/p>\n<p>N\u00ebse flasim seriozisht, dokumenti \u00ebsht\u00eb i mbushur me informacion, dhe nuk kemi aq shum\u00eb koh\u00eb. Prandaj, le t\u00eb fillojm\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/e778e13727700f0335a4b5558a0d8db3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSot do t\u00eb flas p\u00ebr k\u00ebt\u00eb:<\/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 dhe p\u00ebrse;\n<\/li>\n<li>nj\u00eb implementim i thjesht\u00eb n\u00eb Go dhe pak luft\u00eb me kompilatorin;\n<\/li>\n<li>nj\u00eb implementim pak m\u00eb pak t\u00eb thjesht\u00eb, por shum\u00eb m\u00eb produktiv n\u00eb Go-assembler;\n<\/li>\n<li>\u00abproblemet\u00bb e indekseve bitmap;\n<\/li>\n<li>implementimet ekzistuese.\n<\/li>\n<\/ul>\n<h2>Pra, \u00e7far\u00eb jan\u00eb indekset?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/b80e5b990c44814afe9150a9a82351fd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIndeksi \u00ebsht\u00eb nj\u00eb struktur\u00eb e ve\u00e7ant\u00eb t\u00eb dh\u00ebnash, q\u00eb ne e ruajm\u00eb dhe e p\u00ebrdit\u00ebsojm\u00eb n\u00eb p\u00ebrputhje me t\u00eb dh\u00ebnat kryesore. P\u00ebrdoret p\u00ebr t\u00eb p\u00ebrshpejtuar k\u00ebrkimin. Pa indekset, 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 kompleksitet linear algoritmik. 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 ngadalt\u00eb. Idealisht, duam t\u00eb arrijm\u00eb nj\u00eb kompleksitet logarimor ose konstant.<\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb tem\u00eb e madhe dhe komplekse, e mbushur me nuanca dhe kompromise, por, duke shqyrtuar disa dekada zhvillim dhe hulumtim t\u00eb bazave t\u00eb ndryshme t\u00eb t\u00eb dh\u00ebnave, jam i gatsh\u00ebm t\u00eb pohoj se ekzistojn\u00eb vet\u00ebm disa qasje t\u00eb p\u00ebrdorura gjer\u00ebsisht p\u00ebr krijimin e indekseve t\u00eb BDs.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 fush\u00ebs s\u00eb k\u00ebrkimit, duke e ndar\u00eb at\u00eb n\u00eb pjes\u00eb m\u00eb t\u00eb vogla.<\/p>\n<p>Zakonisht 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 garderob\u00ebn tuaj, n\u00eb t\u00eb cil\u00ebn ndodhen kuti m\u00eb t\u00eb vogla me materiale t\u00eb ndara sipas temash t\u00eb ndryshme. N\u00ebse ju nevojiten materiale, ju me siguri do t\u00eb k\u00ebrkoni n\u00eb kutin\u00eb me etiket\u00ebn \"Materialet\", dhe jo n\u00eb at\u00eb me etiket\u00ebn \"Biskota\", apo jo?<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/423fac47c748980b18af434644af4dae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e dyt\u00eb p\u00ebrfshin identifikimin e menj\u00ebhersh\u00ebm t\u00eb elementit t\u00eb nevojsh\u00ebm ose grupit t\u00eb elementeve. Ne e b\u00ebjm\u00eb k\u00ebt\u00eb n\u00eb hartat hash ose n\u00eb indekset e rikthimit. P\u00ebrdorimi i hartave hash \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me shembullin e m\u00ebparsh\u00ebm, vet\u00ebm se n\u00eb vend t\u00eb nj\u00eb kutie me kuti, ju keni n\u00eb garderob\u00ebn tuaj shum\u00eb kuti t\u00eb vogla me objekte p\u00ebrfundimtare.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 eliminohet nevoja p\u00ebr k\u00ebrkim. K\u00ebt\u00eb e b\u00ebjm\u00eb me filtra Bloom ose filtra cuckoo. T\u00eb par\u00ebt japin nj\u00eb p\u00ebrgjigje menj\u00ebher\u00eb, duke ju liruar nga nevoja p\u00ebr t\u00eb b\u00ebr\u00eb k\u00ebrkime.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/493bc4f20baacc0a5dc0faf15cc46285.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQasja e fundit p\u00ebrfshin shfryt\u00ebzimin e plot\u00eb t\u00eb kapaciteteve q\u00eb na ofron hardueri modern. K\u00ebt\u00eb e b\u00ebjm\u00eb me indekset bitmap. Po, kur i p\u00ebrdorim, ndonj\u00ebher\u00eb na duhet t\u00eb kalojm\u00eb p\u00ebrmes t\u00eb gjith\u00eb indeksit, por ne e b\u00ebjm\u00eb k\u00ebt\u00eb shum\u00eb efikase.<\/p>\n<p>Si\u00e7 e thash\u00eb, tema e indekseve t\u00eb DB \u00ebsht\u00eb e gjer\u00eb dhe e mbushur me kompromise. Kjo do t\u00eb thot\u00eb se ndonj\u00ebher\u00eb mund t\u00eb p\u00ebrdorim disa qasje nj\u00ebher\u00ebsh: n\u00ebse na nevojitet ta p\u00ebrshpejtojm\u00eb k\u00ebrkimin edhe m\u00eb tej ose n\u00ebse \u00ebsht\u00eb e nevojshme t\u00eb mbulojm\u00eb t\u00eb gjitha llojet e k\u00ebrkimit.<\/p>\n<p>Sot do t'ju tregoj p\u00ebr qasjen m\u00eb pak t\u00eb njohur nga ato t\u00eb p\u00ebrmendura \u2014 p\u00ebr indekset bitmap.<\/p>\n<h2>Kush jam un\u00eb q\u00eb t\u00eb flas p\u00ebr k\u00ebt\u00eb tem\u00eb?<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/42a9d17a507c392bc202254a92dfaf41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn\u00eb punoj si lider i ekipit n\u00eb Badoo (ndoshta ju e njifni m\u00eb mir\u00eb produktin ton\u00eb t\u00eb tjet\u00ebr \u2014 Bumble). Ne tashm\u00eb kemi m\u00eb shum\u00eb se 400 milion p\u00ebrdorues n\u00eb mbar\u00eb bot\u00ebn dhe shum\u00eb funksione q\u00eb meritojn\u00eb q\u00eb t\u00eb gjejn\u00eb \u00e7iftin m\u00eb t\u00eb mir\u00eb p\u00ebr ta. Ne e b\u00ebjm\u00eb k\u00ebt\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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/14f20f3697a20c02f6b3510dc7f0ae4d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIndekset bitmap, si\u00e7 sugjeron edhe emri, p\u00ebrdor bitmap ose bitset p\u00ebr t\u00eb implementuar nj\u00eb indeks k\u00ebrkimi. Nga nj\u00eb lart\u00ebsi zogjsh, ky indeks p\u00ebrb\u00ebhet nga nj\u00eb ose m\u00eb shum\u00eb nga k\u00ebta bitmap, q\u00eb p\u00ebrfaq\u00ebsojn\u00eb entitete t\u00eb ndryshme (si njer\u00ebzit) dhe karakteristikat e tyre ose parametrat (mosh\u00eb, ngjyr\u00eb sysh 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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/f815720330a51b1f0798e45d23160d3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa thuhet se indekset bitmap jan\u00eb m\u00eb t\u00eb p\u00ebrshtatshme dhe shum\u00eb produktive p\u00ebr rastet kur ekziston k\u00ebrkesa q\u00eb bashkon k\u00ebrkesa mbi shum\u00eb kolona me kardinalitet t\u00eb ul\u00ebt (imagjinoni \"ngjyr\u00ebn e syve\" ose \"statusin gjinor\" kundrejt di\u00e7kaje si \"distanca nga qendra e qytetit\"). Por m\u00eb von\u00eb do t'ju tregoj se ato funksionojn\u00eb gjithashtu shum\u00eb mir\u00eb n\u00eb rastin e kolonave me kardinalitet t\u00eb lart\u00eb.<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb nj\u00eb shembull t\u00eb thjesht\u00eb t\u00eb indekseve bitmap.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/33fe23476e0931c10345d7175b83d68b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nImagjinoni se kemi nj\u00eb list\u00eb restorantesh n\u00eb Mosk\u00eb me tipare binar\u00eb si k\u00ebto:<\/p>\n<ul>\n<li>pran\u00eb metro (near metro);\n<\/li>\n<li>ka parkim privat (has private parking);\n<\/li>\n<li>ka tarrac\u00eb (has terrace);\n<\/li>\n<li>pranon rezervime (accepts reservations);\n<\/li>\n<li>\u00ebsht\u00eb i p\u00ebrshtatsh\u00ebm p\u00ebr vegan\u00ebt (vegan friendly);\n<\/li>\n<li>i shtrenjt\u00eb (expensive).\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/fcbad539ea12f79a9d06966ce308637e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe t'i japim \u00e7do restoranti nj\u00eb num\u00ebr rendor, duke filluar nga 0 dhe t\u00eb alokojm\u00eb hap\u00ebsir\u00eb p\u00ebr 6 bitmap (nj\u00eb p\u00ebr secil\u00ebn karakteristik\u00eb). Pastaj ne do t'i mbushim k\u00ebto bitmap n\u00eb var\u00ebsi t\u00eb asaj n\u00ebse restoranti ka k\u00ebt\u00eb pron\u00eb apo jo. N\u00ebse restoranti 4 ka tarrac\u00eb, at\u00ebher\u00eb bita nr. 4 n\u00eb bitmapin \"ka tarrac\u00eb\" do t\u00eb vendoset n\u00eb 1 (n\u00ebse nuk ka tarrac\u00eb, at\u00ebher\u00eb n\u00eb 0).<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/3709c426617d4364f392ee6b68f92b00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani kemi indekset bitmap m\u00eb t\u00eb thjeshta t\u00eb mundshme, dhe mund t'i p\u00ebrdorim ato p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkesa si:<\/p>\n<ul>\n<li>\"M\u00eb trego restorantet q\u00eb jan\u00eb t\u00eb p\u00ebrshtatsh\u00ebm p\u00ebr vegan\u00ebt\";\n<\/li>\n<li>\"M\u00eb trego restorantet e lira me tarrac\u00eb, ku mund t\u00eb rezervoj nj\u00eb tavolin\u00eb.\"\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/90acb0f890686bd52c3db1fc667f0b0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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. Gjith\u00e7ka q\u00eb na nevojitet \u00ebsht\u00eb t\u00eb marrim bitmapin \"\u00ebsht\u00eb i p\u00ebrshtatsh\u00ebm p\u00ebr vegan\u00ebt\" dhe ta kthejm\u00eb at\u00eb n\u00eb nj\u00eb list\u00eb restorantesh, t\u00eb cil\u00ebt biterat e tyre jan\u00eb vendosur.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ef4a5cfd658ff4ef8bc0c638c4522d11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 mbi bitmapin \"i shtrenjt\u00eb\" p\u00ebr t\u00eb marr\u00eb nj\u00eb list\u00eb restorantesh t\u00eb lira, pastaj do ta AND-ojm\u00eb at\u00eb me bitmapin \"mund t\u00eb rezervosh tavolin\u00eb\" dhe m\u00eb pas do ta AND-ojm\u00eb rezultatin me bitmapin \"ka verand\u00eb\". Bitmapi p\u00ebrfundimtar do t\u00eb p\u00ebrmbaj\u00eb nj\u00eb list\u00eb t\u00eb vendeve q\u00eb p\u00ebrputhen me t\u00eb gjitha kriteret tona. N\u00eb k\u00ebt\u00eb shembull ka vet\u00ebm restorantin \"Junosti\".<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/f1cdda0cbf7f15278553899cf876c17e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/126b50e0f622b6e36c461cd74e708c38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKa shum\u00eb teori k\u00ebtu, 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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/406132236c71a4f66ae79957b6e633b3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse e \"gug\u00ebloni\" indeksin bitmap, 90% e p\u00ebrgjigjeve do t\u00eb lidhen n\u00eb nj\u00eb far\u00eb m\u00ebnyre me Oracle DB. Por sigurisht, edhe sistemet e tjera t\u00eb menaxhimit t\u00eb t\u00eb dh\u00ebnave e mb\u00ebshtesin nj\u00eb gj\u00eb t\u00eb till\u00eb, apo jo? Jo krejt. <\/p>\n<p>Le t\u00eb kalojm\u00eb n\u00ebp\u00ebr list\u00ebn e dyshuarve kryesor\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/d18d66451a8a26b0ddf121f8ec0204cd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMySQL ende nuk e mb\u00ebshtet indeksin bitmap, por ka nj\u00eb Propozim p\u00ebr ta shtuar k\u00ebt\u00eb mund\u00ebsi (<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 nga disa 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 fusha bitore t\u00eb thjeshta<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/commands\/bitfield\"> (https:\/\/redis.io\/commands\/bitfield<\/a><\/noindex>) pa mund\u00ebsi p\u00ebr t\u00eb k\u00ebrkuar 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 mund\u00ebsi <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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 erdhi nj\u00eb fqinj i ri: Pilosa. Kjo \u00ebsht\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash e re, jo-relacionale, e shkruar n\u00eb Go. Ajo ka vet\u00ebm indekse bitmap dhe bazohet krejt\u00ebsisht mbi to. Ne 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 indeksat bitmap p\u00ebrdoren kaq rrall\u00eb? Para se t\u00eb p\u00ebrgjigjem n\u00eb k\u00ebt\u00eb pyetje, do t\u00eb doja t'ju tregoj implementimin e nj\u00eb indeksi bitmap shum\u00eb t\u00eb thjesht\u00eb n\u00eb Go.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ae7f4c1a4a740fe709b05dfaee27ac9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBitmapet, n\u00eb thelb, paraqiten thjesht si copa t\u00eb t\u00eb dh\u00ebnave. N\u00eb Go, le t\u00eb p\u00ebrdorim slice t\u00eb bajtave p\u00ebr k\u00ebt\u00eb.<\/p>\n<p>Ne kemi nj\u00eb bitmap p\u00ebr nj\u00eb karakteristik\u00eb restoranti, dhe \u00e7do bit n\u00eb bitmap tregon n\u00ebse nj\u00eb restaurant specifik ka k\u00ebt\u00eb pron\u00eb apo jo.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/1ab628ee15887d6b3c6c99855aa610c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa nevojiten dy funksione ndihm\u00ebse. Nj\u00ebra do t\u00eb p\u00ebrdoret p\u00ebr t\u00eb mbushur bitmapet tona me t\u00eb dh\u00ebna t\u00eb rastit. T\u00eb rastit, por me nj\u00eb probabilitet t\u00eb caktuar q\u00eb restoranti ka secil\u00ebn pron\u00eb. P\u00ebr shembull, mendoj se n\u00eb Mosk\u00eb ka shum\u00eb pak restorante ku nuk mund t\u00eb rezervosh nj\u00eb tavolin\u00eb, dhe m\u00eb duket se rreth 20% e vendeve jan\u00eb t\u00eb p\u00ebrshtatshme p\u00ebr ve\u00e7an\u00ebt.<\/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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ab9c87a0ba63750116e2e7968f842a9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 restorantet e lira q\u00eb kan\u00eb verande dhe ku mund t\u00eb rezervosh nj\u00eb tavolin\u00eb\", na nevojiten dy operacione bitmap: NOT dhe AND.<\/p>\n<p>Mund ta thjeshtojm\u00eb pak kodin ton\u00eb duke p\u00ebrdorur nj\u00eb operacion m\u00eb t\u00eb nd\u00ebrlikuar AND NOT.<\/p>\n<p>Kemi funksione p\u00ebr secil\u00ebn nga k\u00ebto operacione. T\u00eb dy shkojn\u00eb p\u00ebrmes slice-ve, marrin element\u00ebt p\u00ebrkat\u00ebs nga secili, i bashkojn\u00eb ato me operacionin bitmap dhe vendosin rezultatin n\u00eb nj\u00eb slice rezultues.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ec5652a34f0370dfb03df199f341f153.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDhe tani mund t\u00eb p\u00ebrdorim bitmapet dhe funksionet tona p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb k\u00ebrkes\u00ebn e k\u00ebrkimit.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/cf9500ccfe75995a6008191c16729689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKjo performanc\u00eb nuk \u00ebsht\u00eb kaq e lart\u00eb, edhe pse funksionet jan\u00eb shum\u00eb t\u00eb thjeshta dhe kemi kursyer mjaft duke mos u kthyer nj\u00eb slice rezultues t\u00eb ri me \u00e7do thirrje funksioni.<\/p>\n<p>Pasi b\u00ebra disa profilime 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 e funksioneve.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/9092f5ba3940d0a4f3fbfa90b364d716.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nE vetmja gj\u00eb \u00ebsht\u00eb se kompajleri Go ka nj\u00eb frik\u00eb t\u00eb madhe nga ciklet q\u00eb shkojn\u00eb p\u00ebrmes slice-ve dhe refuzon t\u00eb inlinoj\u00eb funksionet q\u00eb p\u00ebrmbajn\u00eb k\u00ebto cikle.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 mashtroj kompajlerin duke p\u00ebrdorur goto n\u00eb vend t\u00eb ciklit, si n\u00eb koh\u00ebt e vjetra.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/5b1c3cb26b923972686047910ecd1c31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/1ca31d12dc90931b674c6a86a4ea23bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe, si\u00e7 e shihni, tani kompajleri g\u00ebzohet kur inlin\u00eb funksionin ton\u00eb! Si rezultat, arrijm\u00eb t\u00eb kursejm\u00eb rreth 2 mikrosekonda. Mjaft mir\u00eb!<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/bdd6735d16082573e600bffe2cdd5662.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNgushtica e dyt\u00eb \u00ebsht\u00eb e dukshme n\u00ebse e shikoni me kujdes daljen e assembler-it. Kompajleri shtoi nj\u00eb kontroll p\u00ebr kufijt\u00eb e slice-it brenda ciklit ton\u00eb m\u00eb t\u00eb nxeht\u00eb. E vetmja gj\u00eb \u00ebsht\u00eb se Go \u00ebsht\u00eb nj\u00eb gjuh\u00eb e sigurt, kompajleri ka frik\u00eb se tre argumentet e mia (tri slice) kan\u00eb p\u00ebrmasa t\u00eb ndryshme. Sepse at\u00ebher\u00eb do t\u00eb ket\u00eb nj\u00eb mund\u00ebsi teorike p\u00ebr ndodhin e ashtuquajturit overflow i buffers.<\/p>\n<p>Le t\u00eb qet\u00ebsojm\u00eb kompilatorin, duke i treguar se t\u00eb gjitha slices 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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/59b4ce687a11dd653e9f12fc3130d89a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDuke e par\u00eb k\u00ebt\u00eb, kompilatori me g\u00ebzim e kalon kontrollin dhe n\u00eb fund ne kursejm\u00eb edhe 500 nanosekonda.<\/p>\n<h2>Bashk\u00ebngjitje t\u00eb m\u00ebdha<\/h2>\n<p>\nOk, kemi arritur t\u00eb nxjerrim nj\u00ebfar\u00eb performanc\u00eb nga implementimi yn\u00eb t\u00eb thjesht\u00eb, por ky rezultat \u00ebsht\u00eb, n\u00eb t\u00eb v\u00ebrtet\u00eb, shum\u00eb m\u00eb i keq se sa \u00ebsht\u00eb e mundur me harduerin aktual.<\/p>\n<p>Gjith\u00e7ka q\u00eb b\u00ebjm\u00eb jan\u00eb operacione themelore bitesh, dhe procesor\u00ebt tan\u00eb i ekzekutojn\u00eb ato shum\u00eb efikasht. Por, fatkeq\u00ebsisht, ne \"ushqejm\u00eb\" procesorin ton\u00eb me pjes\u00eb shum\u00eb t\u00eb vogla pune. Funksionet tona ekzekutojn\u00eb operacione n\u00eb nivel byte. Mund ta rregullojm\u00eb shum\u00eb leht\u00eb kodin ton\u00eb q\u00eb t\u00eb punoj\u00eb me copa 8-byte, duke p\u00ebrdorur slices t\u00eb UInt64.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/8d1b60ba4b7046c836601631cadd0b6a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi\u00e7 e shihni, ky ndryshim i vog\u00ebl e p\u00ebrshpejtoi programin ton\u00eb tet\u00eb her\u00eb p\u00ebr shkak t\u00eb rritjes s\u00eb bashk\u00ebsis\u00eb n\u00eb tet\u00eb her\u00eb. Fitimi mund t\u00eb quhet linear.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 copa 16, 32 dhe madje edhe 64 byte. K\u00ebto operacione \"t\u00eb gjera\" quhen single instruction multiple data (SIMD; nj\u00eb instrukcion, shum\u00eb t\u00eb dh\u00ebna), dhe procesi i konvertimit t\u00eb kodit n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb n\u00eb m\u00ebnyr\u00eb q\u00eb ta p\u00ebrdor\u00eb k\u00ebto operacione quhet vektorizim.<\/p>\n<p>Fatkeq\u00ebsisht, kompilatori Go nuk \u00ebsht\u00eb aspak nj\u00eb student i shk\u00eblqyer n\u00eb vektorizim. Momentalisht, m\u00ebnyra e vetme p\u00ebr vektorizimin e kodit n\u00eb Go \u00ebsht\u00eb ta merrni dhe ta shkruani operacionin manualisht duke p\u00ebrdorur assemblerin Go.<\/p>\n<p><img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/91278be45df67e1f9572d68fab7ebad1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAssembleri Go \u00ebsht\u00eb nj\u00eb krijes\u00eb e \u00e7uditshme. Me siguri e dini q\u00eb assembleri \u00ebsht\u00eb di\u00e7ka q\u00eb \u00ebsht\u00eb shum\u00eb e lidhur me arkitektur\u00ebn e kompjuterit p\u00ebr t\u00eb cil\u00ebn shkruani, por n\u00eb Go nuk \u00ebsht\u00eb k\u00ebshtu. Assembleri Go \u00ebsht\u00eb m\u00eb shum\u00eb si nj\u00eb IRL (intermediate representation language) ose gjuh\u00eb p\u00ebrfaq\u00ebsuese: \u00ebsht\u00eb praktikisht e pavarur nga platforma. Rob Pike b\u00ebri nj\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KINIAgRpkDA\">prezantim t\u00eb shk\u00eblqyer<\/a><\/noindex> n\u00eb k\u00ebt\u00eb tem\u00eb disa vite 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 \u00e7uditsh\u00ebm Plan 9, i cili ndryshon nga formatet e njohura AT&amp;T dhe Intel.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 manualisht assemblerin Go nuk \u00ebsht\u00eb nj\u00eb veprimtari e k\u00ebndshme.<\/p>\n<p>Por, fatmir\u00ebsisht, tashm\u00eb ekzistojn\u00eb dy mjete t\u00eb nivelit t\u00eb lart\u00eb q\u00eb na ndihmojn\u00eb n\u00eb shkruarjen e assemblerit Go: PeachPy dhe avo. T\u00eb dyja mjetet gjenerojn\u00eb Go-assembler nga kod i nivelit m\u00eb t\u00eb lart\u00eb t\u00eb shkruar n\u00eb Python dhe Go p\u00ebrkat\u00ebsisht.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/b8a7aa2c585b805e9b1f2ada186b84e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebto mjete e thjeshtojn\u00eb gj\u00ebra si alokimin e regjistrit (zgjedhja e regjistrit t\u00eb procesorit), shkruhen cikle, dhe n\u00eb p\u00ebrgjith\u00ebsi e leht\u00ebsojn\u00eb procesin e hyrjes n\u00eb bot\u00ebn e programimit n\u00eb 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 programe normale n\u00eb Go.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/128e4adef14e5f2cf00fb5b6302ef58e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJa si duket shembulli m\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(), i cili ka p\u00ebr q\u00ebllim t\u00eb shtoj\u00eb dy numra. K\u00ebtu jan\u00eb funksione ndihm\u00ebs p\u00ebr t\u00eb marr\u00eb parametrat sipas emrit dhe p\u00ebr t\u00eb marr\u00eb nj\u00eb nga regjistrat e lir\u00eb dhe t\u00eb p\u00ebrshtatsh\u00ebm t\u00eb procesorit. \u00c7do operacion n\u00eb procesor ka funksionin e tij p\u00ebrkat\u00ebs n\u00eb avo, si\u00e7 duket nga ADDQ. Dhe p\u00ebr fund, ne shohim nj\u00eb funksion ndihm\u00ebs p\u00ebr ruajtjen e vler\u00ebs rezultuese.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/01ccaa6aa6d394ef598ea2dbc9257d87.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDuke thirrur go generate, do t\u00eb ekzekutojm\u00eb programin n\u00eb avo dhe n\u00eb fund do t\u00eb gjenerohen dy skedar\u00eb:<\/p>\n<ul>\n<li>add.s me kodin rezultues n\u00eb assemblerin Go;\n<\/li>\n<li>stub.go me titujt e funksioneve p\u00ebr lidhjen e dy bot\u00ebve: Go dhe assembler.\n<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/72a9443776ecf45eef6fb97a4e08acba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani, kur kemi par\u00eb se \u00e7far\u00eb dhe si e b\u00ebn avo, le t\u00eb shohim funksionet tona. Un\u00eb kam realizuar dhe versionet skalar dhe vektor (SIMD) t\u00eb funksioneve.<\/p>\n<p>S\u00eb pari, le t\u00eb shohim versionet skalar.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ec31dbb8b97b9d7c1012a120fa18cdaf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSi\u00e7 b\u00ebm\u00eb n\u00eb shembullin e m\u00ebparsh\u00ebm, ne k\u00ebrkojm\u00eb t\u00eb na ofrohet nj\u00eb regjist\u00ebr t\u00eb lir\u00eb dhe t\u00eb sakt\u00eb t\u00eb regjistrave t\u00eb p\u00ebrgjithsh\u00ebm, nuk na nevojitet t\u00eb llogarisim zhvendosjet dhe p\u00ebrmasat p\u00ebr argumentet. T\u00eb gjitha k\u00ebto avo e b\u00ebn p\u00ebr ne.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 k\u00ebrcime) p\u00ebr t\u00eb p\u00ebrmir\u00ebsuar performanc\u00ebn dhe p\u00ebr t\u00eb mashtruar kompilatorin Go, por tani po e b\u00ebjm\u00eb k\u00ebt\u00eb nga fillimi. E v\u00ebrteta \u00ebsht\u00eb se ciklet jan\u00eb nj\u00eb koncept m\u00eb i lart\u00eb. N\u00eb assembler kemi vet\u00ebm etiketa dhe k\u00ebrcime.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 imitojm\u00eb ciklin me etiketa dhe k\u00ebrcime, marrim nj\u00eb pjes\u00eb t\u00eb vog\u00ebl t\u00eb t\u00eb dh\u00ebnave nga dy skedar\u00ebt tan\u00eb, i kombinojm\u00eb ata me nj\u00eb operacion bit i (AND NOT n\u00eb k\u00ebt\u00eb rast) dhe pastaj e vendosim rezultatin n\u00eb skedarin rezultues. Kaq.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/19275ead27f63092fc6596bed38a8d03.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u00ebtu \u00ebsht\u00eb kodi p\u00ebrfundimtar n\u00eb assembler. Nuk na nevojitej t\u00eb llogaritnim zhvendosjet dhe p\u00ebrmasat (t\u00eb theksuara me gjelb\u00ebr) ose t\u00eb kemi kujdes p\u00ebr regjistrat e p\u00ebrdorur (t\u00eb theksuar me t\u00eb kuqe).<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ed68528a6f852634a5b536670c6315f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse e krahasojm\u00eb performanc\u00ebn e implementimit n\u00eb assembler 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 pritshme. Sepse ne nuk b\u00ebm\u00eb asgj\u00eb t\u00eb ve\u00e7ant\u00eb \u2014 ne vet\u00ebm riprodhuam at\u00eb q\u00eb do t\u00eb b\u00ebnte kompileri Go.<\/p>\n<p>Fatkeq\u00ebsisht, ne nuk mund ta detyrojm\u00eb kompilerin t\u00eb bej inlining funksionet tona t\u00eb shkruara n\u00eb assembler. Deri m\u00eb sot, kompileri Go nuk ka nj\u00eb mund\u00ebsi t\u00eb till\u00eb, megjithat\u00eb k\u00ebrkesa p\u00ebr ta shtuar at\u00eb ka qen\u00eb aktive p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb.<\/p>\n<p>Pik\u00ebrisht p\u00ebr k\u00ebt\u00eb arsye, nuk \u00ebsht\u00eb e mundur t\u00eb marrim ndonj\u00eb p\u00ebrfitim nga funksionet e vogla n\u00eb assembler. Na nevojitet ose t\u00eb shkruajm\u00eb funksione m\u00eb t\u00eb m\u00ebdha, ose t\u00eb p\u00ebrdorim paket\u00ebn e re math\/bits, ose t\u00eb anashkalojm\u00eb assemblerin.<\/p>\n<p>Tani le t\u00eb shikojm\u00eb versionet vektoriale t\u00eb funksioneve tona.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/7f67c3cc855908fb47c7900d6e5d7f54.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr k\u00ebt\u00eb shembull, vendosa t\u00eb p\u00ebrdor AVX2, k\u00ebshtu q\u00eb ne do t\u00eb p\u00ebrdorim operacione q\u00eb punojn\u00eb me copa 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 lir\u00eb t\u00eb p\u00ebrgjithsh\u00ebm dhe t\u00eb tjera.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/021e0424a0d733ec7db9edeb98ce1f65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb nga inovacionet e reja ka t\u00eb b\u00ebj\u00eb me at\u00eb se operacionet e gjera vektoriale p\u00ebrdorin regjistra t\u00eb ve\u00e7ant\u00eb t\u00eb gjer\u00eb. N\u00eb rastin e copave 32-byte, k\u00ebto jan\u00eb regjistrat me prefiks Y. Prandaj ju shihni funksionin YMM() n\u00eb kod. N\u00ebse do t\u00eb p\u00ebrdorja AVX-512 me copa 64-bit, prefiksi do t\u00eb ishte Z.<\/p>\n<p>Inovacioni i dyt\u00eb lidhet me faktin se vendosa t\u00eb p\u00ebrdor nj\u00eb optimizim q\u00eb quhet zvog\u00eblim i ciklit (loop unrolling), dometh\u00ebn\u00eb t\u00eb b\u00ebj tet\u00eb operacione cikli manualisht para se t\u00eb hidhem n\u00eb fillim t\u00eb ciklit. Ky optimizim zvog\u00eblon numrin e branch-eve n\u00eb kod, dhe \u00ebsht\u00eb i kufizuar nga numri i regjistrave t\u00eb lir\u00eb t\u00eb disponuesh\u00ebm.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/f54631d9e8c69f6f70ecace3133ae1e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor \u00e7far\u00eb ndodh me performanc\u00ebn? Ajo \u00ebsht\u00eb t\u00eb shk\u00eblqyer! Ne arrit\u00ebm nj\u00eb p\u00ebrshpejtim prej rreth shtat\u00eb her\u00eb krahasuar me zgjidhjen m\u00eb t\u00eb mir\u00eb n\u00eb Go. Mbres\u00ebl\u00ebn\u00ebse, apo jo?<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/d7e85c933eecb243cfb49225b4d92c6c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor edhe kjo implementim potencielisht mund t\u00eb p\u00ebrshpejtohet duke p\u00ebrdorur AVX-512, prefetching ose JIT (kompilues n\u00eb koh\u00eb reale) p\u00ebr planifikuesin e k\u00ebrkesave. Por kjo \u00ebsht\u00eb sigurisht nj\u00eb tem\u00eb p\u00ebr nj\u00eb raport t\u00eb ve\u00e7ant\u00eb.<\/p>\n<h2>Problemet e indekseve bitmap<\/h2>\n<p>\nTani q\u00eb ne kemi shqyrtuar implementimin e thjesht\u00eb t\u00eb indeksit bitmap n\u00eb Go dhe nj\u00eb implementim shum\u00eb m\u00eb t\u00eb produktiv n\u00eb assembler, le t\u00eb flasim p\u00ebrfundimisht p\u00ebr at\u00eb se pse indekset bitmap p\u00ebrdoren kaq rrall\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/83d36a5c92ba90fd680fe8afb6cfc11f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb punimet e vjetra shkencore p\u00ebrmenden tre probleme t\u00eb indekseve bitmap, por punimet m\u00eb t\u00eb reja shkencore dhe un\u00eb pohojm\u00eb se ato tashm\u00eb nuk jan\u00eb t\u00eb r\u00ebnd\u00ebsishme. Nuk do t\u00eb shtyjm\u00eb thell\u00eb n\u00eb secilin nga k\u00ebto probleme, por do t'i shqyrtojm\u00eb sip\u00ebrfaq\u00ebsisht.<\/p>\n<h2>Problemi i kardinalitetit t\u00eb lart\u00eb<\/h2>\n<p>\nPra, na thuhet se indekset bitmap i p\u00ebrshtaten vet\u00ebm fushave me kardinalitet t\u00eb vog\u00ebl, q\u00eb do t\u00eb thot\u00eb q\u00eb ato kan\u00eb pak vlera (p.sh., gjinia ose ngjyra e syve), dhe arsyeja \u00ebsht\u00eb se p\u00ebrfaq\u00ebsimi i zakonsh\u00ebm i k\u00ebtyre fushave (nj\u00eb bit p\u00ebr vler\u00eb) n\u00eb rastin e kardinalitetit t\u00eb lart\u00eb do t\u00eb marr\u00eb shum\u00eb hap\u00ebsir\u00eb dhe, m\u00eb shum\u00eb, k\u00ebto indekse bitmap do t\u00eb ishin t\u00eb mbushura pak (rrall\u00eb).<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/0787efc4d2cb4ea4d404ca7888b33697.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 p\u00ebrfaq\u00ebsim tjet\u00ebr, p\u00ebr shembull p\u00ebrfaq\u00ebsimin standard q\u00eb p\u00ebrdorim p\u00ebr numrat. Por pik\u00ebrisht shfaqja e algoritmeve t\u00eb kompresimit e ndryshoi gjith\u00e7ka. Gjat\u00eb dekadave t\u00eb fundit, shkenc\u00ebtar\u00ebt dhe studiuesit kan\u00eb shpikur nj\u00eb num\u00ebr t\u00eb madh algoritmesh kompresimi p\u00ebr bitmapet. Avantazhi i tyre kryesor \u00ebsht\u00eb se nuk \u00ebsht\u00eb e nevojshme t\u00eb dekompresojm\u00eb bitmapet p\u00ebr t\u00eb kryer operacione bitore \u2014 mund t\u00eb kryejm\u00eb operacione bitore direkt mbi bitmapet e kompresuara.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/ecb54fbf15aa11271bbbab01ecbda880.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKoh\u00ebt e fundit kan\u00eb filluar t\u00eb shfaqen edhe qasje hibrid, si\u00e7 jan\u00eb bitmapet roaring. Ato p\u00ebrdorin nj\u00ebkoh\u00ebsisht tre p\u00ebrfaq\u00ebsime t\u00eb ndryshme p\u00ebr bitmapet \u2014 vet\u00eb bitmapet, array-t dhe at\u00eb q\u00eb quhet bit runs \u2014 dhe balancojn\u00eb midis tyre p\u00ebr t\u00eb maksimizuar performanc\u00ebn dhe minimizuar konsumin e memories.<\/p>\n<p>Mund t\u00eb takoni bitmapet roaring n\u00eb aplikacionet m\u00eb t\u00eb njohura. Padyshim, ekziston nj\u00eb sasi e madhe 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=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/de2adfebc431ff48c996247b453f02ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb qasje tjet\u00ebr 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 lart\u00ebsin\u00eb e njeriut. Lart\u00ebsia \u00ebsht\u00eb nj\u00eb num\u00ebr me presje t\u00eb l\u00ebvizshme, por ne, njer\u00ebzit, nuk mendojm\u00eb p\u00ebr t\u00eb k\u00ebshtu. P\u00ebr ne nuk ka diferenc\u00eb nd between lart\u00ebsia 185.2 cm dhe 185.3 cm.<\/p>\n<p>Duket se mund t\u00eb grupojm\u00eb vlera t\u00eb ngjashme n\u00eb grupe brenda 1 cm.<\/p>\n<p>Dhe n\u00ebse gjithashtu e dim\u00eb se ka shum\u00eb pak njer\u00ebz q\u00eb kan\u00eb lart\u00ebsi m\u00eb t\u00eb vog\u00ebl se 50 cm dhe m\u00eb shum\u00eb se 250 cm, at\u00ebher\u00eb ne mund, n\u00eb thelb, ta kthejm\u00eb nj\u00eb fush\u00eb me kardinalitet t\u00eb pafund n\u00eb nj\u00eb fush\u00eb me kardinalitet prej rreth 200 vlerash.<\/p>\n<p>Sigurisht, n\u00ebse \u00ebsht\u00eb e nevojshme, mund t\u00eb b\u00ebjm\u00eb filtrimin e m\u00ebtejm\u00eb m\u00eb von\u00eb.<\/p>\n<h2>Problemi i kapacitetit t\u00eb lart\u00eb t\u00eb transmetimit<\/h2>\n<p>\nProblemi tjet\u00ebr i indekseve bitmap \u00ebsht\u00eb se p\u00ebrdit\u00ebsimi i tyre mund t\u00eb jet\u00eb shum\u00eb i kushtuesh\u00ebm.<\/p>\n<p>Baza t\u00eb dh\u00ebnash duhet t\u00eb ofrojn\u00eb mund\u00ebsin\u00eb p\u00ebr t\u00eb p\u00ebrdit\u00ebsuar t\u00eb dh\u00ebnat n\u00eb momentin kur potencialisht qindra k\u00ebrkesa t\u00eb tjera po k\u00ebrkojn\u00eb p\u00ebr k\u00ebto t\u00eb dh\u00ebna. Kemi nevoj\u00eb p\u00ebr lok si p\u00ebr t\u00eb shmangur problemet me qasjen e p\u00ebrbashk\u00ebt n\u00eb t\u00eb dh\u00ebna apo probleme t\u00eb tjera t\u00eb aksesit t\u00eb p\u00ebrbashk\u00ebt. Dhe atje ku ka nj\u00eb lok t\u00eb madh, ka nj\u00eb problem \u2014 kontestimi i lokut, kur ky lok b\u00ebhet ngushtic\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/0ae1bf925542d286f8b7b245c160a35e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKy problem mund t\u00eb zgjidhet ose t\u00eb kaloj\u00eb p\u00ebrmes sharding-ut ose p\u00ebrdorimit t\u00eb indekseve t\u00eb versionuara.<\/p>\n<p>Sharding-u \u00ebsht\u00eb nj\u00eb koncept i thjesht\u00eb dhe i njohur. Ju mund t\u00eb b\u00ebni sharding t\u00eb indekseve bitmap ashtu si\u00e7 do t\u00eb b\u00ebni sharding p\u00ebr \u00e7do t\u00eb dh\u00ebnat tjet\u00ebr. N\u00eb vend t\u00eb nj\u00eb loku t\u00eb madh, do t\u00eb merrni shum\u00eb lok\u00eb t\u00eb vegj\u00ebl dhe k\u00ebshtu do t\u00eb eliminoni kontestimin e lokut.<\/p>\n<p>M\u00ebnyra e dyt\u00eb p\u00ebr t\u00eb zgjidhur problemin \u00ebsht\u00eb p\u00ebrdorimi i indekseve t\u00eb versionuara. Ju mund t\u00eb keni nj\u00eb kopje t\u00eb indeksit q\u00eb e p\u00ebrdorni p\u00ebr t\u00eb k\u00ebrkuar ose lexuar, dhe nj\u00eb tjet\u00ebr p\u00ebr t\u00eb shkruar ose p\u00ebrdit\u00ebsuar. Dhe n\u00eb nj\u00eb interval t\u00eb caktuar kohor (p\u00ebr shembull, \u00e7do 100 ms ose 500 ms) ju i duploni dhe i nd\u00ebrroni vendet. Sigurisht, ky qasje \u00ebsht\u00eb e zbatueshme vet\u00ebm n\u00eb ato raste kur aplikacioni juaj mund t\u00eb punoj\u00eb me nj\u00eb indeks k\u00ebrkimi q\u00eb ka nj\u00eb vones\u00eb t\u00eb vog\u00ebl.<\/p>\n<p>K\u00ebto dy qasje mund t\u00eb p\u00ebrdoren nj\u00ebkoh\u00ebsisht: ju mund t\u00eb keni nj\u00eb indeks t\u00eb versionuar t\u00eb sharding-uara.<\/p>\n<h2>K\u00ebrkesat m\u00eb t\u00eb nd\u00ebrlikuara<\/h2>\n<p>Problemi i fundit me indekset bitmap \u00ebsht\u00eb se, si\u00e7 na thon\u00eb, ato nuk jan\u00eb shum\u00eb t\u00eb p\u00ebrshtatshme p\u00ebr tipe m\u00eb t\u00eb nd\u00ebrlikuara k\u00ebrkesash, p\u00ebr shembull k\u00ebrkesave \"n\u00eb interval\".<\/p>\n<p>Dhe n\u00eb t\u00eb v\u00ebrtet\u00eb, n\u00ebse mendojm\u00eb p\u00ebr k\u00ebt\u00eb, operacionet bitore si AND, OR etj. nuk jan\u00eb shum\u00eb t\u00eb p\u00ebrshtatshme p\u00ebr k\u00ebrkesat si \"M\u00eb trego hotellet me \u00e7mime dhome nga 200 n\u00eb 300 dollar\u00eb p\u00ebr nat\u00eb\".<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/7bc2e129cad46fb5875c2b3018c39ff7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb zgjidhje naive dhe shum\u00eb t\u00eb pamenduar do t\u00eb ishte t\u00eb merrnin rezultatet p\u00ebr \u00e7do vler\u00eb dollar\u00ebsh dhe t'i bashkoni ato me operacionin bitor OR.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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\u00ebrdornim grumbullim. 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 p\u00ebrfaq\u00ebsim t\u00eb krijuar posa\u00e7\u00ebrisht p\u00ebr k\u00ebt\u00eb lloj k\u00ebrkese. N\u00eb punimet shkencore, kjo quhet bitmap me kodim range.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/644a420628b21f220a7af1ff15c4031f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb nj\u00eb p\u00ebrfaq\u00ebsim t\u00eb till\u00eb, ne nuk thjesht vendosim nj\u00eb bit p\u00ebr nj\u00eb vler\u00eb t\u00eb caktuar (p\u00ebr shembull, 200), por vendosim at\u00eb vler\u00eb dhe gjith\u00e7ka q\u00eb \u00ebsht\u00eb m\u00eb e 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 p\u00ebrdorur k\u00ebt\u00eb p\u00ebrfaq\u00ebsim, ne mund t\u00eb p\u00ebrgjigjemi ndaj k\u00ebtij lloji k\u00ebrkese duke kaluar p\u00ebrmes indeksit vet\u00ebm dy her\u00eb. S\u00eb pari, ne do t\u00eb marrim nj\u00eb list\u00eb hotelesh ku \u00e7mimi i dhom\u00ebs \u00ebsht\u00eb m\u00eb pak se 300 dollar\u00eb, e m\u00eb pas do ta heqim at\u00eb nga lista ku \u00e7mimi \u00ebsht\u00eb m\u00eb pak se 199 dollar\u00eb. E kryer.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/cc2bb58d7d7a51495c62ec7da81e2d12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDo t\u00eb habiteni, por madje k\u00ebrkesat gjeografike jan\u00eb t\u00eb mundshme duke p\u00ebrdorur indeksat bitmap. Hile \u00ebsht\u00eb t\u00eb p\u00ebrdorni nj\u00eb p\u00ebrfaq\u00ebsim gjeografik q\u00eb rrethon koordinat\u00ebn tuaj p\u00ebrmes nj\u00eb figure gjeometrike. P\u00ebr shembull, S2 nga Google. Figura duhet t\u00eb jet\u00eb e mundur t\u00eb paraqitet si tre ose m\u00eb shum\u00eb vijat q\u00eb prishin, t\u00eb cilat mund t\u00eb num\u00ebrohen. K\u00ebshtu ne mund ta kthejm\u00eb k\u00ebrkes\u00ebn ton\u00eb gjeografike n\u00eb disa k\u00ebrkesa 'p\u00ebr intervalin' (p\u00ebr k\u00ebto vijat e num\u00ebruara).<\/p>\n<h2>Zgjidhje t\u00eb gatshme<\/h2>\n<p>\nShpresoj se ju kam interesuar pak dhe q\u00eb keni marr\u00eb nj\u00eb mjet 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 drejtimin se ku t\u00eb shikoni.<\/p>\n<p>Megjithat\u00eb, nuk kan\u00eb t\u00eb gjith\u00eb koh\u00eb, durim dhe burime p\u00ebr t\u00eb krijuar indeksat bitmap nga e para. Sidomos ato m\u00eb t\u00eb avancuara, duke p\u00ebrdorur SIMD, p\u00ebr shembull.<\/p>\n<p>Fatmir\u00ebsisht, ka disa zgjidhje t\u00eb gatshme q\u00eb do t'ju ndihmojn\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/817b47cb189a758756b602ec9cf319e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Bitmaps Roaring<\/h2>\n<p>\nN\u00eb radh\u00eb t\u00eb par\u00eb, ka bibliotek\u00ebn e asaj fabulante t\u00eb bitmaps roaring p\u00ebr t\u00eb cil\u00ebn kam folur m\u00eb par\u00eb. Ajo p\u00ebrmban t\u00eb gjitha kontenier\u00ebt e nevojsh\u00ebm dhe operacionet bitore q\u00eb keni nevoj\u00eb p\u00ebr t\u00eb krijuar nj\u00eb indeks bitmap t\u00eb plot\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/57f61a51485c174666b52dc2063fabe8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u00ebr fat t\u00eb keq, p\u00ebr momentin asnj\u00eb nga realizimet Go nuk p\u00ebrdor SIMD, \u00e7ka do t\u00eb thot\u00eb se realizimet Go kan\u00eb performanc\u00eb m\u00eb t\u00eb ul\u00ebt 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 DBMS Pilosa, i cili n\u00eb thelb ka vet\u00ebm indeksat bitmap. Ky \u00ebsht\u00eb nj\u00eb zgjidhje relativisht e re, por po pushton zemrat me nj\u00eb shpejt\u00ebsi t\u00eb madhe.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/d3870a979e1e73d093fe5d5e9bb71cd8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPilosa p\u00ebrdor bitmap-e t\u00eb roaring brenda vetes dhe ju jep mund\u00ebsin\u00eb t'i p\u00ebrdorni ato, duke e thjeshtuar dhe shpjeguar t\u00eb gjitha ato gj\u00ebra p\u00ebr t\u00eb cilat kam folur m\u00eb lart: grupimi, bitmap-e me kodim range, konceptin e fush\u00ebs dhe k\u00ebshtu me radh\u00eb.<\/p>\n<p>Le t\u00eb shohim shpejt nj\u00eb shembull t\u00eb p\u00ebrdorimit t\u00eb Pilosa p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb nj\u00eb pyetje q\u00eb ju \u00ebsht\u00eb njohur m\u00eb par\u00eb.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 indeksp dhe fushat e nevojshme, pastaj mbushim fushat tona me t\u00eb dh\u00ebna t\u00eb rast\u00ebsishme me probabilitet dhe, n\u00eb fund, realizojm\u00eb k\u00ebrkes\u00ebn e njohur.<\/p>\n<p>Pas k\u00ebsaj, p\u00ebrdorim NOT n\u00eb fush\u00ebn \"expensive\", pastaj e nd\u00ebrp\u00ebrsejm\u00eb rezultatin (ose AND-ojm\u00eb) me fush\u00ebn \"terrace\" dhe me fush\u00ebn \"reservations\". Dhe n\u00eb fund, marrim rezultatin p\u00ebrfundimtar.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" 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 k\u00ebt\u00eb lloj indeksi t\u00eb ri \u2014 bitmap-indeksi \u2014 do ta kemi gjithashtu n\u00eb DBMS si MySQL dhe PostgreSQL.<br \/>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/7a8e33d576c7fb6376a173ee038b4206.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>P\u00ebrfundim<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Indekset bitmap n\u00eb Go: k\u00ebrkim me shpejt\u00ebsi marramend\u00ebse\" src=\"\/wp-content\/uploads\/2019\/05\/c62caa9ad6f2d96056c80326f4fa9a0d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00ebse ende nuk jeni zgjuar, faleminderit. M\u00eb duhej t\u00eb preka shpejt shum\u00eb tema p\u00ebr shkak t\u00eb koh\u00ebs s\u00eb kufizuar, por shpresoj q\u00eb prezantimi ishte i dobish\u00ebm dhe ndoshta edhe motivues.<\/p>\n<p>\u00cbsht\u00eb mir\u00eb t\u00eb dihet p\u00ebr bitmap-indeksin, edhe n\u00ebse nuk ju nevojiten menj\u00ebher\u00eb. Le t\u00eb jen\u00eb nj\u00eb mjet tjet\u00ebr n\u00eb kutin\u00eb tuaj.<\/p>\n<p>Ne kemi shqyrtuar truket e ndryshme p\u00ebr rritjen e performanc\u00ebs p\u00ebr Go dhe ato gj\u00ebra q\u00eb kompajleri Go ende nuk i trajton shum\u00eb mir\u00eb. Kjo \u00ebsht\u00eb absolutisht di\u00e7ka e dobishme p\u00ebr \u00e7do programues n\u00eb 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.2 - 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.\" \/>\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.2\" \/>\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.\" \/>\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-indeksat n\u00eb Go: k\u00ebrkimi me shpejt\u00ebsi t\u00eb madhe | ProHoster","description":"Fjala hyr\u00ebse Un\u00eb kam mbajtur nj\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.","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}]}}