Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

hordhac

Waxaan warbixintan ku bixiyay Ingiriis shirkii GopherCon Russia 2019 ee Moscow iyo Ruushka ee kulan ka dhacay Nizhny Novgorod. Waxaan ka hadleynaa index bitmap - ka yar caan ka B-geedka, laakiin aan ka yara xiiso leh. Wadaagista duubid khudbadihii shirka oo ku qornaa Ingiriisi iyo qoraallo qoraal ah oo Ruush ah.

Waxaan eegi doonaa sida index bitmap u shaqeeyo, marka ay ka fiican tahay, marka ay ka xun tahay tusmooyinka kale, iyo xaaladaha ay aad uga dhaqso badan tahay iyaga; Aynu aragno DBMS-yada caanka ah ee hore u lahaa tusmooyinka khariidadda; Aan isku dayno inaan ku qorno Go. Iyo "macmacaan" waxaan u isticmaali doonaa maktabado diyaarsan si aan u abuurno xog gaar ah oo aad u degdeg badan.

Runtii waxaan rajeynayaa in shaqadayda ay kuu noqon doonaan kuwo faa'iido iyo xiiso kuu leh. Tag!

Horudhac


http://bit.ly/bitmapindexes
https://github.com/mkevac/gopherconrussia2019

Salaamu calaykum! Waa lixdii fiidnimo, dhammaanteen aad baan u daalanahay. Waqti fiican in laga hadlo aragtida tusaha xogta caajiska ah, sax? Ha werwerin, waxaan halkan iyo halkaas ku yeelan doonaa dhowr sadar oo koodka isha. πŸ™‚

Kaftanka oo dhan marka laga reebo, warbixintu waa mid xog badan, mana haysanno waqti badan. Markaa aan bilowno.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Maanta waxaan ka hadli doonaa arrimaha soo socda:

  • waa maxay indexes;
  • waa maxay index bitmap;
  • meesha lagu isticmaalo iyo meesha aan la isticmaalin iyo sababta;
  • Hirgelinta fudud ee Go iyo halgan yar oo isku-dubaridiyaha ah;
  • in yar ka fudud, laakiin aad uga waxtar badan fulinta Go assembler;
  • "dhibaatooyinka" ee tusmooyinka bitmap;
  • fulinta jira.

Haddaba waa maxay tusmooyinku?

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Tusmadu waa qaab-dhismeed xogeed oo gooni ah oo aanu ilaalinayno oo aanu cusboonaysiinno marka lagu daro xogta muhiimka ah. Waxaa loo isticmaalaa in lagu dedejiyo raadinta. Tusayaal la'aan, raadinta waxay u baahan tahay in si buuxda loo maro xogta (hab loo yaqaan scan buuxa), habkanina wuxuu leeyahay kakanaanta algorithmic toosan. Laakin xog ururintu waxay inta badan ka kooban yihiin xog aad u badan iyo kakanaanta toosan waa mid aad u gaabis ah. Fikrad ahaan, waxaan heli karnaa logarithmic ama joogto ah.

Tani waa mawduuc aad u adag, oo ay ka buuxaan khiyaano iyo ganacsi-offs, laakiin ka dib markaan eegay tobaneeyo sano oo horumarinta xogta iyo cilmi-baarista, waxaan rabaa in aan sheego in ay jiraan dhowr habab oo si ballaaran loo isticmaalo si loo abuuro tusmooyinka xogta.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Habka ugu horreeya waa in si heer sare ah loo yareeyo booska raadinta, loo qaybiyo booska raadinta qaybo yaryar.

Caadi ahaan tan waxaan ku sameynaa noocyo kala duwan oo geedo ah. Tusaale ahaan waxay noqon kartaa sanduuq weyn oo agab ah oo ku jira armaajooyinkaaga oo ay ku jiraan sanduuqyo yaryar oo agab ah oo loo qaybiyay mowduucyo kala duwan. Haddii aad u baahan tahay qalab, waxaad u badan tahay inaad ka raadin doonto sanduuq ay ku qoran tahay "Qalabka" halkii aad ka odhan lahayd "Cookies," sax?

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Habka labaad waa in isla markiiba la doorto walxaha la rabo ama kooxda curiyeyaasha. Waxaan tan ku samaynaa khariidado xashiish ah ama tusmooyin kale. Isticmaalka khariidadaha xashiishka waxay aad ula mid tahay tusaalihii hore, laakiin halkii aad ka heli lahayd sanduuq sanduuqyo ah, waxaad haysataa sanduuqyo yar yar oo ah alaabta ugu dambaysa ee qolkaaga.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Habka saddexaad waa in meesha laga saaro baahida raadinta. Waxaan tan ku sameynaa annagoo isticmaalna filtarrada Bloom ama filtarrada cuckoo. Kuwii hore waxay si degdeg ah u bixiyaan jawaab, iyagoo kaa badbaadinaya inaad raadiso.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Habka ugu dambeeya waa in si buuxda loo isticmaalo dhammaan awoodda qalabka casriga ahi ina siinayo. Tani waa sida saxda ah ee aan ku sameyno tusmooyinka bitmap. Haa, marka aan isticmaalno iyaga waxaan mararka qaarkood u baahanahay inaan marno tusmada oo dhan, laakiin waxaan u sameynaa si hufan.

Sidaan u sheegay, mawduuca tusmooyinka xog-ururinta waa mid ballaaran oo ay ka buuxaan tanaasul. Tani waxay ka dhigan tahay in mararka qaarkood aan isticmaali karno dhowr habab isku mar: haddii aan u baahannahay inaan sii dedejinno raadinta xitaa in ka badan, ama haddii aan u baahanahay inaan daboolno dhammaan noocyada raadinta ee suurtogalka ah.

Maanta waxaan ka hadli doonaa habka ugu yar ee loo yaqaan ee kuwan - bitmap indexes.

Kumaan ahay inaan ka hadlo mowduucan?

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Waxaan u shaqeeyaa sidii koox hogaaminaysa Badoo (laga yaabee inaad aad u taqaano badeecadayada kale, Bumble). Waxaan horay u haysanay in ka badan 400 milyan isticmaalayaasha adduunka oo dhan iyo astaamo badan oo iyaga u doorta ciyaarta ugu fiican. Waxaan tan ku sameynaa anagoo adeegsanayna adeegyada gaarka ah, oo ay ku jiraan tusmooyinka bitmap.

Haddaba waa maxay tusmada khariidadda?

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap, sida magacu soo jeediyo, isticmaal bitmaps ama bitsets si loo hirgeliyo tusmada raadinta. Marka loo eego aragtida isha shimbiraha, tusmadani waxa ay ka kooban tahay hal ama in ka badan oo khariidado-qashin ah oo matalaya hay'ado kasta (sida dadka) iyo hantidooda ama cabbiraadaha (da'da, midabka isha, iwm.), iyo algorithm isticmaalaya hawlgallada yaryar (IYO, AMA, MAYA ) si aad uga jawaabto su'aasha raadinta.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxaa naloo sheegay in tusmooyinka bitmap-ku ay ugu habboon yihiin oo ay aad ugu fiican yihiin kiisaska halkaas oo ay jiraan baaritaanno isku daraya su'aalo badan oo ka mid ah tiirarka wadnaha hooseeya (ka fikir "midabka isha" ama "xaaladda guurka" oo ka soo horjeeda wax la mid ah "fogaanshaha bartamaha magaalada"). Laakiin waxaan tusi doonaa mar dambe in ay si fiican ugu shaqeeyaan tiirarka kardinnimada sare sidoo kale.

Aynu eegno tusaalaha ugu fudud ee tusmada khariidadda.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Bal qiyaas in aan haysano liiska makhaayadaha Moscow oo leh hanti laba-jibbaaran sida kuwan:

  • metro u dhow;
  • waxaa jira baarkin gaar ah;
  • waxaa jira veranda (wuxuu leeyahay terrace);
  • waxaad kaydsan kartaa miis (waxay aqbashaa boos celin);
  • ku habboon khudradda (saaxiibtinimo vegan);
  • qaali ah (qaali ah).

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Aynu siino makhaayad kasta lambar isku xigta oo ka bilaabma 0 oo u qoondeeyno xusuusta 6 bitmaps (mid sifada kasta ah). Waxaan markaa buuxin doonaa khariidad-yarahan iyadoo ku xiran in maqaayaddu leedahay gurigan iyo in kale. Haddii makhaayadda 4 ay leedahay veranda, ka dibna qaniinyada lambarka 4 ee "has a veranda" bitmap-ka waxaa loo dejin doonaa 1 (haddii aysan jirin veranda, ka dibna 0).
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Hadda waxaan haynaa tusmada ugu fudud ee suurtogalka ah, waxaanan u isticmaali karnaa inaan kaga jawaabno su'aalaha sida:

  • "I tus makhaayadaha khudaartu ku wanaagsan";
  • "I tus makhaayado aan qaali ahayn oo leh veranda, halkaas oo aad ku qabsan karto miis."

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Sidee? Aan eegno. Codsiga ugu horreeya waa mid aad u fudud. Waxa kaliya ee aan u baahanahay inaan sameyno waa inaan qaadno khariidadda 'saaxiibtinimada khudradeed'' oo aan u rogno liiska maqaayadaha kuwaas oo la soo bandhigay.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Codsiga labaad waa ka yara adag yahay. Waxaan u baahanahay inaan isticmaalno khariidadda NOT-ka ee qariirada "qaali ah" si aan u helno liiska makhaayadaha aan qaali ahayn, ka dib IYO iyada oo leh "ma qori karaa miis" khariidad-qashin ah iyo natiijada "waxaa jira veranda" bitmap. Khariidadda bitmap-ka ee soo baxday waxay ka koobnaan doontaa liiska xarumaha buuxiya dhammaan shuruudahayada. Tusaalahan, kani waa makhaayadda Yunost oo keliya.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxaa jira aragti badan oo ku lug leh, laakiin ha ka welwelin, waxaan arki doonaa koodka si dhakhso ah.

Halkee laga isticmaalaa tusmooyinka bitmap?

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Haddii aad Google-ka tusto khariidadda bitmap, 90% jawaabaha waxay la xidhiidhi doonaan Oracle DB si uun ama si kale. Laakiin DBMS-yada kale waxay u badan tahay inay sidoo kale taageeraan shay qabow, sax? Runtii maaha.

Aynu maro liiska tuhmanayaasha waaweyn.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
MySQL wali ma taageerto tusmooyinka bitmap-ka, laakiin waxaa jira soo jeedin soo jeedinaysa in lagu daro doorashadan (https://dev.mysql.com/worklog/task/?id=1524).

PostgreSQL ma taageerto tusmooyinka bitmap-ka, laakiin waxay isticmaashaa khariidado fudud iyo hawlo yar si ay isugu geyso natiijooyinka raadinta tusmooyinka kale ee badan.

Tarantool waxay leedahay tusmooyinka bitset waxayna taageertaa raadinta fudud iyaga.

Redis waxay leedahay goobo yar oo fudud (https://redis.io/commands/bitfield) oo aan lahayn awood uu ku raadiyo.

MongoDB wali ma taageerto tusmooyinka bitmap, laakiin waxa kale oo jira soo jeedin soo jeedinaysa in doorashadan lagu daro https://jira.mongodb.org/browse/SERVER-1723

Elasticsearch waxay isticmaashaa bitmaps gudaha (https://www.elastic.co/blog/frame-of-reference-and-roaring-bitmaps).

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

  • Laakiin deris cusub ayaa ka soo muuqday gurigayaga: Pilosa. Kani waa xog cusub oo aan xidhiidh la lahayn oo ku qoran Go. Waxay ka kooban tahay oo kaliya tusmooyinka bitmap waxayna ku salaysan tahay wax walba iyaga. Wax yar ka dib ayaan ka hadli doonaa.

Hirgelinta Go

Laakiin waa maxay sababta tusmooyinka bitmap-ka si naadir ah loo isticmaalo? Kahor intaanan ka jawaabin su'aashan, waxaan jeclaan lahaa inaan ku tuso sida loo hirgeliyo tusmada qariirada yar ee Go.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Bitmaps asal ahaan waa qaybo xog ah. Go, aan u isticmaalno xaleef byte ah tan.

Waxaan leenahay hal khariidad oo loogu talagalay hal sifada makhaayadda, iyo mid kasta oo ku jira khariidadda-qashinka waxay muujinaysaa in makhaayad gaar ahi leedahay hantidan iyo in kale.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxaan u baahan doonaa laba shaqo oo caawiye ah. Mid ayaa loo isticmaali doonaa in lagu buuxiyo khariidadahayaga xog random. Random, laakiin leh ixtimaalka go'an in makhaayaddu leedahay hanti kasta. Tusaale ahaan, waxaan aaminsanahay in ay jiraan makhaayado aad u yar oo ku yaala Moscow oo aadan haysan karin miis, waxayna ii muuqataa in 20% ka mid ah xarumaha ay ku habboon yihiin khudradda.

Shaqada labaad waxay u rogi doontaa khariidadda-qashinka liiska makhaayadaha.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Si aan uga jawaabno su'aasha "I tus makhaayado aan qaali ahayn oo leh barxadda oo samayn kara boos celin," waxaan u baahanahay laba hawlgal oo yaryar: MAYA iyo IYO.

Waxaan fududayn karnaa koodkayaga annagoo adeegsanayna kan aad u adag oo AAN ahayn hawlwadeen.

Waxaan leenahay hawlo mid kasta oo ka mid ah hawlgalladan. Labaduba waxay maraan jeexjeexyada, ka soo qaad walxaha u dhigma mid kasta, ku dar qalliin yar oo natiijada ku rid jeexii ka dhashay.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Oo hadda waxaan isticmaali karnaa khariidadahayaga iyo hawlahayaga si aan uga jawaabno weydiinta raadinta.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxqabadku maaha mid sidaas u sarreeya, inkastoo hawluhu aad u fudud yihiin oo aanu ku badbaadnay lacag badan annagoo aan soo celin jeex cusub oo ka dhashay mar kasta oo shaqada la waco.

Ka dib markii aan xoogaa xog-ururin ah la sameeyay ppr, waxaan ogaaday in isu-duwaha Go uu ka maqan yahay mid aad u fudud laakiin aad u muhiim ah: hagaajinta shaqada.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Xaqiiqdu waxay tahay in isku-duwaha Go uu si aad ah uga cabsado siddooyinka dhex mara jeexjeexyada, oo si cad u diidaya hawlaha khadka ee ay ku jiraan wareegyadaas.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Laakiin ma cabsanayo oo waxaan ku khiyaanayn karaa isku-duwaha aniga oo isticmaalaya goto halkii loop, sida waagii hore ee wanaagsanaa.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Iyo, sida aad arki karto, hadda isku-dubariduhu wuxuu si farxad leh u xariiqi doonaa shaqadeena! Natiijo ahaan, waxaan maamuleynaa inaan badbaadino ilaa 2 microse seconds. Ma xuma!

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Dhalada labaad waa ay fududahay in la arko haddii aad si dhow u eegto wax soo saarka shirka. Soo-sameeyaha waxa uu ku daray jeeg xudduud jeex ah gudaha wareeggayaga ugu kulul. Xaqiiqdu waxay tahay Go waa luqad badbaado leh, iskudubariduhu wuxuu ka baqayaa in saddexda doodood (saddex jeex) ay kala cabbir duwan yihiin. Ka dib oo dhan, markaa waxaa jiri doona suurtogalnimo aragti ah oo ku saabsan dhacdada waxa loogu yeero qulqulka qulqulka.

Aynu dib u xaqiijino isu-duwaha anagoo tusnayna in dhammaan xaleefyadu ay isku cabbir yihiin. Waxaan tan ku samayn karnaa innagoo ku darayna jeeg fudud bilowga hawsheenna.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Markuu arkay tan, isku-dubariduhu si farxad leh ayuu uga boodaa jeegga, waxaanu ku dhammaanaynaa badbaadinta 500 nanoseconds oo kale.

Kawaanno waaweyn

Hagaag, waxaan ku guuleysanay inaan ka saarno xoogaa waxqabad ah oo ka mid ah hirgalintayada fudud, laakiin natiijadani runtii aad ayay uga xun tahay sidii ay suurtogal u tahay qalabka hadda jira.

Waxa kaliya ee aan samayno waa hawlo yar oo aasaasi ah, soo-saareyaasheenuna waxay u qabtaan si hufan. Laakiin, nasiib daro, waxaanu ku quudinaynaa processor-kayaga qaybo aad u yar oo shaqo ah. Howlahayagu waxay qabtaan hawlgallo ku salaysan byte-by-byte. Waxaan si fudud u habeyn karnaa koodkayaga si aan ula shaqeyno jajabyo 8-byte ah anagoo adeegsanayna UInt64 jeexan.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Sida aad arki karto, isbeddelkan yar wuxuu kordhiyey barnaamijkeena siddeed jeer iyadoo kordhinaysa xajmiga dufcada siddeed jeer. Faa'iidada waxaa la odhan karaa waa toosan.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Hirgelinta isku-duwaha

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Laakiin tani maaha dhamaadka. Soo-saareyaashayadu waxay ku shaqayn karaan qaybo 16, 32 iyo xataa 64 bytes ah. Hawlgallada "ballaaran" ee noocan oo kale ah waxaa loogu yeeraa hal tilmaamid oo badan (SIMD; hal tilmaam, xog badan), iyo habka beddelka koodka si uu u isticmaalo hawlahan oo kale waxaa loo yaqaan 'vectorization'.

Nasiib darro, isku-dubaridiyaha Go aad ayuu uga fog yahay fadeexaynta. Hadda, dariiqa kaliya ee lagu kala saari karo koodka Go waa in la qaato oo la dhigo hawlgalladan gacanta adoo isticmaalaya Go assembler.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Goo ururiye waa bahal yaab leh. Waxaa laga yaabaa inaad ogtahay in luqadda kulanku ay tahay shay si weyn ugu xidhan qaab-dhismeedka kombiyuutarka aad wax u qorayso, laakiin taasi maahan kiiska Go. Go assembler waxa uu u eg yahay IRL (Luqadda matalaadda dhexe) ama luqadda dhexdhexaadka ah: ficil ahaan waa madal madaxbannaan. Rob Pike wuxuu bixiyay waxqabad aad u fiican warbixin mawduucan dhowr sano ka hor ee GopherCon ee Denver.

Intaa waxaa dheer, Go waxay isticmaashaa qaabka aan caadiga ahayn ee Qorshaha 9, kaas oo ka duwan qaababka guud ee AT&T iyo Intel la aqbalo.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waa ammaan in la yiraahdo ku qorista Go assembler ee gacanta ma aha tan ugu xiisaha badan.

Laakiin, nasiib wanaag, waxaa horeba u jiray laba qalab oo heer sare ah oo naga caawinaya qoritaanka Go assembler: PeachPy iyo avo. Labada adeegba waxay abuuraan isku-duwaha Go oo ka soo baxaya kood heer sare ah oo ku qoran Python iyo Go, siday u kala horreeyaan.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tas-hiilaadkani waxa ay fududeeyaan waxyaabaha ay ka midka yihiin qoondaynta diiwaan gelinta, qorista wareegyada, iyo guud ahaan fududaynta habka gelitaanka barnaamijka isu-ururinta adduunka ee Go.

Waxaan isticmaali doonaa avo, sidaas darteed barnaamijyadeenu waxay noqon doonaan ku dhawaad ​​barnaamijyada Go caadiga ah.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tani waa sida tusaalaha ugu fudud ee barnaamijka avo u eg yahay. Waxaan leenahay shaqo () ugu weyn, taas oo qeexaysa dhexdeeda shaqada Add() , taas oo macnaheedu yahay in lagu daro laba lambar. Waxaa jira hawlo caawiye halkan si aad u hesho cabbirada magaca oo aad u hesho mid ka mid ah diiwaannada processor-ka bilaashka ah oo ku habboon. Hawl-wadeen kastaa wuxuu leeyahay shaqo u dhiganta avo, sida lagu arkay ADDQ. Ugu dambeyntii, waxaan aragnaa kaaliyaha shaqada ee kaydinta qiimaha natiijada.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Adigoo wacaya go dhalin, waxaan ku fulin doonaa barnaamijka avo natiijada, laba fayl ayaa la soo saari doonaa:

  • add.s oo wata koodka ka soo baxay Go assembler;
  • stub.go oo leh madax-hawleedyo si ay ugu xidhaan labada adduun: Go and assembler.

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Hadda oo aan aragnay waxa avo sameeyo iyo sida, aynu eegno hawlaha our. Waxaan hirgaliyay noocyada scalar iyo vector (SIMD) ee shaqooyinka.

Aynu marka hore eegno noocyada scalar.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Sida tusaalihii hore, waxaanu waydiisanaynaa diiwaanka ujeedada guud ee bilaashka ah oo ansax ah, uma baahnid inaan xisaabino dhimista iyo cabbirada doodaha. avo ayaa waxaas oo dhan noo qabata.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxaan isticmaali jirnay calaamado iyo gooto (ama boodboodo) si aan u wanaajino waxqabadka oo aan u khiyaanno isu-duwaha Go, laakiin hadda waxaan samaynaynay bilawgii. Ujeedadu waa in wareegyadu yihiin fikrad heer sare ah. Isku-dubaridka, waxaan haynaa calaamado iyo boodo.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Koodhka soo hadhay waa inuu ahaadaa mid la yaqaan oo la fahmi karo. Waxaan ku dayaneynaa loop leh calaamado iyo boodbood, ka soo qaad xog yar oo ka mid ah labadayada xabbo, ku darso xoogaa qalliin ah (IYO kiiskan maahan) ka dibna natiijada geli jeex natiijada ka dhalatay. Dhammaan
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tani waa sida uu u egyahay koodhka isu-duwaha u dambeeya. Ma aanaan xisaabinin xajmiyada iyo cabbirada (oo lagu iftiimiyay cagaarka) ama aan la socono diiwaanka la isticmaalay (oo lagu iftiimiyay casaanka).
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Haddii aan is barbar dhigno waxqabadka fulinta luqadda golaha iyo waxqabadka fulinta ugu wanaagsan ee Go, waxaan arki doonnaa inay la mid tahay. Taasna waa la filayaa. Ka dib oo dhan, ma aanan samaynin wax gaar ah - kaliya waxaan dib u soo saarnay waxa uu samayn doono Go compiler.

Nasiib darro, kuma qasbi karno iskudubariduhu in uu xariiqo hawlaheenna oo ku qoran luqadda kulanka. Isku-duwaha Go hadda ma laha sifadaas, in kasta oo uu jiray codsi ah in lagu daro in muddo ah.

Tani waa sababta aysan suurtogal u ahayn in la helo faa'iido kasta oo ka mid ah hawlaha yaryar ee luqadda kulanka. Waxaan u baahannahay inaan qorno hawlo waaweyn, ama isticmaalno xirmada xisaabta/bits-ka cusub, ama aan dhaafno luqadda isu-soo-ururinta.

Aynu hadda eegno noocyada vector ee hawlaheenna.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusaalahan, waxaan go'aansaday inaan isticmaalo AVX2, sidaas darteed waxaan isticmaali doonaa hawlgallada ku shaqeeya 32-byte chunks. Qaab dhismeedka code-ku wuxuu aad ugu eg yahay nooca scalar: cabirrada rarka, weydiinta diiwaan la wadaago oo bilaash ah, iwm.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Hal hal-abuurnimo ayaa ah in hawlgallada vector-ka ballaaran ay isticmaalaan diiwaanno ballaaran oo gaar ah. Marka laga hadlayo 32-byte qaybs, kuwani waa diiwaanno lagu sii hormariyay Y. Tani waa sababta aad u aragto shaqada YMM() ee koodka. Haddii aan isticmaali lahaa AVX-512 oo leh jajabyo 64-bit ah, horgalaha wuxuu noqon lahaa Z.

Hal-abuurnimada labaad waa in aan go'aansaday in aan isticmaalo hagaajinta loo yaqaan loop unrolling, taas oo macnaheedu yahay in aan siddeed hawlood oo wareeg ah gacanta ku sameeyo ka hor inta aan u boodin bilawga wareegga. Hagaajintani waxay yaraynaysaa tirada laamaha code-ka, waxayna ku xaddidan tahay tirada diiwaannada bilaashka ah ee la heli karo.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Hagaag, ka waran waxqabadka? Way qurux badan tahay! Waxaan gaadhnay xawaare dhan todoba jeer marka la barbar dhigo xalka ugu fiican ee Go. La yaab leh, sax?
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Laakiin xitaa hirgelintan waxaa suurtogal ah in la dardargeliyo iyadoo la isticmaalayo AVX-512, prefetching ama JIT (isku-dubarid-waqti-yar) jadwalaha weydiinta. Laakiin tani runtii waa mowduuc loogu talagalay warbixin gaar ah.

Dhibaatooyinka tusmooyinka khariidadda

Hadda oo aan horay u eegnay hirgelinta fudud ee tusmada bitmap ee Go iyo mid aad uga waxtar badan oo ku jira luqadda kulanka, aan ugu dambeyntii ka hadalno sababta tusmooyinka bitmap-ka loo isticmaalo naadir.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waraaqihii hore waxay sheegeen saddex dhibaato oo ku saabsan tusmooyinka khariidadda, laakiin waraaqaha cusub waxaan ku doodayaa in aanay hadda khusayn. Si qoto dheer uguma daadan doono mid kasta oo ka mid ah dhibaatooyinkan, laakiin waxaan u eegi doonaa si qoto dheer.

Dhibaatada kardinnimada sare

Sidaa darteed, waxaa naloo sheegay in tusmooyinka bitmap ay ku habboon yihiin oo keliya beero leh karti hoose, taas oo ah, kuwa leh qiime yar (tusaale ahaan, jinsiga ama midabka indhaha), iyo sababta ayaa ah in matalaadda caadiga ah ee goobahaas (mid ka mid ah). xoogaa qiimo ah) marka la eego heerka sareynta, waxay qaadan doontaa meel aad u badan, sidoo kale, tusmooyinkan khariidadda-qashinka ah ayaa si liidata ( naadir ah) loo buuxin doonaa.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Mararka qaarkood waxaa laga yaabaa inaan isticmaalno matalaad ka duwan, sida kan caadiga ah ee aan u isticmaalno si aan u matalo tirooyin. Laakin waxay ahayd imaatinka algorithms-ka cadaadiska oo wax walba bedelay. Tobannaankii sano ee la soo dhaafay, saynisyahano iyo cilmi-baarayaashu waxay la yimaadeen tiro badan oo algorithms- cadaadis ah oo loogu talagalay bitmaps-ka. Faa'iidadooda ugu weyni waa in aysan jirin baahi loo qabo in la jajabiyo bitmaps-ka si loo sameeyo hawlo yaryar - waxaan si toos ah u fulin karnaa hawlgallada qaniinyada qariiradaha.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Dhowaan, habab isku-dhafan ayaa bilaabay inay soo baxaan, sida qaylo-dhaanta qaylada. Waxay isla mar ahaantaana u adeegsadaan saddex matalaad oo kala duwan oo loo yaqaan 'bitmaps' - bitmaps laftooda, arrays iyo waxa loogu yeero 'bit runs' - waxayna isku dheelitiraan dhexdooda si ay u kordhiyaan waxqabadka oo ay u yareeyaan isticmaalka xusuusta.

Waxaad ka heli kartaa bitmaps guuxa codsiyada ugu caansan. Waxa horeba u jiray tiro badan oo fulineed oo loogu talagalay luuqadaha barnaamijyada kala duwan, oo ay ku jiraan in ka badan saddex hirgelinta Go.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Habka kale ee naga caawin kara in aan wax ka qabano wadnaha sare waxaa loo yaqaan binning. Bal qiyaas in aad leedahay beer ka dhigan dhererka qofka. Dhererku waa lambar sabbaynaysa, laakiin haddaynu nahay aadamuhu sidaas uma fikirno. Annaga ma jirto farqi u dhexeeya dhererka 185,2 cm iyo 185,3 cm.

Waxaa soo baxday in aan ku kooxaysan karno qiyamka la midka ah kooxo 1 cm gudahood.

Haddii aan sidoo kale ognahay in dad aad u tiro yar ay ka gaaban yihiin 50 cm oo ay ka dheer yihiin 250 cm, markaa waxaan dhab ahaantii u rogi karnaa beer leh cardinity aan xad lahayn oo loo beddelo beer leh cardinity qiyaastii 200 oo qiyam ah.

Dabcan, haddii loo baahdo, waxaan samayn karnaa shaandhayn dheeraad ah ka dib.

Dhibaatada Bandwidth ee Sare

Dhibaatada xigta ee tusmooyinka bitmap-ka ayaa ah in cusboonaysiinta ay noqon karto mid aad qaali u ah.

Database-yadu waa inay awoodaan inay cusboonaysiiyaan xogta iyadoo laga yaabo inay boqolaal su'aalood oo kale ay baadhayaan xogta. Waxaan u baahanahay qufulo si aan uga fogaano dhibaatooyinka helitaanka xogta isla socda ama dhibaatooyinka kale ee wadaaga. Oo meesha uu jiro hal quful oo weyn, waxaa jira dhibaato - muran quful, marka qufulkani uu noqdo dhalo.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Dhibaatadan waxa lagu xalin karaa ama lagaga gudbi karaa iyadoo la isticmaalayo shaandhayn ama la isticmaalayo tusmooyin qaabaysan.

Sharding waa wax fudud oo si fiican loo yaqaan. Waxaad u kala jajabin kartaa tusmada bitmap-ka sida xogta kale Halkii aad ka heli lahayd hal quful oo weyn, waxaad heli doontaa xidhmo yar yar oo quful ah oo aad ka takhalusto muranka qufulka.

Habka labaad ee lagu xalliyo dhibaatada waa in la isticmaalo indexes versioned. Waxaad haysataa hal koobi oo ka mid ah tusmooyinka aad u isticmaashid raadinta ama akhrinta, iyo mid aad u isticmaasho qorista ama cusboonaysiinta. Iyo hal mar muddo cayiman (tusaale ahaan, 100 ms ama 500 ms hal mar) ayaad nuqul ka samaysaa oo aad beddeshaa. Dabcan, habkan ayaa lagu dabaqi karaa oo keliya kiisaska uu codsigaagu xamili karo tusmada raadinta oo waxyar dib u dhac ku yimid.

Labadan hab ayaa isku mar la istcimaali karaa: waxaad yeelan kartaa tusmooyin la jajabiyey.

Weydiimo kakan

Dhibaatada kama dambaysta ah ee tusmooyinka bitmap-ka waa in naloo sheegay inaanay ku habboonayn noocyada weydiimaha ka adag, sida su'aalaha dhererka.

Runtii, haddii aad ka fikirto, hawlgallada yaryar sida AND, AMA, iwm. aad uguma habboona su'aalaha a la "I tusi hudheelada qiimaha qolalka u dhexeeya 200 iyo 300 dollars habeenkii."
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Xalka aan caqli-gal ahayn ee aan caqli-gal ahayn wuxuu noqon karaa in la qaato natiijooyinka qiimihiisu dollar kasta oo lagu daro hawlgal AMA xoogaa yar.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Xalka waxoogaa ka wanaagsan ayaa noqon doona in la isticmaalo kooxaynta. Tusaale ahaan, kooxo 50 dollar ah. Tani waxay dedejinaysaa geedi socodkayaga 50 jeer.

Laakiin dhibaatada sidoo kale si fudud ayaa loo xalliyaa iyadoo la isticmaalayo aragti si gaar ah loogu abuuray codsiga noocan ah. Waraaqaha sayniska waxaa loogu yeeraa khariidad-qaran oo kala duwan.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Matalaaddan, ma dejineyno hal xoogaa qiimo ah (tusaale, 200), laakiin dhig qiimahan iyo wax kasta oo sarreeya. 200 iyo ka badan. Isku mid ah 300: 300 iyo wixii ka sareeya. Iyo wixi la mida.

Annaga oo adeegsanayna matalaaddan, waxaan kaga jawaabi karnaa weydiinta raadinta noocan oo kale ah annagoo ka gudubnay tusmada laba jeer oo keliya. Marka hore, waxaan heli doonaa liiska hoteellada uu qolku ka yar yahay ama $300, ka dibna waxaan ka saari doonaa kuwa qiimaha qolku ka yar yahay ama $ 199. Diyaar.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waad yaabi doontaa, laakiin xitaa juquraafiga waa suurtagal iyadoo la adeegsanayo tusmooyinka bitmap. Khiyaamada ayaa ah in la isticmaalo matalaad joomatari oo ku wareegsan iskudubaridkaaga sawir joomatari. Tusaale ahaan, S2 ee Google. Shaxanku waa inuu ahaadaa mid u taagan qaab saddex ama in ka badan oo xariiqyo is-goysyada ah oo la tirin karo. Sidan ayaan juqraafiyeedkayaga u rogi karnaa dhawr su'aalood "oo la socdo farqiga"

Xalalka Diyaarinta

Waxaan rajeynayaa inaan wax yar ku xiisaynayo oo aad hadda ku haysato qalab kale oo waxtar leh arsenalkaaga. Haddii aad waligaa u baahan tahay inaad samayso wax sidan oo kale ah, waxaad garan doontaa qaabka aad u ekaan lahayd.

Si kastaba ha ahaatee, qof kastaa ma haysto wakhti, dulqaad, ama agab uu ku abuuro tusmooyinka bitmap meel eber ah. Gaar ahaan kuwa aad u horumarsan, oo isticmaalaya SIMD, tusaale ahaan.

Nasiib wanaag, waxaa jira dhowr xal oo diyaarsan oo ku caawinaya.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

Qariiradaha ciyaya

Marka hore, waxa jirta maktabada qaylo-dhaanta bitmaps-ka ee aan hore uga hadlay. Waxay ka kooban tahay dhammaan weelasha lagama maarmaanka ah iyo hawlaha yar ee aad u baahan doonto si aad u samayso tusmaynta khariidad buuxda.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Nasiib darro, wakhtigan xaadirka ah, mid ka mid ah hirgelinta Go ma adeegsato SIMD, taas oo macnaheedu yahay in hirgelinta Go ay ka yar tahay waxqabadka C, tusaale ahaan.

Pilosa

Alaab kale oo ku caawin karta waa Pilosa DBMS, taas oo, dhab ahaantii, kaliya leh tusmooyinka bitmap. Tani waa xal cusub, laakiin waxay ku kasbanaysaa quluubta si xawli ah.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Pilosa waxay isticmaashaa qariiradaha guuxa gudaha waxayna ku siinaysaa awood aad ku isticmaasho, fududayso oo ay sharaxdo dhamaan waxyaalihii aan kor kaga hadlay: kooxaynta, khariidad-qaran-qaran, fikradda goobta, iwm.

Aynu si degdeg ah u eegno tusaale isticmaalka Pilosa si aad uga jawaabto su'aal aad hore u taqaannay.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Tusaalaha wuxuu aad ugu eg yahay waxaad horay u aragtay. Waxaan u abuurnaa macmiil server-ka Pilosa, waxaanu abuurnaa tusmeeyo iyo meelaha lagama maarmaanka ah, ka dib waxaan ka buuxinaa beeraheena xog aan kala sooc lahayn oo leh ixtimaalka iyo, ugu dambeyntii, fulinta weydiinta la yaqaan.

Taas ka dib, waxaan u isticmaalnaa MA on garoonka "qaali ah", ka dibna isku xira natiijada (ama AND it) garoonka "terrace" iyo garoonka "boos-celinta". Ugu dambeyntiina, waxaan helnaa natiijada ugu dambeysa.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Waxaan runtii rajeynayaa in mustaqbalka la filayo in nooca cusub ee tusaha uu sidoo kale ka soo muuqan doono DBMS-yada sida MySQL iyo PostgreSQL - bitmap indexes.
Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah

gunaanad

Tusmooyinka Bitmap ee Go: ku raadi xawaaraha duurjoogta ah
Haddii aanad weli seexan, mahadsanid. Waxay ahayd inaan si kooban u taabto mowduucyo badan waqti xaddidan awgeed, laakiin waxaan rajeynayaa in hadalku ahaa mid faa'iido leh oo laga yaabo inuu xitaa dhiirigeliyo.

Tusmooyinka Bitmap-ka ayaa wanaagsan in wax laga ogaado, xitaa haddii aadan hadda u baahnayn. U ogolow inay noqdaan qalab kale oo ku jira sanduuqaaga qalabka.

Waxaan u eegnay tabaha waxqabadka ee kala duwan ee Go iyo waxyaalaha aanu iskudubariduhu si fiican weli u qabsan. Laakin tani aad bay faa'iido ugu leedahay barnaamij kasta oo Go inuu ogaado.

Taasi waa waxa aan rabay in aan kuu sheego. Mahadsanid!

Source: www.habr.com

Add a comment