I tidigare delar (, ) har vi pratat om globaler som trÀd, i denna kommer vi att betrakta globaler som sparse-arrayer.
Àr en typ av array dÀr de flesta vÀrdena har samma vÀrde.
I praktiken finns det ofta sÄ stora sparse-arrayer att det inte finns nÄgot syfte att anvÀnda minne för att lagra identiska element. DÀrför Àr det meningsfullt att implementera sparse-arrayer sÄ att minnet inte gastar för att lagra samma vÀrden.
I vissa programmeringssprĂ„k Ă€r sparse-arrayer en del av sprĂ„ket, , . I andra programmeringssprĂ„k finns det speciella bibliotek som tillĂ„ter deras implementering. För C++ â och andra.
Globala Àr bra kandidater för implementering av sparse-arrayer, eftersom:
- De lagrar vÀrden endast för specifika noder och lagrar inga vÀrden för icke-definierade;
- GrÀnssnittet för att fÄ tillgÄng till vÀrdet av en nod liknar mycket det sÀtt som tillgÄng till ett element i en flerdimensionell array implementeras i mÄnga programmeringssprÄk.
Set ^a(1, 2, 3)=5 Write ^a(1, 2, 3) - Global Àr en tillrÀckligt lÄg nivÄ struktur för datalagring, vilket ger utmÀrkta hastighetskarakteristik (frÄn hundratusentals till tiotals miljoner transaktioner per sekund beroende pÄ hÄrdvara, se. )
Eftersom globalen Àr en bestÀndig struktur, har det mening att göra sparse-arrayer pÄ dem nÀr det pÄ förhand Àr kÀnt att mÀngden RAM kommer att vara otillrÀcklig.
En av egenskaperna hos implementationerna av sparse-arrayer Àr att de returnerar ett visst standardvÀrde om en begÀran görs till en icke-definierad cell.
Detta kan implementeras med hjÀlp av funktionen i COS. I detta exempel presenteras en 3-dimensionell array.
SET a = $GET(^a(x,y,z), defValue)Vilka uppgifter krÀver dÄ sparse-arrayer och hur kan globaler hjÀlpa?
Adjacensmatris (koppling)
anvÀnds för att representera grafer:

Det Àr uppenbart att ju större grafen Àr, desto fler nollor kommer att finnas i matrisen. Om till exempel en social nÀtverksgraf presenteras som en sÄdan matris, kommer den att nÀstan helt bestÄ av nollor, dvs. den kommer att vara en sparse-array.
StÀll ^m(id1, id2) = 1
StÀll ^m(id1, id3) = 1
StÀll ^m(id1, id4) = 1
StÀll ^m(id1) = 3
StÀll ^m(id2, id4) = 1
StÀll ^m(id2, id5) = 1
StÀll ^m(id2) = 2
....
I detta exempel sparar vi i globala ^m kopplingsmatrisen samt antalet kontakter för varje nod (vem som Àr vÀnner med vem och antalet vÀnner).
Om antalet element i grafen inte överstiger 29 miljoner (detta tal berÀknas som produkten av 8 * ), finns det en Ànnu mer ekonomisk metod för att lagra sÄdana matriser - bitstrÀngar, eftersom stora luckor optimeras pÄ ett sÀrskilt sÀtt i deras implementation.
Manipulationer med bitstrÀngar utförs med funktionen .
; stÀll bit
SET $BIT(rowID, positionID) = 1
; hÀmta bit
Skriv $BIT(rowID, positionID)
ĂvergĂ„ngstabell för en automat
Eftersom övergÄngsgrafen för en automat Àr en vanlig graf, Àr övergÄngstabellen för en automat ocksÄ samma typ av kopplingsmatris som nÀmnts ovan.
Cell-automer

Den mest kÀnda cellautomaten Àr , vilket pÄ grund av sina regler (nÀr en cell har mÄnga grannar - dör den) utgör en gles matris.
Stephen Wolfram anser att cellautomer Àr en . à r 2002 publicerade han en 1280 sidor lÄng bok 'A New Kind of Science', dÀr han brett argumenterar för att prestationer inom cellautomer inte Àr isolerade, utan mycket stabila och har stor betydelse för alla vetenskapsomrÄden.
Det har bevisats att varje algoritm som kan utföras pÄ en dator kan realiseras med hjÀlp av en cellautomat. Cellautomer anvÀnds för att modellera dynamiska miljöer och system, för att lösa algoritmiska problem och för andra syften.
Om vi har ett stort fÀlt och behöver registrera alla mellanliggande tillstÄnd för cellautomaten, Àr det helt rimligt att anvÀnda globala variabler.
Kartografi
Det första som kommer i Ätanke nÀr det handlar om att anvÀnda glesa matriser Àr kartografiska uppgifter.
Som regel finns det mycket tomt utrymme pÄ kartor. Om man förestÀller sig en karta som stora pixlar, skulle 71 % av pixlarna pÄ jorden upptas av oceaner. En gles matris. Och om man bara markerade mÀnskliga skapelser skulle mer Àn 95 % vara tomt utrymme.
SjÀlvklart lagrar ingen kartor som rastermatriser, istÀllet anvÀnds vektorrepresentation.
Men vad Àr vektorkartor? Det Àr en viss ram som bestÄr av punkter, polylinjer och polygoner.
Det Àr i praktiken en databas med punkter och relationer mellan dem.
En av de mest ambitiösa kartlĂ€ggningsuppgifterna Ă€r kartlĂ€ggningen av vĂ„r galax med teleskopet Gaia. Bildligt talat Ă€r vĂ„r galax, liksom hela universum, ett sammanhĂ€ngande glesmönster: enorma tomma rum dĂ€r det finns sĂ€llsynta smĂ„ punkter â stjĂ€rnor. Tomt utrymme utgör 99,999999âŠâŠ.%. För att lagra en karta över vĂ„r galax valdes en global databas â CachĂ©.
Jag kÀnner inte den exakta strukturen för globaler i det hÀr projektet, men jag kan anta att det ungefÀr ser ut som:
Set ^galaxy(b, l, d) = 1; StjÀrnnummer i katalogen, om det finns
Set ^galaxy(b, l, d, "name") = "Sol"
Set ^galaxy(b, l, d, "type") = "normal"; alternativ som blackhole, quasar, red_dwarf osv.
Set ^galaxy(b, l, d, "weight") = 14E50
Set ^galaxy(b, l, d, "planetes") = 7
Set ^galaxy(b, l, d, "planetes", 1) = "Merkurius"
Set ^galaxy(b, l, d, "planetes", 1, weight) = 1E20
...
DĂ€r b, l, d â Ă€r och avstĂ„ndet till solen.
Den flexibla strukturen av globaler gör det möjligt att lagra alla nödvÀndiga egenskaper hos stjÀrnor och planeter, eftersom databaser pÄ globaler Àr schemaslösa.
För lagring av kartan över vÄrt universum valdes Caché inte bara för sin flexibilitet utan ocksÄ för sin snabbhet i dataflödeslagring, samtidigt som den genererar indexglobaler för snabb sökning.
Tillbaka till jorden, sĂ„ skapades kartlĂ€ggningsprojekt pĂ„ globaler. och en fork av OpenStreetMap â .
Nyligen pÄ genomfördes geospatiala index . Vi vÀntar pÄ detaljer om implementationen frÄn artikelförfattarna.
Implementeringen av rumsliga index pÄ globaler i OpenStreetMap XAPI
Bilderna Àr hÀmtade frÄn .
Hela jordklotet delas upp i kvadrater, sedan underkvadrater och underkvadrater till underunderkvadrater och sÄ vidare. I stort sett fÄr vi en hierarkisk struktur för lagring, för vilken globaler har skapats.

Vid varje tillfÀlle kan vi nÀstan omedelbart begÀra den nödvÀndiga kvadraten eller rensa den, och alla underkvadrater returneras eller rensas ocksÄ.
En liknande struktur kan implementeras pÄ globaler pÄ flera sÀtt.
Alternativ 1:
Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 1) = idFörstaPunkten
Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 2) = idAndraPunkten
...Alternativ 2:
Set ^m('abacdabcdabacdabcda', 1) = idFörstaPunkten
Set ^m('abacdabcdabacdabcda', 2) = idAndraPunkten
...I bÄda fallen Àr det enkelt att begÀra punkterna som ligger inom en kvadrat av valfri storlek pÄ COS/M. Det Àr nÄgot lÀttare att rensa kvadrater av valfri storlek i det första alternativet, men det behövs sÀllan.
Ett exempel pÄ en av de lÀgre nivÄernas kvadrater:

Och hÀr Àr nÄgra globala frÄn projektet XAPI: visning av index pÄ globala:

Global ^way anvÀnds för att lagra punkter (vÀgar, smÄ floder etc.) och polygoner (slutna omrÄden: byggnader, skogar etc.).
Grov klassificering av anvÀndningen av glesa matrisar pÄ globala.
- Vi lagrar koordinater för vissa objekt och deras tillstÄnd (kartlÀggning, cellulÀra automater)
- Vi lagrar glesa matriser.
I fall 2) vid begÀran om en viss koordinat, dÀr ett element inte har nÄgot tilldelat vÀrde, mÄste vi fÄ vÀrdet för det glesa matrisens element som standard.
Bonusarna vi fÄr genom att lagra flerdimensionella matriser pÄ globala
Snabb borttagning och/eller urval av omrÄden som Àr multipler av rader, plan, kuber etc. För fall dÀr heltalsindex anvÀnds, kan möjligheten till snabb borttagning och/eller urval av omrÄden som Àr multipler av rader, plan, kuber etc. visa sig vara anvÀndbar.
Kommandot kan vi ta bort bĂ„de ett enskilt element, en rad och till och med ett helt plan. Tack vare egenskaperna hos globala sker detta mycket snabbt â tusentals gĂ„nger snabbare Ă€n elementspecifik borttagning.
Illustrationen visar en tredimensionell matris i det globala ^a och olika typer av borttagningar.

För att vÀlja omrÄden i rummet efter kÀnda index kan kommandot anvÀndas .
Urval av kolumnen i matrisen till variabeln Column:
; Vi definierar en tredimensionell gles matris 3x3x3
Set ^a(0,0,0)=1,^a(2,2,0)=1,^a(2,0,1)=1,^a(0,2,1)=1,^a(2,2,2)=1,^a(2,1,2)=1
Merge Column = ^a(2,2)
; Vi skriver ut variabeln Column
Zwrite Column
Slutsats:
Column(0)=1
Column(2)=1
Intressant nog fick vi ocksÄ en gles matris i variabeln Column, som ocksÄ mÄste refereras till via , eftersom standardvÀrdena inte lagras i den.
Urval av omrÄden kan ocksÄ göras via ett litet program med hjÀlp av funktionen . Detta Àr sÀrskilt praktiskt i rum dÀr indexen inte Àr kvantifierade (kartlÀggning).
Slutsats
Nutidens tider stÀller nya ambitiösa mÄl. Grafer kan bestÄ av miljarder noder, kartor av miljarder punkter, och nÄgon kan till och med vilja starta sitt eget universum pÄ cellulÀra automater (, ).
NÀr mÀngden data frÄn glesa matriser inte lÀngre fÄr plats i RAM-minnet och man behöver arbeta med dem, bör man övervÀga att implementera sÄdana projekt pÄ globala system och COS.
Tack för uppmÀrksamheten! Vi ser fram emot era frÄgor och önskemÄl i kommentarerna.
Ansvarsfriskrivning: Denna artikel och mina kommentarer till den Àr min Äsikt och har ingen koppling till företagets officiella stÀllning, InterSystems.
KĂ€lla: habr.com
