Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Sava lalana

Nomeko tamin'ny teny anglisy ity tatitra ity tamin'ny fihaonambe GopherCon Russia 2019 tany Moskoa sy tamin'ny teny Rosiana nandritra ny fihaonana tany Nizhny Novgorod. Isika miresaka momba ny bitmap index - tsy fahita firy noho ny B-tree, fa tsy dia mahaliana. MIRESAKA fandraisam-peo lahateny tamin'ny kaonferansa tamin'ny teny Anglisy sy ny fandikana lahatsoratra amin'ny teny Rosiana.

Hojerentsika ny fomba fiasan'ny index bitmap, rehefa tsara kokoa, rehefa ratsy kokoa noho ny indexes hafa, ary amin'ny toe-javatra inona no haingana kokoa noho izy ireo; Andeha hojerentsika hoe iza amin'ireo DBMS malaza efa manana mari-pamantarana bitmap; Andeha isika hiezaka hanoratra ny antsika manokana ao amin'ny Go. Ary "ho an'ny tsindrin-tsakafo" dia hampiasa tranomboky efa vita izahay mba hamoronana angon-drakitra manokana manokana haingana haingana.

Tena manantena aho fa mahasoa sy mahaliana anao ny asako. Mandehana!

fampidirana

Milalao video

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

Salama daholo! Amin'ny enina hariva izao ary reraka be izahay rehetra. Fotoana tsara hiresahana momba ny teorian'ny index database mankaleo, sa tsy izany? Aza manahy fa hanana andalana roa misy kaody loharano etsy sy eroa aho. 🙂

Ankoatra ny vazivazy rehetra, feno vaovao ny tatitra, ary tsy manam-potoana firy izahay. Andeha àry isika hanomboka.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Anio aho dia hiresaka momba ireto manaraka ireto:

  • inona ny index;
  • inona ny index bitmap;
  • aiza no ampiasaina ary aiza no TSY ampiasaina ary nahoana;
  • fampiharana tsotra ao amin'ny Go ary tolona kely amin'ny compiler;
  • somary tsy dia tsotra, fa fampiharana mahomby kokoa amin'ny Go assembler;
  • "olana" amin'ny fanondro bitmap;
  • fampiharana efa misy.

Inona àry no atao hoe index?

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny index dia rafitra angon-drakitra misaraka izay tazomintsika sy havaozinay ankoatra ny angona fototra. Ampiasaina hanafainganana ny fikarohana. Raha tsy misy index, ny fikarohana dia mitaky ny fandehanana amin'ny angon-drakitra tanteraka (dingana iray antsoina hoe scan feno), ary ity dingana ity dia manana fahasarotana algorithmic linear. Saingy ny angon-drakitra mazàna dia misy angon-drakitra be dia be ary miadana loatra ny fahasarotan'ny linear. Ny tsara indrindra dia mahazo logarithmic na tsy miova isika.

Lohahevitra saro-takarina be ity, feno hafetsifetsena sy fifanakalozam-bola, saingy rehefa avy nijery am-polony taona maro tamin'ny fampivoarana sy fikarohana momba ny angon-drakitra aho, dia vonona ny hilaza aho fa vitsivitsy ihany ny fomba fampiasa be mpampiasa amin'ny famoronana index database.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny fomba voalohany dia ny fampihenana ara-jeografika ny habaka fikarohana, ny fizarana ny habaka fikarohana ho ampahany kely.

Amin'ny ankapobeny dia mampiasa karazana hazo samihafa izahay. Ohatra iray dia boaty lehibe misy fitaovana ao amin'ny efi-tranonao izay misy boaty kely misy fitaovana mizara ho lohahevitra samihafa. Raha mila fitaovana ianao dia mety hitady azy ireo ao anaty boaty misy soratra hoe "Materials" fa tsy ilay hoe "Cookies", sa tsy izany?

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny fomba faharoa dia ny fisafidianana avy hatrany ny singa na vondron'ny singa irina. Manao izany izahay amin'ny sari-tany tenifototra na fanondroana mivadika. Ny fampiasana sarintany tenifototra dia mitovy amin'ny ohatra teo aloha, fa raha tokony ho boaty misy boaty ianao, dia manana baoritra kely misy entana farany ao amin'ny efitranonao.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny fomba fahatelo dia ny fanafoanana ny filàna fikarohana. Mampiasa sivana Bloom na sivana cuckoo izahay. Ny voalohany dia manome valiny eo no ho eo, ary mamonjy anao amin'ny fitadiavana.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny fomba farany dia ny fampiasana feno ny hery rehetra omen'ny fitaovana maoderina antsika. Izany indrindra no ataontsika amin'ny fanondroana bitmap. Eny, rehefa mampiasa azy ireo isika indraindray dia mila mamakivaky ny index iray manontolo, fa manao izany amin'ny fomba mahomby.

Araka ny nolazaiko, midadasika sy feno marimaritra iraisana ny lohahevitry ny index database. Midika izany fa indraindray isika dia afaka mampiasa fomba fiasa maromaro miaraka: raha mila manafaingana bebe kokoa ny fikarohana isika, na raha mila manarona ny karazana fikarohana rehetra azo atao.

Androany aho dia hiresaka momba ny fomba tsy dia fantatra loatra amin'ireo - indexes bitmap.

Iza moa aho no hiresaka momba ity lohahevitra ity?

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Miasa ho mpitarika ekipa ao amin'ny Badoo aho (angamba fantatrao kokoa ny vokatray hafa, Bumble). Efa manana mpampiasa 400 tapitrisa mahery eran'izao tontolo izao isika ary endri-javatra maro mifantina ny lalao tsara indrindra ho azy ireo. Manao izany izahay amin'ny fampiasana serivisy manokana, anisan'izany ny fanondro bitmap.

Inona àry no atao hoe index bitmap?

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny mari-pamantarana bitmap, araka ny soso-kevitry ny anarana, dia mampiasa bitmaps na bitsets mba hampiharana fanondroana fikarohana. Raha jerena amin'ny mason'ny vorona, ity tondro ity dia ahitana bitmaps iray na maromaro misolo tena ireo singa rehetra (toy ny olona) sy ny fananany na masontsivana (taona, lokon'ny maso, sns.), ary algorithm iray mampiasa asa kely (AND, OR, NOT). ) hamaliana ny fangatahana fikarohana.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Nolazaina taminay fa ny mari-pamantarana bitmap dia mety indrindra ary tena mahomby amin'ny tranga misy fikarohana izay manambatra fanontaniana amin'ny tsanganana kardinaly ambany (eritrereto ny "loko maso" na "statut mariage" mifanohitra amin'ny zavatra toy ny "lavitra ny afovoan-tanàna" ). Saingy hasehoko any aoriana fa miasa tsara ho an'ny tsanganana kardinaly avo ihany koa izy ireo.

Andeha hojerentsika ny ohatra tsotra indrindra amin'ny index bitmap.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Alaivo sary an-tsaina hoe manana lisitr'ireo trano fisakafoanana ao Moskoa manana fananana binary toy ireto izahay:

  • akaikin'ny metro;
  • misy parking manokana;
  • misy veranda (misy terrasse);
  • afaka mamandrika latabatra ianao (manaiky famandrihana);
  • mety ho an'ny mpihinan-kena (vegan);
  • lafo (lafo).

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Andeha homentsika laharana filaharana manomboka amin'ny 0 ny trano fisakafoanana tsirairay ary omeo fahatsiarovana ho an'ny bitmaps 6 (iray ho an'ny toetra tsirairay). Avy eo dia hofenoinay ireo bitmap ireo miankina amin'ny hoe manana an'io fananana io ny trano fisakafoanana na tsia. Raha manana veranda ny trano fisakafoanana 4, dia apetraka amin'ny 4 ny bit No. 1 ao amin'ny bitmap "manana veranda" (raha tsy misy veranda dia 0).
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Amin'izao fotoana izao dia manana ny mari-pamantarana bitmap tsotra indrindra azo atao izahay, ary azonay ampiasaina hamaliana fanontaniana toy ny:

  • “Asehoy ahy ny trano fisakafoanana mahavelona zava-maniry”;
  • “Asehoy ahy ny trano fisakafoanana mora misy veranda ahafahanao mamandrika latabatra.”

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ahoana? Andeha hojerentsika. Ny fangatahana voalohany dia tena tsotra. Ny hany tokony hataontsika dia ny maka ny bitmap “vegetarian friendly” ary mamadika izany ho lisitry ny trano fisakafoanana izay mibaribary ny bitikany.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny fangatahana faharoa dia somary sarotra kokoa. Mila mampiasa ny TSY bitmap amin'ny bitmap "lafo" isika mba hahazoana lisitry ny trano fisakafoanana tsy lafo, avy eo ARY miaraka amin'ny bitmap "afaka mamandrika latabatra" ary ARY ny valiny miaraka amin'ny bitmap "misy veranda". Ny bitmap vokarina dia ahitana lisitr'ireo orinasa mahafeno ny fepetra rehetra ananantsika. Amin'ity ohatra ity dia ny trano fisakafoanana Yunost ihany.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Betsaka ny teoria tafiditra ao, fa aza manahy fa ho hitantsika tsy ho ela ny code.

Aiza no ampiasaina ny fanondroana bitmap?

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Raha Google bitmap index, 90% ny valiny dia mifandray amin'ny Oracle DB amin'ny fomba iray na hafa. Saingy ny DBMS hafa dia mety manohana zavatra mahafinaritra toy izany, sa tsy izany? Tsy dia izany loatra.

Andeha hojerentsika ny lisitry ny tena ahiahiana.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny MySQL dia tsy mbola manohana ny mari-pamantarana bitmap, fa misy soso-kevitra manoro hevitra ny hampiditra ity safidy ity (https://dev.mysql.com/worklog/task/?id=1524).

Ny PostgreSQL dia tsy manohana ny mari-pamantarana bitmap, fa mampiasa bitmap tsotra sy asa bitika mba hanambatra ny valin'ny fikarohana amin'ny fanondroana maro hafa.

Tarantool dia manana indexes bitset ary manohana fikarohana tsotra momba azy ireo.

Redis dia manana bitfield tsotra (https://redis.io/commands/bitfield) tsy manana fahafahana hikaroka azy ireo.

Ny MongoDB dia tsy mbola manohana ny mari-pamantarana bitmap, fa misy ihany koa ny Soso-kevitra milaza fa ampiana ity safidy ity. https://jira.mongodb.org/browse/SERVER-1723

Elasticsearch dia mampiasa bitmaps anatiny (https://www.elastic.co/blog/frame-of-reference-and-roaring-bitmaps).

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

  • Saingy nisy mpifanila trano vaovao niseho tao an-tranonay: Pilosa. Ity dia angona vaovao tsy misy ifandraisany voasoratra ao amin'ny Go. Tsy misy afa-tsy mari-pamantarana bitmap ary mifototra amin'izy ireo ny zava-drehetra. Hiresaka momba izany isika aoriana kely.

Fampiharana ao amin'ny Go

Fa maninona no zara raha ampiasaina ny index bitmap? Alohan'ny hamaliana an'io fanontaniana io dia tiako ny hampiseho aminao ny fomba fampiharana index bitmap tena tsotra ao amin'ny Go.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny bitmaps dia ampahany fotsiny amin'ny angona. Ao amin'ny Go, andao hampiasa tsipika byte amin'izany.

Manana bitmap iray ho an'ny toetran'ny trano fisakafoanana iray isika, ary ny bitika tsirairay ao amin'ny bitmap dia manondro raha manana an'io fananana io ny trano fisakafoanana iray na tsia.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Mila asa mpanampy roa isika. Ny iray dia hampiasaina hamenoana ny bitmaps amin'ny angona kisendrasendra. Kisendrasendra, saingy amin'ny mety ho fananan'ny trano fisakafoanana tsirairay. Ohatra, mino aho fa vitsy dia vitsy ny trano fisakafoanana ao Moskoa izay tsy ahafahanao mamandrika latabatra, ary toa ahy fa manodidina ny 20% amin'ireo trano fandraisam-bahiny no mety ho an'ny mpihinan-kena.

Ny asa faharoa dia hanova ny bitmap ho lisitry ny trano fisakafoanana.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Mba hamaliana ny fanontaniana hoe "Asehoy ahy ny trano fisakafoanana mora manana patio ary afaka manao famandrihana", mila fandidiana roa izahay: TSIA sy AND.

Afaka manatsotra kely ny kaodinay izahay amin'ny fampiasana ilay operator sarotra kokoa AND NOT.

Manana asa ho an'ny tsirairay amin'ireo asa ireo izahay. Samy mandeha amin'ny silaka izy ireo, maka ireo singa mifanaraka amin'ny tsirairay, manambatra azy ireo amin'ny asa kely ary mametraka ny vokatra ao amin'ny tapa-kazo.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ary ankehitriny isika dia afaka mampiasa ny bitmaps sy ny asa mba hamaliana ny fikarohana.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Tsy dia avo loatra ny fampisehoana, na dia tena tsotra aza ny fiasa ary nitahiry vola be izahay tamin'ny tsy namerenanay ampahany vaovao isaky ny niantsoana ilay asa.

Rehefa avy nanao profiling kely niaraka tamin'ny pprof aho, dia nahatsikaritra fa ny Go compiler dia tsy ampy fanatsarana tena tsotra nefa tena manan-danja: ny inlining.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny zava-misy dia ny Go compiler dia matahotra mafy amin'ny tadivavarana mandalo amin'ny silaka, ary mandà tanteraka ny asa an-tsoratra izay misy tadivavarana toy izany.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Saingy tsy matahotra aho ary afaka mamitaka ny compiler amin'ny fampiasana goto fa tsy loop, toy ny tamin'ny andro taloha.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ary, araka ny hitanao, ankehitriny ny compiler dia ho faly inline ny asany! Vokatr'izany dia afaka mitahiry 2 microseconds eo ho eo izahay. Tsy ratsy!

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Ny bottleneck faharoa dia mora jerena raha mijery akaiky ny fivoahan'ny fivoriambe ianao. Ny compiler dia nanampy fisavana sisin-tany tao anatin'ny tadivavaranay mafana indrindra. Ny zava-misy dia fiteny azo antoka ny Go, matahotra ny mpanangom-bokatra fa samy hafa habe ny fandresen-dahatrako telo (teboka telo). Rehefa dinihina tokoa, dia hisy ny teorika mety hitranga ny antsoina hoe buffer overflow.

Andao hanome toky ny mpamoron-javatra amin'ny fanehoana azy fa mitovy habe ny silaka rehetra. Afaka manao izany isika amin'ny alalan'ny fanampiana fanamarinana tsotra eo am-piandohan'ny asantsika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Rehefa nahita izany ilay mpanangom-bokatra dia nitsambikina tamim-pifaliana ny taratasim-bola, ary nitahiry 500 nanoseconds hafa izahay.

Big butches

Eny ary, nahavita nanery ny fampisehoana izahay tamin'ny fampiharana tsotra anay, fa ity vokatra ity dia tena ratsy kokoa noho ny azo atao amin'ny fitaovana ankehitriny.

Ny hany ataontsika dia ny fampandehanana bitika fototra, ary ny processeurs dia mahavita azy ireo amin'ny fomba mahomby. Saingy, indrisy, "mamelona" ny processeur amin'ny asa kely izahay. Ny asantsika dia manao asa amin'ny alàlan'ny byte-by-byte. Azontsika atao mora foana ny manitsy ny kaodinay mba hiasa miaraka amin'ny tsipika 8-byte amin'ny alàlan'ny silaka UInt64.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Araka ny hitanao, io fiovana kely io dia nanafaingana ny fandaharantsika im-valo tamin'ny fampitomboana avo valo heny ny haben'ny andiany. Ny tombony dia azo lazaina ho linear.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Hiverina any amin'ny assembler

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Tsy izao anefa no farany. Ny processeurs dia afaka miasa miaraka amin'ny 16, 32 ary na 64 bytes aza. Ny asa "mivelatra" toy izany dia antsoina hoe angon-drakitra maromaro (SIMD; fampianarana iray, angon-drakitra maro), ary ny dingan'ny fanovana code mba hampiasana ny asa toy izany dia antsoina hoe vectorization.

Indrisy anefa, ny compiler Go dia tsy tsara amin'ny vectorization. Amin'izao fotoana izao, ny hany fomba ahafahana mamaha ny kaody Go dia ny maka sy mametraka ireo asa ireo amin'ny alàlan'ny Go assembler.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Go assembler dia biby hafahafa. Fantatrao angamba fa ny fiteny fivoriambe dia zavatra mifamatotra mafy amin'ny rafitry ny solosaina anoratanao, saingy tsy izany no zava-misy ao amin'ny Go. Ny Go assembler dia mitovy kokoa amin'ny IRL (fitenin'ny solontenan'ny mpanelanelana) na fiteny mpanelanelana: tena mahaleo tena amin'ny sehatra izy io. Rob Pike dia nanao fampisehoana tsara TATITRA momba ity lohahevitra ity taona maromaro lasa izay tao amin'ny GopherCon any Denver.

Ho fanampin'izay, mampiasa endrika Plan 9 tsy mahazatra i Go, izay tsy mitovy amin'ny endrika AT&T sy Intel ekena amin'ny ankapobeny.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Azo lazaina fa tsy mahafinaritra indrindra ny manoratra Go assembler amin'ny tanana.

Saingy, soa ihany fa efa misy fitaovana avo lenta roa manampy antsika hanoratra Go assembler: PeachPy sy avo. Ireo fitaovana roa ireo dia mamorona Go assembler avy amin'ny kaody avo lenta voasoratra amin'ny Python sy Go.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ireo fitaovana ireo dia manamora ny zavatra toy ny fizarana fisoratana anarana, fanoratana tadivavarana, ary amin'ny ankapobeny dia manamora ny fizotry ny fidirana amin'ny tontolon'ny fandaharana fivoriambe ao amin'ny Go.

Hampiasa avo izahay, ka saika ho programa Go mahazatra ny programanay.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Toy izao ny ohatra tsotra indrindra amin'ny programa avo. Manana asa lehibe () isika, izay mamaritra ao anatiny ny fiasa Add(), izay midika hoe manampy isa roa. Misy asa mpanampy eto mba hahazoana masontsivana amin'ny anarana sy hahazoana ny iray amin'ireo rejisitra processeur maimaim-poana sy mety. Ny fiasan'ny processeur tsirairay dia manana fiasa mifanaraka amin'izany eo amin'ny avo, araka ny hita ao amin'ny ADDQ. Farany, mahita asa mpanampy amin'ny fitehirizana ny sanda vokarina isika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Amin'ny fiantsoana ny go Gene dia hanatanteraka ny programa amin'ny avo izahay ary vokatr'izany dia hisy rakitra roa hatsangana:

  • add.s miaraka amin'ny kaody vokarina ao amin'ny Go assembler;
  • stub.go miaraka amin'ny lohatenin'ny asa hampifandraisana ireo tontolo roa: Mandehana ary assembler.

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Efa hitantsika izao ny ataon'ny avo sy ny fomba fiasa, andeha hojerentsika ny asany. Nametraka dikan-teny scalar sy vector (SIMD) amin'ny fiasa aho.

Andeha hojerentsika aloha ny dikan-teny scalar.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Toy ny tamin'ny ohatra teo aloha, mangataka rejisitra ankapobe maimaim-poana sy manan-kery isika, tsy mila manao kajy ny offset sy ny habe ho an'ny tohan-kevitra. avo manao izany rehetra izany ho antsika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Nampiasa etikety sy goto (na hitsambikina) izahay taloha mba hanatsarana ny fampisehoana sy hamitahana ny mpamoron-kira Go, fa izao no ataontsika hatrany am-boalohany. Ny zava-misy dia ny tsingerina dia hevitra ambony kokoa. Ao amin'ny assembler, manana labels sy jumps ihany izahay.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny kaody sisa dia tokony ho efa mahazatra sy azo takarina. Manahaka loop misy marika sy mitsambikina isika, maka angon-drakitra kely avy amin'ny silaka roa, manambatra azy ireo amin'ny hetsika kely (ARY TSY amin'ity tranga ity) ary avy eo dia mametraka ny vokatra ao amin'ny tapa-kazo. Rehetra.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Toy izao ny endriky ny kaody assembler farany. Tsy voatery nanao kajy ny offset sy ny habe izahay (nasongadina tamin'ny maitso) na nanara-maso ny rejisitra nampiasaina (nasongadina tamin'ny mena).
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Raha ampitahaintsika amin'ny fampitahana ny fampiharana ny teny assemblée amin'ny fampiharana tsara indrindra ao amin'ny Go, dia ho hitantsika fa mitovy ihany izany. Ary andrasana izany. Raha ny marina, tsy nanao zavatra manokana izahay - naverinay fotsiny izay hataon'ny compiler Go.

Indrisy anefa fa tsy afaka manery ny mpanangom-bokatra izahay hampiditra ny asa ataonay voasoratra amin'ny fiteny fivoriambe. Ny Go compiler amin'izao fotoana izao dia tsy manana endri-javatra toy izany, na dia efa nisy aza ny fangatahana hanampiana azy hatry ny ela.

Izany no antony tsy ahafahana mahazo tombony amin'ny asa madinika amin'ny fiteny fivoriambe. Mila manoratra asa lehibe isika, na mampiasa ny fonosana matematika/bits vaovao, na mandalo ny fiteny assembler.

Andeha hojerentsika ny dikan-teny vector amin'ny fiasantsika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ho an'ity ohatra ity dia nanapa-kevitra ny hampiasa AVX2 aho, noho izany dia hampiasa asa izay miasa amin'ny 32-byte chunks izahay. Ny firafitry ny kaody dia tena mitovy amin'ny dikan-scalar: mametaka paramètres, mangataka rejisitra zaraina maimaim-poana, sns.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny zava-baovao iray dia ny fampandehanana vector mivelatra kokoa dia mampiasa rejisitra midadasika manokana. Amin'ny tranga 32-byte dia rejisitra misy tovana Y. Izany no antony ahitanao ny YMM() miasa ao amin'ny code. Raha mampiasa AVX-512 miaraka amin'ny 64-bit aho dia Z ny prefix.

Ny fanavaozana faharoa dia nanapa-kevitra aho ny hampiasa optimization antsoina hoe loop unrolling, izay midika hoe manao asa valo amin'ny tanana alohan'ny hitsambikina mankany amin'ny fiandohan'ny loop. Ity fanatsarana ity dia mampihena ny isan'ny sampana ao amin'ny kaody, ary voafetra amin'ny isan'ny rejisitra maimaim-poana misy.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Eny ary, ahoana ny momba ny fampisehoana? tsara tarehy izy! Nahavita haingana impito teo ho eo izahay raha oharina amin'ny vahaolana Go tsara indrindra. Mahavariana, sa tsy izany?
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Saingy na dia ity fampiharana ity aza dia mety ho haingana kokoa amin'ny alàlan'ny fampiasana AVX-512, prefetching na JIT (mpamorona fotoana fotsiny) ho an'ny mpandrindra fangatahana. Saingy azo antoka fa lohahevitra iray ho an'ny tatitra manokana izany.

Olana amin'ny fanondroana bitmap

Ankehitriny isika dia efa nijery fampiharana tsotra amin'ny fanondro bitmap ao amin'ny Go sy ny iray mamokatra kokoa amin'ny fiteny fivoriambe, andeha hojerentsika amin'ny farany ny antony tsy dia ampiasaina loatra ny fanondroana bitmap.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny taratasy taloha dia milaza olana telo amin'ny indeksan'ny bitmap, fa ny taratasy vaovao sy izaho dia milaza fa tsy misy dikany intsony izy ireo. Tsy hilentika lalina amin’ny tsirairay amin’ireo olana ireo isika, fa hojerentsika amin’ny endriny ivelany.

Ny olan'ny kardinaly avo

Noho izany, lazaina fa ny indeksan'ny bitmap dia mety ho an'ny saha misy kardinaly ambany ihany, izany hoe, ireo izay manana soatoavina vitsy (ohatra, ny lokon'ny maso na ny lahy sy ny vavy), ary ny antony dia ny fanehoana mahazatra ny sehatra toy izany (iray). bit isaky ny sandany) raha ny kardinaly avo dia haka toerana be loatra ary, ankoatra izany, ireo indeksan'ny bitmap dia ho feno (mahalana).
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Indraindray isika dia mety mampiasa fanehoana hafa, toy ny mahazatra ampiasaina hanehoana isa. Saingy ny fahatongavan'ireo algorithms compression no nanova ny zava-drehetra. Tao anatin'ny folo taona lasa, ny mpahay siansa sy ny mpikaroka dia namorona algorithms famatrarana marobe ho an'ny bitmaps. Ny tombony lehibe indrindra amin'izy ireo dia ny hoe tsy ilaina ny manafoana ny bitmaps mba hanaovana asa bitika - afaka manao hetsika bitika mivantana amin'ny bitmap voaporitra isika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Vao haingana, nanomboka niseho ny fomba hybrid, toy ny bitmaps mirohondrohona. Mampiasa fanehoana telo samihafa ho an'ny bitmaps izy ireo miaraka - ny bitmaps mihitsy, ny arrays ary ny antsoina hoe bit run - ary ny fifandanjana eo amin'izy ireo mba hanamafisana ny fampisehoana sy hampihenana ny fanjifana fahatsiarovana.

Afaka mahita bitmaps mirohondrohona ianao amin'ny fampiharana malaza indrindra. Efa be dia be ny fampiharana ho an'ny fiteny fandaharana isan-karazany, anisan'izany ny fampiharana telo mahery ho an'ny Go.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Fomba iray hafa izay afaka manampy antsika hiatrika ny kardinaly avo dia antsoina hoe binning. Alaivo sary an-tsaina hoe manana saha maneho ny haavon'ny olona iray ianao. Ny haavony dia isa mitsingevana, fa isika olombelona dia tsy mieritreritra izany. Aminay dia tsy misy maha samy hafa ny haavony 185,2 sm sy 185,3 sm.

Hita fa afaka manambatra sanda mitovy amin'ny vondrona ao anatin'ny 1 cm isika.

Ary raha fantatsika koa fa vitsy dia vitsy ny olona fohy noho ny 50 sm ary ambony noho ny 250 sm, dia azo atao ny mamadika saha misy kardinaly tsy manam-petra ho saha misy kardinaly manodidina ny 200 sandany.

Mazava ho azy fa raha ilaina dia afaka manao sivana fanampiny isika aorian'izay.

Olana Bandwidth avo

Ny olana manaraka amin'ny index bitmap dia mety ho lafo be ny fanavaozana azy ireo.

Ny angon-drakitra dia tsy maintsy afaka manavao angon-drakitra raha toa ka misy fanontaniana an-jatony hafa mikaroka ny angona. Mila hidy izahay mba hisorohana ny olana amin'ny fidirana angon-drakitra miaraka na olana hafa fizarana. Ary raha misy hidy lehibe iray, dia misy olana - fifandirana hidin-trano, rehefa lasa bottleneck io hidin-trano io.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ity olana ity dia azo vahana na voahodina amin'ny alàlan'ny fampiasana sharding na fampiasana index versioned.

Ny Sharding dia zavatra tsotra sy malaza. Azonao atao ny manaparitaka ny index bitmap tahaka ny ataonao amin'ny angona hafa. Ho solon'ny hidin-trano lehibe iray, dia hahazo andiana hidin-trano kely ianao ary noho izany dia manala ny fifandirana hidin-trano.

Ny fomba faharoa hamahana ny olana dia ny fampiasana index versioned. Azonao atao ny manana dika mitovy amin'ny tondro ampiasainao amin'ny fikarohana na famakiana, ary ny iray ampiasainao hanoratana na fanavaozana. Ary indray mandeha ao anatin'ny fe-potoana iray (ohatra, indray mandeha isaky ny 100 ms na 500 ms) dia adikao sy ampifamadihanao. Mazava ho azy fa io fomba fiasa io dia tsy azo ampiharina afa-tsy amin'ny toe-javatra izay ahafahan'ny rindranasanao mitantana tondro fikarohana kely.

Ireo fomba roa ireo dia azo ampiasaina miaraka: azonao atao ny manana index versioned sharded.

Fanontaniana sarotra kokoa

Ny olana farany amin'ny fanondroana bitmap dia lazaina amintsika fa tsy mety amin'ny karazana fanontaniana sarotra kokoa izy ireo, toy ny fangatahana elanelam-potoana.

Eny tokoa, raha mieritreritra an'izany ianao, ny fandidiana kely toa ny AND, OR, sns. dia tsy mety amin'ny fanontaniana a la "Asehoy ahy ny hotely misy sarany eo anelanelan'ny 200 sy 300 dolara isan'alina."
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Vahaolana tsy misy dikany sy tena tsy hendry dia ny maka ny vokatra isaky ny sandan'ny dolara ary manambatra azy ireo amin'ny fandidiana OR bitwise.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny vahaolana tsara kokoa dia ny fampiasana vondrona. Ohatra, amin'ny vondrona 50 dolara. Hanafaingana ny dingana ataontsika in-50 izany.

Saingy mora voavaha ihany koa ny olana amin'ny fampiasana fomba fijery noforonina manokana ho an'ity karazana fangatahana ity. Ao amin'ny lahatsoratra siantifika dia antsoina hoe bitmaps misy code range.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Amin'ity fanehoana ity dia tsy mametraka kely fotsiny ho an'ny sanda sasany (ohatra, 200), fa mametraka io sanda io sy ny zava-drehetra ho ambony kokoa. 200 sy ambony. Mitovy amin'ny 300: 300 sy ambony. Sy ny sisa.

Amin'ny fampiasana an'io fanehoana io dia afaka mamaly io karazana fangatahana fikarohana io isika amin'ny alàlan'ny famakivakiana ny fanondroana indroa monja. Voalohany, hahazo lisitr'ireo trano fandraisam-bahiny izay latsaky ny $300 na $199 ny vidin'ilay efitrano, ary hesorinay avy eo ireo izay latsaky ny vidin'ny efitrano na $XNUMX. Vonona.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ho gaga ianao, fa na dia ny geoqueries aza dia azo atao amin'ny fampiasana indeksan'ny bitmap. Ny fika dia ny fampiasana endrika geometrika izay manodidina ny fandrindranao amin'ny endrika geometrika. Ohatra, S2 avy amin'ny Google. Ny tarehimarika dia tsy maintsy azo aseho amin'ny endrika telo na maromaro mifanipaka izay azo isaina. Amin'izany fomba izany no ahafahantsika mamadika ny geoquery ho fanontaniana maromaro "manaraka ny elanelana" (manaraka ireo andalana voaisa ireo).

Ready Solutions

Manantena aho fa mahaliana anao kely aho ary manana fitaovana mahasoa hafa ianao izao ao amin'ny arsenal anao. Raha mila manao zavatra toy izao ianao dia ho fantatrao ny fomba hijerena azy.

Na izany aza, tsy ny rehetra no manana fotoana, faharetana, na loharanon-karena hamoronana tondro bitmap hatramin'ny voalohany. Indrindra fa ireo efa mandroso kokoa, mampiasa SIMD, ohatra.

Soa ihany fa misy vahaolana efa vonona hanampy anao.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

Bitmaps mirohondrohona

Voalohany, misy ilay tranomboky bitmaps mirohondrohona izay efa noresahiko. Ahitana ny kaontenera ilaina rehetra sy ny fampandehanana bit izay ilainao hanaovana fanondroana bitmap feno.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Indrisy anefa fa amin'izao fotoana izao dia tsy misy amin'ireo fampiharana Go mampiasa SIMD, izay midika fa ny fampiharana Go dia tsy dia mahomby noho ny fampiharana C, ohatra.

Pilosa

Ny vokatra iray hafa afaka manampy anao dia ny Pilosa DBMS, izay, raha ny marina, dia manana mari-pamantarana bitmap. Vahaolana somary vaovao ihany ity, saingy mahazo fon'olona haingana be.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Pilosa dia mampiasa bitmaps mirohondrohona ao anatiny ary manome anao ny fahafahana mampiasa azy ireo, manatsotra ary manazava ny zavatra rehetra noresahiko tetsy ambony: fanakambanana, bitmaps misy fehezan-dalàna, ny foto-kevitry ny saha, sns.

Andeha hojerentsika vetivety ny ohatra iray amin'ny fampiasana Pilosa hamaliana fanontaniana efa mahazatra anao.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Ny ohatra dia mitovy amin'ny hitanao teo aloha. Mamorona mpanjifa ho an'ny mpizara Pilosa izahay, mamorona index sy saha ilaina, avy eo fenoy ny saha misy angona kisendrasendra miaraka amin'ny probabilities ary, farany, manatanteraka ny fangatahana mahazatra.

Aorian'izany dia mampiasa TSY amin'ny saha "lafo" isika, avy eo ampifandraiso amin'ny saha "terrace" sy ny saha "famandrihan-toerana" ny vokatra (na AND azy). Ary farany, mahazo ny vokatra farany isika.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Tena manantena aho fa amin'ny hoavy azo jerena dia hiseho amin'ny DBMS toy ny MySQL sy PostgreSQL - bitmap indexes ihany koa ity karazana index vaovao ity.
Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha

famaranana

Fanondroana bitmap ao amin'ny Go: mikaroka amin'ny hafainganam-pandeha
Raha mbola tsy renoky ny torimaso ianao dia misaotra. Tsy maintsy niresaka fohifohy momba ny lohahevitra maro aho noho ny fotoana voafetra, saingy manantena aho fa nahasoa ny lahateny ary mety nandrisika mihitsy aza.

Ny fanondroana bitmap dia tsara ho fantatra, na dia tsy ilainao amin'izao fotoana izao aza. Avelao ho fitaovana hafa ao amin'ny boaty fitaovanao izy ireo.

Nijery tetika fampisehoana isan-karazany ho an'ny Go sy ny zavatra mbola tsy zakain'ny Go compiler. Fa tena ilaina ho an'ny mpandrindra Go rehetra ho fantatry ny rehetra izany.

Izay ihany no tiako holazaina aminao. Misaotra anao!

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS 🔥 Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster