Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3I tidigare delar (1, 2) har vi pratat om globaler som trĂ€d, i denna kommer vi att betrakta globaler som sparse-arrayer.

Sparse-array À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, till exempel i J, MATLAB. I andra programmeringssprĂ„k finns det speciella bibliotek som tillĂ„ter deras implementering. För C++ — Eigen och andra.

Globala Àr bra kandidater för implementering av sparse-arrayer, eftersom:

  1. De lagrar vÀrden endast för specifika noder och lagrar inga vÀrden för icke-definierade;
  2. 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)

  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. 1)

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 $GET 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)

SÄdana matriser anvÀnds för att representera grafer:

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

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 * det maximala storleken pÄ strÀngen), 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 $BIT.

; 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

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

Den mest kÀnda cellautomaten Àr spelet 'Liv', 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 nytt forskningsomrĂ„de. Å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 galaktiska koordinater latitud, longitud 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. OpenStreetMap XAPI och en fork av OpenStreetMap — FOSM.

Nyligen pÄ Caché-hackathonet genomfördes geospatiala index Geospatial. 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 denna presentation..

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.

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

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:

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

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

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

Global ^way anvÀnds för att lagra punkter polylinjer (vÀgar, smÄ floder etc.) och polygoner (slutna omrÄden: byggnader, skogar etc.).

Grov klassificering av anvÀndningen av glesa matrisar pÄ globala.

  1. Vi lagrar koordinater för vissa objekt och deras tillstÄnd (kartlÀggning, cellulÀra automater)
  2. 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 Kill 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.

Globala — mappade lagringslösningar för data. Sparse-arrayer. Del 3

För att vÀlja omrÄden i rummet efter kÀnda index kan kommandot anvÀndas Merge.

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 $GET, eftersom standardvÀrdena inte lagras i den.

Urval av omrÄden kan ocksÄ göras via ett litet program med hjÀlp av funktionen $Order. 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 (1, 2).

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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster