ProHoster > Blogs > AdministrÄcija > AtslÄgu vÄrtÄ«bu datu bÄzes LMDB spožums un nabadzÄ«ba iOS lietojumprogrammÄs
AtslÄgu vÄrtÄ«bu datu bÄzes LMDB spožums un nabadzÄ«ba iOS lietojumprogrammÄs
2019. gada rudenÄ« Mail.ru Cloud iOS komandÄ notika ilgi gaidÄ«ts notikums. GalvenÄ datu bÄze pastÄvÄ«gai lietojumprogrammu stÄvokļa glabÄÅ”anai ir kļuvusi diezgan eksotiska mobilajÄ pasaulÄ Zibens atmiÅas kartÄta datu bÄze (LMDB). Zem griezuma jÅ«su uzmanÄ«ba tiek aicinÄta uz tÄ detalizÄtu apskatu ÄetrÄs daļÄs. PirmkÄrt, parunÄsim par Å”Ädas nenozÄ«mÄ«gas un sarežģītas izvÄles iemesliem. PÄc tam pÄriesim pie apsvÄrumiem par trim vaļiem, kas ir LMDB arhitektÅ«ras pamatÄ: ar atmiÅu saistÄ«ti faili, B + koks, kopÄÅ”anas un rakstÄ«Å”anas pieeja transakciju un vairÄku versiju ievieÅ”anai. Visbeidzot, desertÄ - praktiskÄ daļa. TajÄ mÄs apskatÄ«sim, kÄ izveidot un ieviest bÄzes shÄmu ar vairÄkÄm tabulÄm, tostarp indeksu, papildus zema lÄ«meÅa atslÄgas vÄrtÄ«bas API.ā
Reizi gadÄ, 2015. gadÄ, mÄs parÅ«pÄjÄmies par metriku, cik bieži mÅ«su lietojumprogrammas saskarne kavÄjas. MÄs ne tikai to izdarÄ«jÄm. Arvien biežÄk mums ir sÅ«dzÄ«bas par to, ka dažkÄrt aplikÄcija pÄrstÄj reaÄ£Ät uz lietotÄja darbÄ«bÄm: netiek nospiestas pogas, netiek ritinÄti saraksti utt. Par mÄrÄ«jumu mehÄniku stÄstÄ«ja uz AvitoTech, tÄpÄc Å”eit es sniedzu tikai skaitļu secÄ«bu.
MÄrÄ«jumu rezultÄti mums kļuva par aukstu duÅ”u. IzrÄdÄ«jÄs, ka sasalÅ”anas radÄ«to problÄmu ir daudz vairÄk nekÄ jebkuras citas. Ja pirms Ŕī fakta apzinÄÅ”anÄs galvenais kvalitÄtes tehniskais rÄdÄ«tÄjs bija bez avÄrijÄm, tad pÄc fokusa nobÄ«dÄ«ts bez iesaldÄÅ”anas.
BÅ«vÄjis informÄcijas panelis ar sasalÅ”anu un iztÄrÄjis kvantitatÄ«vi Šø kvalitÄte AnalizÄjot to cÄloÅus, kļuva skaidrs galvenais ienaidnieks - smaga biznesa loÄ£ika, kas tiek izpildÄ«ta lietojumprogrammas galvenajÄ pavedienÄ. Dabiska reakcija uz Å”o apkaunojumu bija kvÄla vÄlme to iegrÅ«st darba plÅ«smÄs. Lai sistemÄtiski atrisinÄtu Å”o problÄmu, mÄs izmantojÄm daudzpavedienu arhitektÅ«ru, kuras pamatÄ ir vieglie aktieri. Es veltÄ«ju viÅas pielÄgojumus iOS pasaulei divi pavedieni kolektÄ«vÄ twitter un raksts par HabrÄ. KÄ daļu no paÅ”reizÄjÄ stÄsta es vÄlos uzsvÄrt tos lÄmuma aspektus, kas ietekmÄja datu bÄzes izvÄli
SistÄmas organizÄcijas aktiera modelis pieÅem, ka daudzpavedienu veidoÅ”ana kļūst par tÄ otro bÅ«tÄ«bu. Modeļa objektiem tajÄ patÄ«k ŔķÄrsot pavedienu robežas. Un viÅi to dara nevis dažreiz un dažviet, bet gandrÄ«z pastÄvÄ«gi un visur.
DatubÄze ir viens no stÅ«rakmens komponentiem parÄdÄ«tajÄ diagrammÄ. TÄs galvenais uzdevums ir ieviest makro modeli Koplietota datu bÄze. Ja uzÅÄmumu pasaulÄ to izmanto, lai organizÄtu datu sinhronizÄciju starp pakalpojumiem, tad actor arhitektÅ«ras gadÄ«jumÄ dati starp pavedieniem. LÄ«dz ar to mums bija nepiecieÅ”ama tÄda datu bÄze, ar kuru darbs daudzpavedienu vidÄ nesagÄdÄ pat minimÄlas grÅ«tÄ«bas. Jo Ä«paÅ”i tas nozÄ«mÄ, ka no tÄ iegÅ«tajiem objektiem jÄbÅ«t vismaz pavedieniem droÅ”iem un ideÄlÄ gadÄ«jumÄ vispÄr nav mainÄmiem. KÄ jÅ«s zinÄt, pÄdÄjo var izmantot vienlaikus no vairÄkiem pavedieniem, neizmantojot nekÄdas slÄdzenes, kas labvÄlÄ«gi ietekmÄ veiktspÄju.
Otrs nozÄ«mÄ«gais faktors, kas ietekmÄja datu bÄzes izvÄli, bija mÅ«su mÄkoÅa API. To iedvesmoja git pieeja sinhronizÄcijai. TÄpat kÄ viÅu mÄs mÄrÄ·ÄjÄm pirmÄ bezsaistes API, kas izskatÄs vairÄk nekÄ piemÄrots mÄkoÅu klientiem. Tika pieÅemts, ka tie tikai vienu reizi izsÅ«knÄs pilnu mÄkoÅa stÄvokli, un pÄc tam vairumÄ gadÄ«jumu sinhronizÄcija notiks, veicot izmaiÅas. DiemžÄl Ŕī iespÄja joprojÄm ir tikai teorÄtiskajÄ zonÄ, un praksÄ klienti nav iemÄcÄ«juÅ”ies strÄdÄt ar ielÄpiem. Tam ir vairÄki objektÄ«vi iemesli, kurus, lai neaizkavÄtu ievadu, mÄs atstÄsim iekavÄs. Tagad daudz interesantÄki ir nodarbÄ«bas pamÄcoÅ”ie rezultÄti par to, kas notiek, kad API saka "A" un tÄ patÄrÄtÄjs neteica "B".
TÄtad, ja jÅ«s iedomÄjaties git, kas, izpildot vilkÅ”anas komandu, tÄ vietÄ, lai lietotu ielÄpus vietÄjam momentuzÅÄmumam, salÄ«dzina savu pilno stÄvokli ar pilna servera stÄvokli, tad jums bÅ«s diezgan precÄ«zs priekÅ”stats par sinhronizÄciju. notiek mÄkoÅa klientiem. Ir viegli uzminÄt, ka tÄ ievieÅ”anai ir nepiecieÅ”ams atmiÅÄ pieŔķirt divus DOM kokus ar metainformÄciju par visiem serveriem un vietÄjiem failiem. IzrÄdÄs, ja lietotÄjs mÄkonÄ« glabÄ 500 tÅ«kstoÅ”us failu, tad, lai to sinhronizÄtu, ir nepiecieÅ”ams no jauna izveidot un iznÄ«cinÄt divus kokus ar 1 miljonu mezglu. Bet katrs mezgls ir kopums, kas satur apakÅ”objektu grafiku. Å emot to vÄrÄ, tika gaidÄ«ti profilÄÅ”anas rezultÄti. IzrÄdÄ«jÄs, ka pat neÅemot vÄrÄ sapludinÄÅ”anas algoritmu, pati procedÅ«ra, kÄ izveidot un pÄc tam iznÄ«cinÄt milzÄ«gu skaitu mazu objektu, maksÄ diezgan santÄ«mu.SituÄciju pasliktina fakts, ka sinhronizÄcijas pamatoperÄcija ir iekļauta lielÄ skaitÄ. lietotÄju skripti. RezultÄtÄ tiek fiksÄts otrs svarÄ«gais kritÄrijs datu bÄzes izvÄlÄ - iespÄja realizÄt CRUD darbÄ«bas bez dinamiskas objektu pieŔķirÅ”anas.
Citas prasÄ«bas ir tradicionÄlÄkas, un to pilns saraksts ir Å”Äds.
Vītnes droŔība.
DaudzkÄrtÄja apstrÄde. To noteica vÄlme izmantot vienu un to paÅ”u datu bÄzes gadÄ«jumu, lai sinhronizÄtu stÄvokli ne tikai starp pavedieniem, bet arÄ« starp galveno lietojumprogrammu un iOS paplaÅ”inÄjumiem.
DarÄ«jumu atbalsts pamata Ä«paÅ”umiem ACIDAtslÄgas vÄrdi: atomitÄte, konsistence, izolÄcija un uzticamÄ«ba.
Ätrums populÄrÄkajos gadÄ«jumos.
Ar Å”o prasÄ«bu kopumu SQLite bija un joprojÄm ir laba izvÄle. TomÄr alternatÄ«vu izpÄtes ietvaros es tiku pie grÄmatas "Darba sÄkÅ”ana ar LevelDB". ViÅas vadÄ«bÄ tika uzrakstÄ«ts etalons, kas salÄ«dzina darba Ätrumu ar dažÄdÄm datu bÄzÄm reÄlos mÄkoÅa scenÄrijos. RezultÄts pÄrsniedza visdrosmÄ«gÄkÄs cerÄ«bas. VispopulÄrÄkajos gadÄ«jumos - kursora iegÅ«Å”ana uz sakÄrtotu visu failu sarakstu un visu failu sakÄrtotu sarakstu konkrÄtam direktorijam - LMDB izrÄdÄ«jÄs 10 reizes ÄtrÄks nekÄ SQLite. IzvÄle kļuva acÄ«mredzama.
2. LMDB pozicionÄÅ”ana
LMDB ir bibliotÄka, ļoti maza (tikai 10K rindiÅas), kas realizÄ zemÄko fundamentÄlo datu bÄzu slÄni ā krÄtuvi.
IepriekÅ” redzamÄ diagramma parÄda, ka LMDB salÄ«dzinÄÅ”ana ar SQLite, kas ievieÅ” vÄl augstÄkus lÄ«meÅus, parasti nav pareizÄka nekÄ SQLite ar pamatdatiem. GodÄ«gÄk bÅ«tu minÄt vienus un tos paÅ”us uzglabÄÅ”anas dzinÄjus kÄ lÄ«dzvÄrtÄ«gus konkurentus - BerkeleyDB, LevelDB, Sophia, RocksDB utt. Ir pat izstrÄdnes, kurÄs LMDB darbojas kÄ SQLite uzglabÄÅ”anas dzinÄja sastÄvdaļa. Pirmais Å”Äds eksperiments 2012. gadÄ iztÄrÄts autors LMDB Hovards Äu. rezultÄtus izrÄdÄ«jÄs tik intriÄ£ÄjoÅ”a, ka viÅa iniciatÄ«vu uztvÄra OSS entuziasti un atrada savu turpinÄjumu, saskaroties ar LumoSQL. 2020. gada janvÄrÄ« Ŕī projekta autors ir Den Shearer prezentÄts to LinuxConfAu.
Galvenais LMDB lietojums ir kÄ lietojumprogrammu datu bÄzu dzinÄjs. BibliotÄka ir parÄdÄ savu izskatu izstrÄdÄtÄjiem OpenLDAP, kuri bija ļoti neapmierinÄti ar BerkeleyDB kÄ sava projekta pamatu. StÅ«mÅ”anÄs prom no pazemÄ«gÄs bibliotÄkas btree, Hovards Äu spÄja izveidot vienu no mÅ«su laika populÄrÄkajÄm alternatÄ«vÄm. Savu ļoti forÅ”o reportÄžu viÅÅ” veltÄ«ja Å”im stÄstam, kÄ arÄ« LMDB iekÅ”Äjai struktÅ«rai "zibens atmiÅas kartÄtÄ datu bÄze". LeonÄ«ds Jurijevs (aka yleo) no Positive Technologies savÄ runÄ Highload 2015 "LMDB dzinÄjs ir Ä«paÅ”s Äempions". TajÄ viÅÅ” stÄsta par LMDB lÄ«dzÄ«ga ReOpenLDAP ievieÅ”anas uzdevuma kontekstÄ, un LevelDB jau izpelnÄ«jies salÄ«dzinoÅ”o kritiku. IevieÅ”anas rezultÄtÄ Positive Technologies ieguva pat aktÄ«vi attÄ«stoÅ”u dakÅ”iÅu MDBX ar ļoti garŔīgÄm funkcijÄm, optimizÄcijÄm un kļūdu labojumi.
LMDB bieži tiek izmantota arÄ« kÄ krÄtuve. PiemÄram, pÄrlÅ«kprogramma Mozilla Firefox izvÄlÄjÄs to vairÄkÄm vajadzÄ«bÄm un, sÄkot no 9. versijas, Xcode vÄlams tÄ SQLite indeksu glabÄÅ”anai.
DzinÄjs iekļuva arÄ« mobilo ierÄ«Äu izstrÄdes pasaulÄ. Var bÅ«t tÄs lietoÅ”anas pÄdas atrast iOS klientÄ Telegram. LinkedIn gÄja soli tÄlÄk un izvÄlÄjÄs LMDB kÄ noklusÄjuma krÄtuvi savai paÅ”mÄju datu keÅ”atmiÅas sistÄmai Rocket Data, par kuru stÄstÄ«ja rakstÄ 2016. gadÄ.
LMDB veiksmÄ«gi cÄ«nÄs par vietu saulÄ BerkeleyDB atstÄtajÄ niÅ”Ä pÄc pÄrejas Oracle vadÄ«bÄ. BibliotÄka ir iemīļota tÄs Ätruma un uzticamÄ«bas dÄļ, pat salÄ«dzinot ar savu veidu. KÄ zinÄms, brÄ«vpusdienu nav, un vÄlos uzsvÄrt kompromisu, ar kuru nÄksies saskarties, izvÄloties starp LMDB un SQLite. IepriekÅ” redzamÄ diagramma skaidri parÄda, kÄ tiek sasniegts palielinÄtais Ätrums. PirmkÄrt, mÄs nemaksÄjam par papildu abstrakcijas slÄÅiem papildus diska krÄtuvei. Protams, labÄ arhitektÅ«rÄ bez tiem joprojÄm nevar iztikt, un tie neizbÄgami parÄdÄ«sies lietojumprogrammas kodÄ, taÄu tie bÅ«s daudz plÄnÄki. ViÅiem nebÅ«s funkciju, kas nav nepiecieÅ”amas konkrÄtai lietojumprogrammai, piemÄram, atbalsts vaicÄjumiem SQL valodÄ. OtrkÄrt, kļūst iespÄjams optimÄli ieviest lietojumprogrammu operÄciju kartÄÅ”anu ar pieprasÄ«jumiem uz diska krÄtuvi. Ja SQLite manÄ darbÄ nÄk no vidÄjas lietojumprogrammas vidÄjÄm vajadzÄ«bÄm, tad jÅ«s kÄ lietojumprogrammu izstrÄdÄtÄjs labi zinÄt galvenos ielÄdes scenÄrijus. Lai iegÅ«tu produktÄ«vÄku risinÄjumu, jums bÅ«s jÄmaksÄ paaugstinÄta cena gan par sÄkotnÄjÄ risinÄjuma izstrÄdi, gan tÄ turpmÄko atbalstu.
3. Trīs vaļi LMDB
Apskatot LMDB no putna lidojuma, laiks iedziļinÄties. NÄkamÄs trÄ«s sadaļas tiks veltÄ«tas galveno vaļu analÄ«zei, uz kuriem balstÄs uzglabÄÅ”anas arhitektÅ«ra:
AtmiÅas kartÄtie faili kÄ mehÄnisms darbam ar disku un iekÅ”Äjo datu struktÅ«ru sinhronizÄÅ”anai.
B+-koks kÄ uzglabÄto datu struktÅ«ras organizÄcija.
KopÄÅ”ana uz rakstÄ«Å”anas kÄ pieeja ACID darÄ«jumu Ä«paŔību nodroÅ”inÄÅ”anai un vairÄku versiju izveidei.
3.1. Valis #1. AtmiÅas kartÄtie faili
AtmiÅas kartÄtie faili ir tik svarÄ«gs arhitektÅ«ras elements, ka tie pat parÄdÄs repozitorija nosaukumÄ. ProblÄmas ar saglabÄtÄs informÄcijas saglabÄÅ”anu keÅ”atmiÅÄ un piekļuves sinhronizÄÅ”anu ir pilnÄ«bÄ atkarÄ«gas no operÄtÄjsistÄmas. LMDB nesatur keÅ”atmiÅas sevÄ«. Tas ir apzinÄts autora lÄmums, jo datu lasÄ«Å”ana tieÅ”i no kartÄtiem failiem ļauj samazinÄt dzinÄja ievieÅ”anu. TÄlÄk ir sniegts tÄlu no pilnÄ«gs dažu no tiem saraksts.
Datu konsekvences uzturÄÅ”ana krÄtuvÄ, strÄdÄjot ar tiem no vairÄkiem procesiem, kļūst par operÄtÄjsistÄmas atbildÄ«bu. NÄkamajÄ sadaÄ¼Ä Å”is mehÄniÄ·is ir detalizÄti un ar attÄliem apspriests.
KeÅ”atmiÅas trÅ«kums pilnÄ«bÄ atbrÄ«vo LMDB no pieskaitÄmajÄm izmaksÄm, kas saistÄ«tas ar dinamisko pieŔķirÅ”anu. Datu lasÄ«Å”ana praksÄ ir rÄdÄ«tÄja iestatÄ«Å”ana uz pareizo adresi virtuÄlajÄ atmiÅÄ un nekas vairÄk. IzklausÄs pÄc fantÄzijas, taÄu repozitorija avotÄ visi calloc izsaukumi ir koncentrÄti repozitorija konfigurÄcijas funkcijÄ.
KeÅ”atmiÅas neesamÄ«ba nozÄ«mÄ arÄ« to, ka nav bloÄ·ÄÅ”anas, kas saistÄ«tas ar sinhronizÄciju, lai tÄm piekļūtu. LasÄ«tÄji, kuru patvaļīgs skaits var pastÄvÄt vienlaikus, ceÄ¼Ä uz datiem nesastopas ar vienu mutex. SakarÄ ar to lasÄ«Å”anas Ätrumam ir ideÄla lineÄra mÄrogojamÄ«ba CPU skaita ziÅÄ. LMDB tiek sinhronizÄtas tikai modificÄÅ”anas darbÄ«bas. VienlaicÄ«gi var bÅ«t tikai viens rakstnieks.
DiemžÄl operÄtÄjsistÄmÄ iOS atmiÅas kartÄtie faili nav tik rožaini, kÄ mÄs vÄlÄtos. Lai apzinÄtÄk runÄtu par ar tiem saistÄ«tajiem trÅ«kumiem, ir jÄatgÄdina vispÄrÄ«gie principi Ŕī mehÄnisma ievieÅ”anai operÄtÄjsistÄmÄs.
VispÄrÄ«ga informÄcija par atmiÅas kartÄtiem failiem
Ar katru izpildÄmo lietojumprogrammu operÄtÄjsistÄma saista entÄ«tiju, ko sauc par procesu. Katram procesam tiek pieŔķirts blakus esoÅ”s adreÅ”u diapazons, kurÄ tas ievieto visu, kas nepiecieÅ”ams darbam. ZemÄkajÄs adresÄs ir sadaļas ar kodu un cietkodÄtiem datiem un resursiem. NÄkamais nÄk uz augÅ”u augoÅ”ais dinamiskÄs adreÅ”u telpas bloks, kas mums labi zinÄms kÄ kaudze. TajÄ ir to entÄ«tiju adreses, kas parÄdÄs programmas darbÄ«bas laikÄ. AugÅ”pusÄ ir atmiÅas apgabals, ko izmanto lietojumprogrammu steka. Tas vai nu aug, vai sarÅ«k, citiem vÄrdiem sakot, tÄ izmÄram ir arÄ« dinamisks raksturs. Lai kaudze un kaudze nespiestu un netraucÄtu viena otrai, tÄs ir atdalÄ«tas dažÄdos adreÅ”u telpas galos.Starp divÄm dinamiskajÄm sadaļÄm augÅ”Ä un apakÅ”Ä ir caurums. Å Ä«s vidÄjÄs sadaļas adreses operÄtÄjsistÄma izmanto, lai tÄs saistÄ«tu ar dažÄdu entÄ«tiju procesu. Jo Ä«paÅ”i tas var kartÄt noteiktu nepÄrtrauktu adreÅ”u kopu failam diskÄ. Å Ädu failu sauc par atmiÅas kartÄtu failu
Procesam atvÄlÄtÄ adreÅ”u telpa ir milzÄ«ga. TeorÄtiski adreÅ”u skaitu ierobežo tikai rÄdÄ«tÄja lielums, ko nosaka sistÄmas bitums. Ja tam tiktu pieŔķirta fiziskÄ atmiÅa 1-in-1, tad pirmais process apÄstu visu RAM, un nebÅ«tu runas par vairÄkuzdevumu veikÅ”anu.ā
āTomÄr mÄs no pieredzes zinÄm, ka modernÄs operÄtÄjsistÄmas var vienlaikus darbinÄt tik daudz procesu, cik vÄlaties. Tas ir iespÄjams tÄpÄc, ka viÅi daudz atmiÅas pieŔķir procesiem tikai uz papÄ«ra, bet patiesÄ«bÄ viÅi ielÄdÄ galvenajÄ fiziskajÄ atmiÅÄ tikai to daļu, kas ir pieprasÄ«ta Å”eit un tagad. TÄpÄc ar procesu saistÄ«to atmiÅu sauc par virtuÄlo.
OperÄtÄjsistÄma sakÄrto virtuÄlo un fizisko atmiÅu noteikta izmÄra lapÄs. TiklÄ«dz noteikta virtuÄlÄs atmiÅas lapa ir pieprasÄ«ta, operÄtÄjsistÄma to ielÄdÄ fiziskajÄ atmiÅÄ un ievieto to savstarpÄjo atbilstÄ«bu Ä«paÅ”Ä tabulÄ. Ja nav brÄ«vu vietu, viena no iepriekÅ” ielÄdÄtajÄm lapÄm tiek kopÄta uz diska, un pieprasÄ«tÄ tiek aizstÄta. Å o procedÅ«ru, pie kuras mÄs drÄ«zumÄ atgriezÄ«simies, sauc par mijmaiÅu. ZemÄk redzamais attÄls ilustrÄ aprakstÄ«to procesu. TajÄ tika ielÄdÄta lapa A ar adresi 0 un ievietota galvenajÄ atmiÅas lapÄ ar adresi 4. Å is fakts tika atspoguļots atbilstÄ«bas tabulÄ Å”Å«nÄ ar numuru 0.ā
Ar atmiÅas kartÄtiem failiem stÄsts ir tieÅ”i tÄds pats. LoÄ£iski, ka tie it kÄ nepÄrtraukti un pilnÄ«bÄ atrodas virtuÄlajÄ adreÅ”u telpÄ. TomÄr tie nokļūst fiziskajÄ atmiÅÄ lappusi pÄc lapas un tikai pÄc pieprasÄ«juma. Å Ädu lapu modifikÄcijas tiek sinhronizÄtas ar failu diskÄ. TÄdÄjÄdi jÅ«s varat veikt failu I / O, vienkÄrÅ”i strÄdÄjot ar baitiem atmiÅÄ - visas izmaiÅas operÄtÄjsistÄmas kodolÄ automÄtiski pÄrsÅ«tÄ«s uz sÄkotnÄjo failu.ā
ā
ZemÄk redzamajÄ attÄlÄ ir parÄdÄ«ts, kÄ LMDB sinhronizÄ savu stÄvokli, strÄdÄjot ar datu bÄzi no dažÄdiem procesiem. KartÄjot dažÄdu procesu virtuÄlo atmiÅu vienÄ failÄ, mÄs de facto uzliekam operÄtÄjsistÄmai pienÄkumu tranzitÄ«vi sinhronizÄt noteiktus to adreÅ”u telpu blokus savÄ starpÄ, un tieÅ”i tur arÄ« izskatÄs LMDB.ā
ā
SvarÄ«ga nianse ir tÄ, ka LMDB pÄc noklusÄjuma modificÄ datu failu, izmantojot rakstÄ«Å”anas sistÄmas izsaukuma mehÄnismu, un pats fails tiek parÄdÄ«ts tikai lasÄ«Å”anas režīmÄ. Å ai pieejai ir divas svarÄ«gas sekas.
PirmÄs sekas ir kopÄ«gas visÄm operÄtÄjsistÄmÄm. TÄs bÅ«tÄ«ba ir pievienot aizsardzÄ«bu pret nejauÅ”u datubÄzes bojÄjumu ar nepareizu kodu. KÄ jÅ«s zinÄt, procesa izpildÄmÄs instrukcijas var brÄ«vi piekļūt datiem no jebkuras vietas adreÅ”u telpÄ. TajÄ paÅ”Ä laikÄ, kÄ mÄs tikko atcerÄjÄmies, faila parÄdÄ«Å”ana lasÄ«Å”anas-rakstÄ«Å”anas režīmÄ nozÄ«mÄ, ka jebkura instrukcija to var arÄ« modificÄt. Ja viÅa to dara kļūdas pÄc, mÄÄ£inot, piemÄram, faktiski pÄrrakstÄ«t masÄ«va elementu neeksistÄjoÅ”Ä indeksÄ, tad Å”ÄdÄ veidÄ viÅa var nejauÅ”i mainÄ«t uz Å”o adresi kartÄto failu, kas novedÄ«s pie datu bÄzes sabojÄÅ”anas. Ja fails tiek parÄdÄ«ts tikai lasÄ«Å”anas režīmÄ, tad mÄÄ£inÄjums mainÄ«t tam atbilstoÅ”o adreÅ”u telpu novedÄ«s pie programmas avÄrijas ar signÄlu SIGSEGV, un fails paliks neskarts.
OtrÄs sekas jau ir raksturÄ«gas iOS. Ne autors, ne citi avoti to tieÅ”i nepiemin, taÄu bez tÄ LMDB bÅ«tu nederÄ«gs darbam ar Å”o mobilo operÄtÄjsistÄmu. NÄkamÄ sadaļa ir veltÄ«ta tÄs izskatÄ«Å”anai.
2018. gadÄ WWDC bija brÄ«niŔķīgs ziÅojums iOS Memory Deep Dive. Tas norÄda, ka iOS visas fiziskajÄ atmiÅÄ esoÅ”Äs lapas pieder vienam no 3 veidiem: netÄ«ras, saspiestas un tÄ«ras.
TÄ«ra atmiÅa ir lapu kolekcija, ko var droÅ”i nomainÄ«t no fiziskÄs atmiÅas. Tajos ietvertos datus pÄc vajadzÄ«bas var pÄrlÄdÄt no to sÄkotnÄjiem avotiem. Å ajÄ kategorijÄ ietilpst tikai lasÄmi atmiÅas kartÄtie faili. iOS nebaidÄs jebkurÄ laikÄ izlÄdÄt no atmiÅas failÄ kartÄtÄs lapas, jo tÄs tiek garantÄtas sinhronizÄtas ar failu diskÄ.
ā
Visas modificÄtÄs lapas nokļūst netÄ«rajÄ atmiÅÄ neatkarÄ«gi no tÄ, kur tÄs sÄkotnÄji atrodas. KonkrÄti, Å”Ädi tiks klasificÄti arÄ« atmiÅas kartÄtie faili, kas modificÄti, ierakstot ar tiem saistÄ«to virtuÄlo atmiÅu. LMDB atklÄÅ”ana ar karogu MDB_WRITEMAP, pÄc izmaiÅu veikÅ”anas tajÄ varÄsiet pÄrliecinÄties.
TiklÄ«dz lietojumprogramma sÄk aizÅemt pÄrÄk daudz fiziskÄs atmiÅas, iOS saspiež tÄs netÄ«rÄs lapas. AtmiÅas kolekcija, ko aizÅem netÄ«rÄs un saspiestÄs lapas, ir tÄ sauktÄ lietojumprogrammas atmiÅas nospiedums. Kad tas sasniedz noteiktu sliekÅ”Åa vÄrtÄ«bu, OOM killer sistÄmas dÄmons nÄk pÄc procesa un piespiedu kÄrtÄ pÄrtrauc to. TÄ ir iOS Ä«patnÄ«ba salÄ«dzinÄjumÄ ar galddatoru operÄtÄjsistÄmÄm. Turpretim atmiÅas apjoma samazinÄÅ”ana, mainot lapas no fiziskÄs atmiÅas uz disku, operÄtÄjsistÄmÄ iOS nav nodroÅ”inÄta. Par iemesliem var tikai minÄt. VarbÅ«t procedÅ«ra intensÄ«vai lapu pÄrvietoÅ”anai uz disku un atpakaļ mobilajÄm ierÄ«cÄm ir pÄrÄk energoietilpÄ«ga, vai arÄ« iOS ietaupa resursus Ŕūnu pÄrrakstÄ«Å”anai SSD diskos, vai varbÅ«t dizaineri nebija apmierinÄti ar sistÄmas kopÄjo veiktspÄju, kur viss ir pastÄvÄ«gi mainÄ«ts. Lai kÄ arÄ« bÅ«tu, fakts paliek fakts.
LabÄ ziÅa, kas jau tika minÄta iepriekÅ”, ir tÄda, ka LMDB pÄc noklusÄjuma neizmanto mmap mehÄnismu, lai atjauninÄtu failus. No tÄ izriet, ka atveidotos datus iOS klasificÄ kÄ tÄ«ru atmiÅu un tie neveicina atmiÅas nospiedumu. To var pÄrbaudÄ«t, izmantojot Xcode rÄ«ku VM Tracker. TÄlÄk esoÅ”ajÄ ekrÄnuzÅÄmumÄ ir redzams iOS Cloud lietojumprogrammas virtuÄlÄs atmiÅas stÄvoklis darbÄ«bas laikÄ. SÄkumÄ tajÄ tika inicializÄti 2 LMDB gadÄ«jumi. Pirmajam tika atļauts kartÄt savu failu uz 1GiB virtuÄlÄs atmiÅas, otrajam - 512MiB. Neskatoties uz to, ka abas krÄtuves aizÅem noteiktu daudzumu pastÄvÄ«gÄs atmiÅas, neviena no tÄm neveicina netÄ«ro izmÄru.
Tagad ir pienÄcis laiks sliktajÄm ziÅÄm. Pateicoties mijmaiÅas mehÄnismam 64 bitu galddatoru operÄtÄjsistÄmÄs, katrs process var aizÅemt tik daudz virtuÄlÄs adreses vietas, cik brÄ«vÄ vieta cietajÄ diskÄ Ä¼auj veikt tÄ iespÄjamo mijmaiÅas darÄ«jumu. Swap aizstÄÅ”ana ar saspieÅ”anu operÄtÄjsistÄmÄ iOS krasi samazina teorÄtisko maksimumu. Tagad visiem dzÄ«vajiem procesiem ir jÄiekļaujas galvenajÄ (lasÄ«t RAM) atmiÅÄ, un visi tie, kas neietilpst, tiek pakļauti piespiedu pÄrtraukÅ”anai. Tas ir minÄts tÄpat kÄ iepriekÅ” ZiÅotun iekÅ”Ä oficiÄlÄ dokumentÄcija. TÄ rezultÄtÄ iOS ievÄrojami ierobežo atmiÅas apjomu, kas pieejams pieŔķirÅ”anai, izmantojot mmap. Å eit Å”eit varat apskatÄ«t empÄ«riskos ierobežojumus atmiÅas apjomam, ko var pieŔķirt dažÄdÄm ierÄ«cÄm, izmantojot Å”o sistÄmas zvanu. MÅ«sdienÄ«gÄkajos viedtÄlruÅu modeļos iOS ir kļuvis dÄsns par 2 gigabaitiem, bet iPad top versijÄs - par 4. PraksÄ, protams, jÄkoncentrÄjas uz jaunÄkajiem atbalstÄ«tajiem ierÄ«Äu modeļiem, kur viss ir ļoti skumji. VÄl sliktÄk, apskatot lietojumprogrammas atmiÅas stÄvokli VM Tracker, jÅ«s atklÄsit, ka LMDB nebÅ«t nav vienÄ«gais, kas pieprasa atmiÅas kartÄtu atmiÅu. Labus gabalus noÄd sistÄmas sadalÄ«tÄji, resursu faili, attÄlu ietvari un citi mazÄki plÄsÄji.
MÄkonÄ« veikto eksperimentu rezultÄtÄ mÄs nonÄcÄm pie Å”ÄdÄm LMDB pieŔķirtÄs atmiÅas kompromisa vÄrtÄ«bÄm: 384 megabaiti 32 bitu ierÄ«cÄm un 768 megabaiti 64 bitu ierÄ«cÄm. Kad Å”is apjoms ir iztÄrÄts, visas modificÄÅ”anas darbÄ«bas sÄk pabeigt ar kodu MDB_MAP_FULL. MÄs novÄrojam Å”Ädas kļūdas savÄ uzraudzÄ«bÄ, taÄu tÄs ir pietiekami mazas, lai Å”ajÄ posmÄ tÄs neÅemtu vÄrÄ.
NepÄrprotams iemesls pÄrmÄrÄ«gam atmiÅas patÄriÅam krÄtuvÄ var bÅ«t ilgstoÅ”i darÄ«jumi. Lai saprastu, kÄ Å”Ä«s divas parÄdÄ«bas ir saistÄ«tas, mums palÄ«dzÄs aplÅ«kot atlikuÅ”os divus LMDB vaļus.
3.2. Valis #2. B+-koks
Lai emulÄtu tabulas virs atslÄgu vÄrtÄ«bu krÄtuves, tÄ API ir jÄbÅ«t Å”ÄdÄm darbÄ«bÄm:
Jauna elementa ievietoŔana.
MeklÄjiet elementu ar doto atslÄgu.
Elementa dzÄÅ”ana.
AtkÄrtojiet taustiÅu intervÄlus to kÄrtoÅ”anas secÄ«bÄ.
VienkÄrÅ”ÄkÄ datu struktÅ«ra, ar kuru var viegli Ä«stenot visas Äetras darbÄ«bas, ir binÄrais meklÄÅ”anas koks. Katrs no tÄ mezgliem ir atslÄga, kas sadala visu bÄrnu atslÄgu apakÅ”kopu divos apakÅ”kokos. KreisajÄ pusÄ ir tie, kas ir mazÄki par vecÄkiem, un labajÄ pusÄ - tie, kas ir lielÄki. PasÅ«tÄ«tu atslÄgu komplektu var iegÅ«t, izmantojot vienu no klasiskajiem koku ŔķÄrsoÅ”anas veidiem
BinÄrajiem kokiem ir divi bÅ«tiski trÅ«kumi, kas neļauj tiem darboties kÄ diska datu struktÅ«rai. PirmkÄrt, to lÄ«dzsvara pakÄpe ir neparedzama. PastÄv ievÄrojams risks iegÅ«t kokus, kuros dažÄdu zaru augstums var ļoti atŔķirties, kas bÅ«tiski pasliktina meklÄÅ”anas algoritmisko sarežģītÄ«bu salÄ«dzinÄjumÄ ar sagaidÄmo. OtrkÄrt, krustsaiÅ”u pÄrpilnÄ«ba starp mezgliem atÅem binÄrajiem kokiem vietu atmiÅÄ.Tuvie mezgli (saiÅ”u ziÅÄ starp tiem) var atrasties uz pilnÄ«gi dažÄdÄm virtuÄlÄs atmiÅas lapÄm. TÄ rezultÄtÄ pat vienkÄrÅ”ai vairÄku blakus esoÅ”o koka mezglu ŔķÄrsoÅ”anai var bÅ«t nepiecieÅ”ams apmeklÄt salÄ«dzinÄmu lapu skaitu. TÄ ir problÄma pat tad, ja mÄs runÄjam par binÄro koku kÄ atmiÅÄ esoÅ”as datu struktÅ«ras efektivitÄti, jo nepÄrtraukta lapu rotÄÅ”ana procesora keÅ”atmiÅÄ nav lÄta. Kad runa ir par biežu ar mezgliem saistÄ«tu lapu pacelÅ”anu no diska, viss kļūst ļoti slikti. nožÄlojami.
B-koki, kas ir binÄro koku evolÅ«cija, atrisina iepriekÅ”ÄjÄ punktÄ norÄdÄ«tÄs problÄmas. PirmkÄrt, tie paÅ”i lÄ«dzsvaro. OtrkÄrt, katrs to mezgls sadala bÄrnu atslÄgu kopu nevis 2, bet gan M sakÄrtotÄs apakÅ”kopÄs, un skaitlis M var bÅ«t diezgan liels, ap vairÄkiem simtiem vai pat tÅ«kstoÅ”iem.
TÄdÄjÄdi:
KatrÄ mezglÄ ir liels skaits jau pasÅ«tÄ«tu atslÄgu, un koki ir ļoti zemi.
Koks iegÅ«st atraÅ”anÄs vietas Ä«paŔību atmiÅÄ, jo atslÄgas, kurÄm ir tuva vÄrtÄ«ba, dabiski atrodas blakus viena otrai vienÄ vai blakus esoÅ”ajÄ mezglÄ.
Samazina tranzÄ«ta mezglu skaitu, meklÄÅ”anas laikÄ nolaižoties pa koku.
Samazina diapazona vaicÄjumiem nolasÄ«to mÄrÄ·a mezglu skaitu, jo katrÄ no tiem jau ir liels skaits sakÄrtotu atslÄgu.
LMDB datu glabÄÅ”anai izmanto B koka variantu, ko sauc par B+ koku. IepriekÅ” redzamajÄ diagrammÄ ir parÄdÄ«ti trÄ«s tajÄ esoÅ”o mezglu veidi:
AugÅ”pusÄ ir sakne. Tas neÄ«steno neko vairÄk kÄ datu bÄzes jÄdzienu repozitorijÄ. VienÄ LMDB instancÄ varat izveidot vairÄkas datu bÄzes, kas koplieto kartÄto virtuÄlo adreÅ”u telpu. Katrs no tiem sÄkas no savas saknes.
ZemÄkajÄ lÄ«menÄ« ir lapas (lapa). TieÅ”i tie un tikai tie satur datu bÄzÄ saglabÄtos atslÄgu un vÄrtÄ«bu pÄrus. Starp citu, tÄ ir B+-koku Ä«patnÄ«ba. Ja normÄls B koks saglabÄ vÄrtÄ«bu daļas visu lÄ«meÅu mezglos, tad B+ variÄcija ir tikai zemÄkajÄ. NofiksÄjot Å”o faktu, turpmÄk LMDB izmantoto koka apakÅ”tipu sauksim vienkÄrÅ”i par B-koku.
Starp sakni un lapÄm ir 0 vai vairÄk tehnisko lÄ«meÅu ar navigÄcijas (zaru) mezgliem. ViÅu uzdevums ir sadalÄ«t Ŕķiroto atslÄgu komplektu starp lapÄm.
Fiziski mezgli ir iepriekÅ” noteikta garuma atmiÅas bloki. To lielums ir vairÄkkÄrtÄjs operÄtÄjsistÄmas atmiÅas lapu izmÄram, par ko mÄs runÄjÄm iepriekÅ”. ZemÄk ir parÄdÄ«ta mezgla struktÅ«ra. GalvenÄ ir metainformÄcija, no kurÄm acÄ«mredzamÄkÄ, piemÄram, ir kontrolsumma. TÄlÄk seko informÄcija par nobÄ«dÄm, gar kurÄm atrodas Ŕūnas ar datiem. Datu loma var bÅ«t vai nu atslÄgas, ja runÄjam par navigÄcijas mezgliem, vai veseli atslÄgu-vÄrtÄ«bu pÄri lapu gadÄ«jumÄ.VairÄk par lappuÅ”u struktÅ«ru var lasÄ«t darbÄ "Augstas veiktspÄjas atslÄgas vÄrtÄ«bu veikalu novÄrtÄjums".
TikuÅ”i galÄ ar lapas mezglu iekÅ”Äjo saturu, LMDB B-koku turpmÄk attÄlosim vienkÄrÅ”otÄ veidÄ sekojoÅ”Ä formÄ.
Lapas ar mezgliem diskÄ tiek sakÄrtotas secÄ«gi. Lapas ar lielÄku skaitu atrodas faila beigÄs. TÄ sauktajÄ meta lapÄ (meta page) ir informÄcija par nobÄ«dÄm, pÄc kuras var atrast visu koku saknes. Kad fails tiek atvÄrts, LMDB skenÄ failu pa lappusei no beigÄm lÄ«dz sÄkumam, meklÄjot derÄ«gu meta lapu un caur to atrod esoÅ”Äs datu bÄzes.ā
Tagad, apzinoties datu organizÄÅ”anas loÄ£isko un fizisko struktÅ«ru, mÄs varam turpinÄt apsvÄrt LMDB treÅ”o vali. TieÅ”i ar tÄs palÄ«dzÄ«bu visas krÄtuves modifikÄcijas notiek transakcijÄ un izolÄti viena no otras, pieŔķirot datubÄzei kopumÄ arÄ« vairÄku versiju Ä«paŔību.
3.3. Valis #3. kopÄÅ”ana uz rakstÄ«Å”anas
Dažas B-koka darbÄ«bas ietver virkni izmaiÅu veikÅ”anu tÄ mezglos. Viens piemÄrs ir jaunas atslÄgas pievienoÅ”ana mezglam, kas jau ir sasniedzis maksimÄlo jaudu. Å ajÄ gadÄ«jumÄ, pirmkÄrt, ir jÄsadala mezgls divÄs daļÄs un, otrkÄrt, jÄpievieno saite uz jauno atdalÄ«to atvasinÄto mezglu tÄ vecÄkajÄ. Å Ä« procedÅ«ra ir potenciÄli ļoti bÄ«stama. Ja kÄda iemesla dÄļ (avÄrija, strÄvas padeves pÄrtraukums utt.) notiek tikai daļa no sÄrijas izmaiÅÄm, koks paliks nekonsekventÄ stÄvoklÄ«.
Viens tradicionÄls risinÄjums, kÄ padarÄ«t datubÄzi par defektu tolerantu, ir pievienot papildu uz diskiem balstÄ«tu datu struktÅ«ru, darÄ«jumu žurnÄlu, kas pazÄ«stams arÄ« kÄ ierakstÄ«Å”anas žurnÄls (WAL), blakus B kokam. Tas ir fails, kura beigÄs, stingri pirms paÅ”a B-koka modifikÄcijas, tiek ierakstÄ«ta iecerÄtÄ darbÄ«ba. TÄdÄjÄdi, ja paÅ”diagnostikas laikÄ tiek atklÄts datu bojÄjums, datu bÄze meklÄ Å¾urnÄlu, lai sevi iztÄ«rÄ«tu.
LMDB kÄ kļūdu pielaides mehÄnismu ir izvÄlÄjies citu metodi, ko sauc par kopÄÅ”anu-rakstÄ«Å”anu. TÄs bÅ«tÄ«ba ir tÄda, ka tÄ vietÄ, lai atjauninÄtu esoÅ”Äs lapas datus, tÄ vispirms tos pilnÄ«bÄ kopÄ un veic visas kopijÄ jau esoÅ”Äs izmaiÅas.ā
TurklÄt, lai atjauninÄtie dati bÅ«tu pieejami, attiecÄ«bÄ uz to ir jÄmaina saite uz mezglu, kas vecÄkmezglÄ ir kļuvis aktuÄls. TÄ kÄ tas arÄ« ir jÄmaina Å”im nolÅ«kam, tas arÄ« ir iepriekÅ” kopÄts. Process turpinÄs rekursÄ«vi lÄ«dz pat saknei. Dati meta lapÄ tiek mainÄ«ti pÄdÄjie.āā
Ja pÄkÅ”Åi process atjauninÄÅ”anas procedÅ«ras laikÄ avarÄ, tad vai nu netiks izveidota jauna meta lapa, vai arÄ« tÄ netiks ierakstÄ«ta diskÄ lÄ«dz beigÄm, un tÄs kontrolsumma bÅ«s nepareiza. NevienÄ no Å”iem diviem gadÄ«jumiem jaunÄs lapas nebÅ«s sasniedzamas, un vecÄs lapas netiks ietekmÄtas. Tas novÄrÅ” nepiecieÅ”amÄ«bu LMDB rakstÄ«t uz priekÅ”u žurnÄlu, lai saglabÄtu datu konsekvenci. Faktiski iepriekÅ” aprakstÄ«tÄ datu uzglabÄÅ”anas struktÅ«ra diskÄ vienlaikus uzÅemas savu funkciju. Skaidra darÄ«jumu žurnÄla neesamÄ«ba ir viena no LMDB funkcijÄm, kas nodroÅ”ina lielu datu lasÄ«Å”anas Ätrumu.ā
IegÅ«tÄ konstrukcija, ko sauc par tikai pievienoÅ”anas B-koku, dabiski nodroÅ”ina darÄ«jumu izolÄciju un vairÄku versiju veidoÅ”anu. LMDB katram atvÄrtajam darÄ«jumam ir saistÄ«ta ar to jaunÄkÄ koka sakne. KamÄr darÄ«jums nav pabeigts, ar to saistÄ«tÄ koka lapas nekad netiks mainÄ«tas vai atkÄrtoti izmantotas jaunÄm datu versijÄm. TÄdÄjÄdi jÅ«s varat strÄdÄt tik ilgi, cik vÄlaties tieÅ”i ar datu kopu, kas bija svarÄ«ga darÄ«juma atvÄrÅ”anas laiks, pat ja krÄtuve paÅ”laik tiek aktÄ«vi atjauninÄta. TÄ ir multiversijas bÅ«tÄ«ba, padarot LMDB par ideÄlu datu avotu mÅ«su mīļotajam UICollectionView. Atverot darÄ«jumu, jums nav jÄpalielina lietojumprogrammas atmiÅas apjoms, steidzÄ«gi izsÅ«knÄjot paÅ”reizÄjos datus kÄdÄ atmiÅas struktÅ«rÄ, baidoties palikt bez nekÄ. Å Ä« funkcija atŔķir LMDB no tÄ paÅ”a SQLite, kas nevar lepoties ar Å”Ädu pilnÄ«gu izolÄciju. Atverot divus darÄ«jumus pÄdÄjÄ un dzÄÅ”ot noteiktu ierakstu vienÄ no tiem, to paÅ”u ierakstu vairs nevar iegÅ«t otrajÄ atlikuÅ”ajÄ.
MonÄtas otrÄ puse ir potenciÄli ievÄrojami lielÄks virtuÄlÄs atmiÅas patÄriÅÅ”. Slaids parÄda, kÄ izskatÄ«sies datu bÄzes struktÅ«ra, ja tÄ tiks vienlaikus modificÄta ar 3 atvÄrtÄm lasÄ«Å”anas transakcijÄm, aplÅ«kojot dažÄdas datu bÄzes versijas. TÄ kÄ LMDB nevar atkÄrtoti izmantot mezglus, kas ir sasniedzami no saknÄm, kas saistÄ«tas ar faktiskajÄm transakcijÄm, krÄtuvei nav citas izvÄles, kÄ pieŔķirt atmiÅÄ vÄl vienu ceturto sakni un vÄlreiz klonÄt zem tÄs modificÄtÄs lapas.
Å eit nebÅ«s lieki atsaukt atmiÅÄ sadaļu par failiem, kas kartÄti. Å Ä·iet, ka papildu virtuÄlÄs atmiÅas patÄriÅam nevajadzÄtu mÅ«s Ä«paÅ”i apgrÅ«tinÄt, jo tas neveicina lietojumprogrammas atmiÅas nospiedumu. TaÄu tajÄ paÅ”Ä laikÄ tika atzÄ«mÄts, ka iOS ir ļoti skops tÄs pieŔķirÅ”anÄ, un mÄs nevaram nodroÅ”inÄt 1 terabaita LMDB reÄ£ionu serverÄ« vai darbvirsmÄ no meistara pleca un par Å”o funkciju nedomÄt vispÄr. Ja iespÄjams, mÄÄ£iniet saglabÄt pÄc iespÄjas Ä«sÄku darÄ«jumu ilgumu.
4. Datu shÄmas izstrÄde virs atslÄgas vÄrtÄ«bas API
SÄksim API parsÄÅ”anu, aplÅ«kojot LMDB nodroÅ”inÄtÄs pamata abstrakcijas: vidi un datu bÄzes, atslÄgas un vÄrtÄ«bas, transakcijas un kursorus.
Piezīme par kodu sarakstiem
Visas funkcijas LMDB publiskajÄ API atgriež sava darba rezultÄtu kļūdas koda veidÄ, bet visos turpmÄkajos sarakstos tÄ pÄrbaude Ä«suma labad ir izlaista.PraksÄ, lai mijiedarbotos ar repozitoriju, izmantojÄm savu kodu. dakÅ”a C++ iesaiÅojumi lmdbxx, kurÄ kļūdas izpaužas kÄ C++ izÅÄmumi.
KÄ ÄtrÄko veidu, kÄ savienot LMDB ar iOS vai macOS projektu, es piedÄvÄju savu CocoaPod POSLMDB.
4.1. Pamata abstrakcijas
Vide
StruktÅ«ra MDB_env is ir LMDB iekÅ”ÄjÄ stÄvokļa repozitorijs. PrefiksÄto funkciju saime mdb_env ļauj konfigurÄt dažus tÄ rekvizÄ«tus. VienkÄrÅ”ÄkajÄ gadÄ«jumÄ dzinÄja inicializÄcija izskatÄs Å”Ädi.
LietojumprogrammÄ Mail.ru Cloud mÄs mainÄ«jÄm noklusÄjuma vÄrtÄ«bas tikai diviem parametriem.
Pirmais ir virtuÄlÄs adreÅ”u telpas lielums, ar kuru tiek kartÄts krÄtuves fails. DiemžÄl pat tajÄ paÅ”Ä ierÄ«cÄ konkrÄtÄ vÄrtÄ«ba var ievÄrojami atŔķirties atkarÄ«bÄ no darbÄ«bas laika. Lai Åemtu vÄrÄ Å”o iOS funkciju, mÄs dinamiski atlasÄm maksimÄlo krÄtuves apjomu. SÄkot no noteiktas vÄrtÄ«bas, tÄ secÄ«gi samazinÄs uz pusi lÄ«dz funkcijai mdb_env_open neatgriezÄ«s citu rezultÄtu kÄ vien ENOMEM. TeorÄtiski ir pretÄjs veids - vispirms pieŔķiriet dzinÄjam minimÄlu atmiÅu un pÄc tam, kad tiek saÅemtas kļūdas MDB_MAP_FULL, palieliniet to. TomÄr tas ir daudz ÄrkŔķainÄks. Iemesls ir tÄds, ka procedÅ«ra atmiÅas pÄrkartÄÅ”anai, izmantojot funkciju mdb_env_set_map_size anulÄ visas entÄ«tijas (kursorus, transakcijas, atslÄgas un vÄrtÄ«bas), kas iepriekÅ” saÅemtas no dzinÄja. Å Äda notikumu pavÄrsiena uzskaite kodÄ radÄ«s ievÄrojamu sarežģījumu. Ja tomÄr virtuÄlÄ atmiÅa jums ir ļoti dÄrga, tad tas var bÅ«t iemesls paskatÄ«ties uz tÄlu uz priekÅ”u aizgÄjuÅ”o dakÅ”iÅu. MDBX, kur starp deklarÄtajÄm pazÄ«mÄm ir āautomÄtiska datu bÄzes izmÄra pielÄgoÅ”ana lidojumÄā.
Otrs parametrs, kura noklusÄjuma vÄrtÄ«ba mums nebija piemÄrota, regulÄ vÄ«tnes droŔības nodroÅ”inÄÅ”anas mehÄniku. DiemžÄl vismaz operÄtÄjsistÄmÄ iOS 10 ir problÄmas ar pavedienu vietÄjÄs krÄtuves atbalstu. Å Ä« iemesla dÄļ iepriekÅ” minÄtajÄ piemÄrÄ repozitorijs tiek atvÄrts ar karogu MDB_NOTLS. TurklÄt tas arÄ« prasÄ«ja dakÅ”a C++ iesaiÅojums lmdbxxlai izgrieztu mainÄ«gos ar un Å”ajÄ atribÅ«tÄ.
Datu bÄzes
DatubÄze ir atseviŔķs B-koka gadÄ«jums, par kuru mÄs runÄjÄm iepriekÅ”. TÄs atvÄrÅ”ana notiek darÄ«juma ietvaros, kas sÄkumÄ var Ŕķist nedaudz dÄ«vaini.
PatieÅ”Äm, darÄ«jums LMDB ir krÄtuves entÄ«tija, nevis konkrÄta datu bÄze. Å Ä« koncepcija ļauj veikt atomu operÄcijas ar entÄ«tijÄm, kas atrodas dažÄdÄs datu bÄzÄs. TeorÄtiski tas paver iespÄju modelÄt tabulas dažÄdu datu bÄzu veidÄ, taÄu savulaik es gÄju citu ceļu, kas sÄ«kÄk aprakstÄ«ts tÄlÄk.
AtslÄgas un vÄrtÄ«bas
StruktÅ«ra MDB_val modelÄ gan atslÄgas, gan vÄrtÄ«bas jÄdzienu. Repozitorijai nav ne jausmas par to semantiku. ViÅai kaut kas atŔķirÄ«gs ir tikai noteikta izmÄra baitu masÄ«vs. MaksimÄlais atslÄgas izmÄrs ir 512 baiti.
Veikals izmanto salÄ«dzinÄjumu, lai sakÄrtotu atslÄgas augoÅ”Ä secÄ«bÄ. Ja neaizstÄsiet to ar savu, tiks izmantots noklusÄjuma, kas tos sakÄrto pa baitiem leksikogrÄfiskÄ secÄ«bÄ.ā
Darījumi
DarÄ«juma ierÄ«ce ir detalizÄti aprakstÄ«ta iepriekÅ”ÄjÄ nodaļÄ, tÄpÄc Å”eit es atkÄrtoÅ”u to galvenÄs Ä«paŔības Ä«sÄ rindÄ:
Atbalsts visÄm pamata Ä«paŔībÄm ACIDAtslÄgas vÄrdi: atomitÄte, konsistence, izolÄcija un uzticamÄ«ba. Es nevaru nepiezÄ«mÄt, ka MacOS un iOS izturÄ«bas ziÅÄ MDBX ir novÄrsta kļūda. JÅ«s varat lasÄ«t vairÄk viÅu README.
Daudzpavedienu pieeja ir aprakstÄ«ta shÄmÄ "viens rakstÄ«tÄjs / vairÄki lasÄ«tÄji". Rakstnieki bloÄ·Ä viens otru, bet viÅi nebloÄ·Ä lasÄ«tÄjus. LasÄ«tÄji nebloÄ·Ä ne rakstniekus, ne viens otru.
Atbalsts ligzdotiem darījumiem.
Daudzversiju atbalsts.
Multiversija LMDB ir tik laba, ka gribu to demonstrÄt darbÄ«bÄ. TÄlÄk redzamais kods parÄda, ka katrs darÄ«jums darbojas tieÅ”i ar to datu bÄzes versiju, kas bija aktuÄla tÄs atvÄrÅ”anas brÄ«dÄ«, pilnÄ«bÄ izolÄta no visÄm turpmÄkajÄm izmaiÅÄm. Repozitorija inicializÄcija un testa ieraksta pievienoÅ”ana tai neinteresÄ, tÄpÄc Å”ie rituÄli tiek atstÄti zem spoilera.
PÄc izvÄles es iesaku izmÄÄ£inÄt to paÅ”u triku ar SQLite un redzÄt, kas notiek.
Multiversiju izmantoÅ”ana sniedz ļoti jaukas priekÅ”rocÄ«bas iOS izstrÄdÄtÄja dzÄ«vÄ. Izmantojot Å”o Ä«paÅ”umu, varat viegli un dabiski pielÄgot datu avota atjauninÄÅ”anas Ätrumu ekrÄna formÄm, pamatojoties uz lietotÄja pieredzes apsvÄrumiem. PiemÄram, Åemsim tÄdu Mail.ru Cloud lietojumprogrammas funkciju kÄ satura automÄtiska ielÄde no sistÄmas multivides galerijas. Ar labu savienojumu klients var pievienot serverim vairÄkas fotogrÄfijas sekundÄ. Ja atjauninÄsiet pÄc katras lejupielÄdes UICollectionView ar multivides saturu lietotÄja mÄkonÄ«, Ŕī procesa laikÄ varat aizmirst par 60 kadriem sekundÄ un vienmÄrÄ«gu ritinÄÅ”anu. Lai novÄrstu biežu ekrÄna atjauninÄÅ”anu, jums kaut kÄ jÄierobežo datu izmaiÅu Ätrums bÄzÄ UICollectionViewDataSource.
Ja datu bÄze neatbalsta vairÄku versiju izveidi un ļauj strÄdÄt tikai ar paÅ”reizÄjo paÅ”reizÄjo stÄvokli, tad, lai izveidotu laika stabilu datu momentuzÅÄmumu, tas ir jÄkopÄ vai nu uz kÄdu atmiÅas datu struktÅ«ru, vai pagaidu tabulu. Jebkura no Ŕīm metodÄm ir ļoti dÄrga. AtmiÅas krÄtuves gadÄ«jumÄ mÄs iegÅ«stam gan atmiÅas izmaksas, ko rada konstruÄtu objektu glabÄÅ”ana, gan laika izmaksas, kas saistÄ«tas ar liekÄm ORM transformÄcijÄm. Kas attiecas uz pagaidu galdu, tas ir vÄl dÄrgÄks prieks, kam ir jÄga tikai nenozÄ«mÄ«gos gadÄ«jumos.
Daudzversiju LMDB atrisina stabila datu avota uzturÄÅ”anas problÄmu ļoti elegantÄ veidÄ. Pietiek tikai atvÄrt darÄ«jumu un voila - kamÄr mÄs to nepabeigsim, datu kopa tiek garantÄta. TÄ atjauninÄÅ”anas Ätruma loÄ£ika tagad pilnÄ«bÄ ir prezentÄcijas slÄÅa rokÄs, bez ievÄrojamiem resursiem.
Kursori
Kursori nodroÅ”ina mehÄnismu sakÄrtotai atslÄgu un vÄrtÄ«bu pÄru iterÄcijai, ŔķÄrsojot B-koku. Bez tiem nebÅ«tu iespÄjams efektÄ«vi modelÄt tabulas datu bÄzÄ, pie kuras mÄs tagad vÄrÅ”amies.
4.2. Tabulu modelÄÅ”ana
AtslÄgu secÄ«bas rekvizÄ«ts ļauj izveidot augstÄkÄ lÄ«meÅa abstrakciju, piemÄram, tabulu virs pamata abstrakcijÄm. ApskatÄ«sim Å”o procesu mÄkoÅa klienta galvenÄs tabulas piemÄrÄ, kurÄ tiek saglabÄta informÄcija par visiem lietotÄja failiem un mapÄm.
Tabulas shÄma
Viens no izplatÄ«tÄkajiem scenÄrijiem, kam vajadzÄtu uzlabot tabulas ar mapju koku struktÅ«ru, ir atlasÄ«t visus elementus, kas atrodas dotajÄ direktorijÄ. Labs datu organizÄÅ”anas modelis efektÄ«viem Å”Äda veida vaicÄjumiem ir BlakusparÄdÄ«bu saraksts. Lai to ieviestu virs atslÄgu vÄrtÄ«bu krÄtuves, ir nepiecieÅ”ams kÄrtot failu un mapju atslÄgas tÄ, lai tÄs bÅ«tu grupÄtas, pamatojoties uz piederÄ«bu vecÄkajam direktorijam. TurklÄt, lai parÄdÄ«tu direktorijas saturu Windows lietotÄjam pazÄ«stamÄ formÄ (vispirms mapes, pÄc tam faili, abi ir sakÄrtoti alfabÄtiskÄ secÄ«bÄ), atslÄgÄ ir jÄiekļauj atbilstoÅ”ie papildu lauki.
TÄlÄk esoÅ”ajÄ attÄlÄ ir parÄdÄ«ts, kÄ, pamatojoties uz uzdevumu, var izskatÄ«ties atslÄgu attÄlojums kÄ baitu masÄ«vs. Vispirms tiek ievietoti baiti ar vecÄkdirektorija identifikatoru (sarkans), pÄc tam ar tipu (zaļŔ), un jau aizmugurÄ ar nosaukumu (zils) SakÄrtoti pÄc noklusÄjuma LMDB salÄ«dzinÄjuma leksikogrÄfiskÄ secÄ«bÄ, tie tiek sakÄrtoti Å”ÄdÄ secÄ«bÄ. vajadzÄ«gajÄ veidÄ. SecÄ«gi ŔķÄrsojot atslÄgas ar vienu un to paÅ”u sarkano prefiksu, mÄs iegÅ«stam ar tÄm saistÄ«tÄs vÄrtÄ«bas tÄdÄ secÄ«bÄ, kÄdÄ tÄs jÄparÄda lietotÄja interfeisÄ (pa labi), neprasot nekÄdu papildu pÄcapstrÄdi.
AtslÄgu un vÄrtÄ«bu serializÄÅ”ana
VisÄ pasaulÄ ir daudz metožu objektu serializÄÅ”anai. TÄ kÄ mums nebija citu prasÄ«bu, izÅemot Ätrumu, mÄs izvÄlÄjÄmies ÄtrÄko iespÄjamo - atmiÅas izgÄztuvi, ko aizÅem C valodas struktÅ«ras gadÄ«jums. TÄtad direktorija elementa atslÄgu var modelÄt ar Å”Ädu struktÅ«ru NodeKey.
SaglabÄt NodeKey glabÄÅ”anas nepiecieÅ”amÄ«ba objektÄ MDB_val novietojiet rÄdÄ«tÄju uz datiem struktÅ«ras sÄkuma adresÄ un ar funkciju aprÄÄ·iniet to lielumu sizeof.
PirmajÄ nodaÄ¼Ä par datu bÄzes atlases kritÄrijiem kÄ svarÄ«gu atlases faktoru minÄju dinamisko pieŔķīrumu minimizÄÅ”anu kÄ daļu no CRUD operÄcijÄm. Funkcijas kods serialize parÄda, kÄ LMDB gadÄ«jumÄ no tiem var pilnÄ«bÄ izvairÄ«ties, kad datu bÄzÄ tiek ievietoti jauni ieraksti. No servera ienÄkoÅ”ais baitu masÄ«vs vispirms tiek pÄrveidots steka struktÅ«rÄs, un pÄc tam tie tiek triviÄli ievietoti krÄtuvÄ. Å emot vÄrÄ, ka LMDB iekÅ”ienÄ nav arÄ« dinamisku pieŔķīrumu, varat iegÅ«t fantastisku situÄciju pÄc iOS standartiem - izmantojiet tikai steka atmiÅu, lai strÄdÄtu ar datiem no tÄ«kla lÄ«dz diskam!
AtslÄgu pasÅ«tÄ«Å”ana ar binÄro komparatoru
AtslÄgu secÄ«bas attiecÄ«bu nosaka Ä«paÅ”a funkcija, ko sauc par salÄ«dzinÄjumu. TÄ kÄ dzinÄjs neko nezina par tajos ietverto baitu semantiku, noklusÄjuma salÄ«dzinÄtÄjam nav citas izvÄles, kÄ sakÄrtot atslÄgas leksikogrÄfiskÄ secÄ«bÄ, izmantojot to salÄ«dzinÄÅ”anu pa baitiem. TÄs izmantoÅ”ana konstrukciju sakÄrtoÅ”anai ir lÄ«dzÄ«ga skÅ«Å”anai ar grebuma cirvi. TomÄr vienkÄrÅ”os gadÄ«jumos Ŕī metode man Ŕķiet pieÅemama. AlternatÄ«va ir aprakstÄ«ta zemÄk, bet Å”eit es atzÄ«mÄÅ”u pÄris grÄbekļus, kas izkaisÄ«ti pa ceļam.
PirmÄ lieta, kas jÄpatur prÄtÄ, ir primitÄ«vo datu tipu attÄlojums atmiÅÄ. TÄtad visÄs Apple ierÄ«cÄs veseli skaitļu mainÄ«gie tiek saglabÄti formÄtÄ Mazais Endians. Tas nozÄ«mÄ, ka vismazÄk nozÄ«mÄ«gais baits bÅ«s kreisajÄ pusÄ, un jÅ«s nevarÄsit kÄrtot veselus skaitļus, izmantojot to salÄ«dzinÄjumu pa baitiem. PiemÄram, mÄÄ£inot to izdarÄ«t ar skaitļu kopu no 0 lÄ«dz 511, tiks parÄdÄ«ts Å”Äds rezultÄts.
Lai atrisinÄtu Å”o problÄmu, atslÄgÄ ir jÄsaglabÄ veseli skaitļi baitu salÄ«dzinÄjumam piemÄrotÄ formÄtÄ. Ä¢imenes funkcijas palÄ«dzÄs veikt nepiecieÅ”amo transformÄciju. hton* (it Ä«paÅ”i htons divbaitu numuriem no piemÄra).
VirkÅu attÄloÅ”anas formÄts programmÄÅ”anÄ, kÄ jÅ«s zinÄt, ir vesels stÄsts. Ja virkÅu semantika, kÄ arÄ« to atveidoÅ”anai atmiÅÄ izmantotais kodÄjums liecina, ka katrai rakstzÄ«mei var bÅ«t vairÄk nekÄ viens baits, tad labÄk ir nekavÄjoties atteikties no idejas par noklusÄjuma salÄ«dzinÄjuma izmantoÅ”anu.
Otra lieta, kas jÄpatur prÄtÄ, ir saskaÅoÅ”anas principi struct lauka kompilators. To dÄļ atmiÅÄ starp laukiem var tikt izveidoti baiti ar atkritumu vÄrtÄ«bÄm, kas, protams, pÄrtrauc baitu ŔķiroÅ”anu. Lai novÄrstu atkritumus, jums ir vai nu jÄdeklarÄ lauki stingri noteiktÄ secÄ«bÄ, paturot prÄtÄ lÄ«dzinÄÅ”anas noteikumus, vai arÄ« jÄizmanto atribÅ«ts struktÅ«ras deklarÄcijÄ packed.
AtslÄgu pasÅ«tÄ«Å”ana ar ÄrÄju salÄ«dzinÄtÄju
AtslÄgu salÄ«dzinÄÅ”anas loÄ£ika var izrÄdÄ«ties pÄrÄk sarežģīta binÄram salÄ«dzinÄjumam. Viens no daudzajiem iemesliem ir tehnisko lauku klÄtbÅ«tne konstrukcijÄs. Es ilustrÄÅ”u to raÅ”anos, izmantojot piemÄru ar mums jau pazÄ«stamu direktorija elementa taustiÅu.
Neskatoties uz savu vienkÄrŔību, vairumÄ gadÄ«jumu tas patÄrÄ pÄrÄk daudz atmiÅas. Virsraksta buferis ir 256 baiti, lai gan vidÄji failu un mapju nosaukumi reti pÄrsniedz 20ā30 rakstzÄ«mes.
Viens no standarta paÅÄmieniem ieraksta lieluma optimizÄÅ”anai ir tÄ apgrieÅ”ana, lai tas atbilstu tÄ faktiskajam izmÄram. TÄs bÅ«tÄ«ba ir tÄda, ka visu mainÄ«ga garuma lauku saturs tiek glabÄts buferÄ« struktÅ«ras beigÄs un to garumi tiek glabÄti atseviŔķos mainÄ«gajos.SaskaÅÄ ar Å”o pieeju atslÄga NodeKey tiek pÄrveidots Å”ÄdÄ veidÄ.
TurklÄt serializÄcijas laikÄ nav norÄdÄ«ts kÄ datu lielums sizeof visa struktÅ«ra, un visu lauku lielums ir fiksÄts garums plus faktiski izmantotÄs bufera daļas lielums.
RefaktorizÄcijas rezultÄtÄ mÄs panÄcÄm ievÄrojamu ietaupÄ«jumu atslÄgu aizÅemtajÄ telpÄ. TomÄr tehniskÄs jomas dÄļ nameLength, noklusÄjuma binÄrais salÄ«dzinÄtÄjs vairs nav piemÄrots atslÄgu salÄ«dzinÄÅ”anai. Ja mÄs to neaizstÄsim ar savu, tad nosaukuma garums bÅ«s prioritÄrÄks faktors ŔķiroÅ”anÄ nekÄ pats nosaukums.
LMDB ļauj katrai datubÄzei izmantot savu atslÄgu salÄ«dzinÄÅ”anas funkciju. Tas tiek darÄ«ts, izmantojot funkciju mdb_set_compare stingri pirms atvÄrÅ”anas. AcÄ«mredzamu iemeslu dÄļ datu bÄzi nevar mainÄ«t tÄs darbÄ«bas laikÄ. IevadÄ salÄ«dzinÄtÄjs saÅem divus taustiÅus binÄrÄ formÄtÄ, un izejÄ tas atgriež salÄ«dzinÄÅ”anas rezultÄtu: mazÄks par (-1), lielÄks par (1) vai vienÄds (0). Pseidokods priekÅ” NodeKey izskatÄs tÄ.
int compare(MDB_val * const a, MDB_val * const b) {ā
NodeKey * const aKey = (NodeKey * const)a->mv_data;ā
NodeKey * const bKey = (NodeKey * const)b->mv_data;ā
return // ...
}ā
KamÄr visas atslÄgas datu bÄzÄ ir viena veida, ir likumÄ«gi bez nosacÄ«jumiem nodot to baitu attÄlojumu atslÄgas lietojumprogrammas struktÅ«ras veidam. Å eit ir viena nianse, bet par to tiks runÄts nedaudz zemÄk apakÅ”sadaÄ¼Ä āLasÄ«Å”anas ierakstiā.
VÄrtÄ«bu serializÄcija
Ar glabÄjamo ierakstu atslÄgÄm LMDB strÄdÄ ÄrkÄrtÄ«gi intensÄ«vi. Tie tiek salÄ«dzinÄti viens ar otru jebkuras lietojumprogrammas darbÄ«bas ietvaros, un visa risinÄjuma veiktspÄja ir atkarÄ«ga no salÄ«dzinÄjuma Ätruma. IdeÄlÄ pasaulÄ ar noklusÄjuma binÄro salÄ«dzinÄtÄju vajadzÄtu pietikt, lai salÄ«dzinÄtu atslÄgas, bet, ja jums patieÅ”Äm bija jÄizmanto savs, tad tajÄ esoÅ”o atslÄgu deserializÄcijas procedÅ«rai vajadzÄtu bÅ«t pÄc iespÄjas ÄtrÄkai.
DatubÄzi Ä«paÅ”i neinteresÄ ieraksta (vÄrtÄ«bas) daļa Value. TÄ pÄrveidoÅ”ana no baitu attÄlojuma par objektu notiek tikai tad, kad tas jau ir vajadzÄ«gs lietojumprogrammas kodam, piemÄram, lai to parÄdÄ«tu ekrÄnÄ. TÄ kÄ tas notiek salÄ«dzinoÅ”i reti, prasÄ«bas Ŕīs procedÅ«ras Ätrumam nav tik kritiskas, un tÄs ievieÅ”anÄ daudz brÄ«vÄk varam koncentrÄties uz ÄrtÄ«bÄm, piemÄram, lai serializÄtu metadatus par failiem, kas vÄl nav lejupielÄdÄti, mÄs izmantojam NSKeyedArchiver.
TomÄr ir gadÄ«jumi, kad sniegumam ir nozÄ«me. PiemÄram, saglabÄjot metainformÄciju par lietotÄja mÄkoÅa failu struktÅ«ru, mÄs izmantojam vienu un to paÅ”u objektu atmiÅas izgÄztuvi. SerializÄtÄ attÄlojuma Ä£enerÄÅ”anas uzdevums ir tas, ka direktorija elementus modelÄ klaÅ”u hierarhija.
TÄs Ä«stenoÅ”anai C valodÄ mantinieku specifiskie lauki tiek izdalÄ«ti atseviŔķÄs struktÅ«rÄs, un to saikne ar pamatu tiek noteikta caur savienÄ«bas tipa lauku. ApvienÄ«bas faktiskais saturs tiek norÄdÄ«ts, izmantojot tipa tehnisko atribÅ«tu.
KonfigurÄcijas stadijÄ repozitorija var atļaut vai aizliegt glabÄt vairÄkus ierakstus ar vienu atslÄgu.āā Ja atslÄgu dublÄÅ”ana ir aizliegta, tad, ievietojot ierakstu, varat noteikt, vai ir atļauta jau esoÅ”a ieraksta atjauninÄÅ”ana. Ja nodilums var rasties tikai koda kļūdas rezultÄtÄ, tad pret to var apdroÅ”inÄties, norÄdot karogu NOOVERWRITE.
Ierakstu lasīŔana
Ierakstu nolasÄ«Å”anas funkcija LMDB ir mdb_get. Ja atslÄgu un vÄrtÄ«bu pÄri attÄlo iepriekÅ” izmestas struktÅ«ras, Ŕī procedÅ«ra izskatÄs Å”Ädi.
PiedÄvÄtais saraksts parÄda, kÄ serializÄcija, izmantojot struktÅ«ru izgÄztuvi, ļauj atbrÄ«voties no dinamiskiem pieŔķīrumiem ne tikai rakstot, bet arÄ« lasot datus. AtvasinÄts no funkcijas mdb_get rÄdÄ«tÄjs precÄ«zi aplÅ«ko virtuÄlÄs atmiÅas adresi, kurÄ datu bÄze glabÄ objekta baitu attÄlojumu. Faktiski mÄs iegÅ«stam sava veida ORM, gandrÄ«z bez maksas, nodroÅ”inot ļoti lielu datu lasÄ«Å”anas Ätrumu. Ar visu pieejas skaistumu ir jÄatceras vairÄkas ar to saistÄ«tas iezÄ«mes.
Ja darÄ«jums ir tikai lasÄms, rÄdÄ«tÄjs uz vÄrtÄ«bu struktÅ«ru tiek garantÄts, ka tas paliks spÄkÄ tikai lÄ«dz darÄ«juma slÄgÅ”anai. KÄ minÄts iepriekÅ”, B koka lapas, kurÄs atrodas objekts, pateicoties kopÄÅ”anas-uzrakstÄ«Å”anas principam, paliek nemainÄ«gas, kamÄr uz tÄm attiecas vismaz viens darÄ«jums. TajÄ paÅ”Ä laikÄ, tiklÄ«dz ir pabeigts pÄdÄjais ar tÄm saistÄ«tais darÄ«jums, lapas var atkÄrtoti izmantot jauniem datiem. Ja ir nepiecieÅ”ams, lai objekti izdzÄ«votu darÄ«jumÄ, kas tos radÄ«ja, tad tie tomÄr ir jÄkopÄ.
LasÄ«Å”anas un rakstÄ«Å”anas transakcijai rÄdÄ«tÄjs uz iegÅ«to struktÅ«ras vÄrtÄ«bu bÅ«s derÄ«gs tikai lÄ«dz pirmajai modificÄÅ”anas procedÅ«rai (datu rakstÄ«Å”anai vai dzÄÅ”anai).
Lai arÄ« struktÅ«ra NodeValue nevis pilnvÄrtÄ«gs, bet apgriezts (skat. apakÅ”sadaļu "AtslÄgu pasÅ«tÄ«Å”ana ar ÄrÄju salÄ«dzinÄtÄju"), caur rÄdÄ«tÄju var Ärti piekļūt tÄ laukiem. Galvenais ir to neatsaukt!
NekÄdÄ gadÄ«jumÄ nevar modificÄt struktÅ«ru, izmantojot saÅemto rÄdÄ«tÄju. Visas izmaiÅas jÄveic tikai ar metodi mdb_put. TomÄr ar visu vÄlmi to darÄ«t, tas nedarbosies, jo atmiÅas apgabals, kurÄ atrodas Ŕī struktÅ«ra, ir kartÄts tikai lasÄ«Å”anas režīmÄ.
PÄrveidojiet failu procesa adreÅ”u telpÄ, lai, piemÄram, palielinÄtu maksimÄlo krÄtuves lielumu, izmantojot funkciju mdb_env_set_map_size pilnÄ«bÄ padara nederÄ«gus visus darÄ«jumus un saistÄ«tÄs entÄ«tijas kopumÄ un jo Ä«paÅ”i norÄdes uz objektu lasÄ«Å”anu.
Visbeidzot, vÄl viena iezÄ«me ir tik mÄnÄ«ga, ka tÄs bÅ«tÄ«bas izpauÅ”ana neietilpst vÄl vienÄ punktÄ. NodaÄ¼Ä par B-koku es sniedzu diagrammu par tÄ lappuÅ”u organizÄÅ”anu atmiÅÄ. No tÄ izriet, ka bufera sÄkuma adrese ar serializÄtiem datiem var bÅ«t absolÅ«ti patvaļīga. SakarÄ ar to, rÄdÄ«tÄjs uz tiem, kas iegÅ«ti struktÅ«rÄ MDB_val un cast uz rÄdÄ«tÄju uz struktÅ«ru parasti nav izlÄ«dzinÄts. TajÄ paÅ”Ä laikÄ dažu mikroshÄmu arhitektÅ«ra (iOS gadÄ«jumÄ tas ir armv7) pieprasa, lai jebkuru datu adresei ir jÄbÅ«t maŔīnas vÄrda lieluma reizinÄjumam vai, citiem vÄrdiem sakot, sistÄmas bitumam. (armv7 tas ir 32 biti). Citiem vÄrdiem sakot, tÄda operÄcija kÄ *(int *foo)0x800002 uz tiem tiek pielÄ«dzinÄts bÄgÅ”anai un noved pie nÄvessoda ar spriedumu EXC_ARM_DA_ALIGN. Ir divi veidi, kÄ izvairÄ«ties no tik bÄdÄ«ga likteÅa.
Pirmais ir iepriekÅ” kopÄt datus zinÄmÄ saskaÅotÄ struktÅ«rÄ. PiemÄram, pielÄgotÄ salÄ«dzinÄtÄjÄ tas tiks atspoguļots Å”Ädi.
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey aKey, bKey;
memcpy(&aKey, a->mv_data, a->mv_size);
memcpy(&bKey, b->mv_data, b->mv_size);
return // ...
}
AlternatÄ«vs veids ir iepriekÅ” paziÅot kompilatoram, ka struktÅ«ras ar atslÄgu un vÄrtÄ«bu var netikt lÄ«dzinÄtas, izmantojot atribÅ«tu. aligned(1). Uz ARM var bÅ«t tÄds pats efekts sasniegt un izmantojot packed atribÅ«tu. Å emot vÄrÄ, ka tÄ arÄ« veicina struktÅ«ras aizÅemtÄs telpas optimizÄciju, Ŕī metode man Ŕķiet labÄka, lai gan ŠæŃŠøŠ²Š¾Š“ŠøŃ palielinÄt datu piekļuves operÄciju izmaksas.
Lai atkÄrtotu ierakstu grupu, LMDB nodroÅ”ina kursora abstrakciju. ApskatÄ«sim, kÄ ar to strÄdÄt, izmantojot tabulas piemÄru ar mums jau pazÄ«stamiem lietotÄja mÄkoÅa metadatiem.
KatalogÄ esoÅ”o failu saraksta parÄdÄ«Å”anas ietvaros ir jÄatrod visas atslÄgas, ar kurÄm ir saistÄ«ti tÄ pakÄrtotie faili un mapes. IepriekÅ”ÄjÄs apakÅ”nodaļÄs mÄs sakÄrtojÄm atslÄgas NodeKey lai tie vispirms tiktu sakÄrtoti pÄc vecÄku direktorija ID. TÄdÄjÄdi tehniski uzdevums iegÅ«t mapes saturu tiek samazinÄts lÄ«dz kursora novietoÅ”anai uz atslÄgu grupas augÅ”ÄjÄs robežas ar noteiktu prefiksu, kam seko iterÄcija lÄ«dz apakÅ”Äjai robežai.
JÅ«s varat atrast augÅ”Äjo robežu "uz pieres", veicot secÄ«gu meklÄÅ”anu. Lai to izdarÄ«tu, kursors tiek novietots visa datubÄzes atslÄgu saraksta sÄkumÄ un pÄc tam tiek palielinÄts, lÄ«dz zem tÄ parÄdÄs atslÄga ar vecÄkdirektorija identifikatoru. Å ai pieejai ir 2 acÄ«mredzami trÅ«kumi:
MeklÄÅ”anas lineÄrÄ sarežģītÄ«ba, lai gan, kÄ zinÄms, kokos kopumÄ un jo Ä«paÅ”i B-kokÄ to var veikt logaritmiskÄ laikÄ.
VeltÄ«gi visas lapas, kas ir pirms vÄlamÄs, tiek pÄrceltas no faila uz galveno atmiÅu, kas ir ÄrkÄrtÄ«gi dÄrgi.
Par laimi, LMDB API nodroÅ”ina efektÄ«vu veidu, kÄ sÄkotnÄji novietot kursoru. Lai to izdarÄ«tu, jums ir jÄveido atslÄga, kuras vÄrtÄ«ba, kÄ zinÄms, ir mazÄka vai vienÄda ar atslÄgu, kas atrodas uz intervÄla augÅ”ÄjÄs robežas. PiemÄram, attiecÄ«bÄ uz sarakstu attÄlÄ iepriekÅ”, mÄs varam izveidot atslÄgu, kurÄ lauks parentId bÅ«s vienÄds ar 2, un visi pÄrÄjie ir aizpildÄ«ti ar nullÄm. Å Äda daļÄji aizpildÄ«ta atslÄga tiek ievadÄ«ta funkcijas ievadÄ mdb_cursor_get kas norÄda uz darbÄ«bu MDB_SET_RANGE.
Ja tiek atrasta atslÄgu grupas augÅ”ÄjÄ robeža, mÄs atkÄrtojam to, lÄ«dz tiekam vai nu atslÄga ar citu parentId, vai arÄ« atslÄgas vispÄr nebeigsies.
do {ā
rc = mdb_cursor_get(cursor, &key, &value, MDB_NEXT);ā
// processing...ā
} while (MDB_NOTFOUND != rc && // check end of tableā
IsTargetKey(key)); // check end of keys groupāā
Kas ir jauki, iterÄcijas ietvaros, izmantojot mdb_cursor_get, mÄs iegÅ«stam ne tikai atslÄgu, bet arÄ« vÄrtÄ«bu. Ja, lai izpildÄ«tu atlases nosacÄ«jumus, cita starpÄ ir jÄpÄrbauda lauki no ieraksta vÄrtÄ«bas daļas, tad tie ir diezgan pieejami bez papildu žestiem.
4.3. SakarÄ«bu modelÄÅ”ana starp tabulÄm
LÄ«dz Å”im mums ir izdevies apsvÄrt visus aspektus, izstrÄdÄjot un strÄdÄjot ar vienas tabulas datubÄzi. Var teikt, ka tabula ir sakÄrtotu ierakstu kopa, kas sastÄv no viena veida atslÄgu-vÄrtÄ«bu pÄriem. Ja atslÄgu parÄdÄt kÄ taisnstÅ«ri un ar to saistÄ«to vÄrtÄ«bu kÄ lodziÅu, tiek iegÅ«ta datu bÄzes vizuÄla diagramma.
ā
TomÄr reÄlajÄ dzÄ«vÄ ar tik mazu asiÅu maz izdodas iztikt. Bieži vien datu bÄzÄ, pirmkÄrt, ir nepiecieÅ”amas vairÄkas tabulas un, otrkÄrt, tajÄs jÄveic atlase secÄ«bÄ, kas atŔķiras no primÄrÄs atslÄgas. Å Ä« pÄdÄjÄ sadaļa ir veltÄ«ta to izveides un savstarpÄjÄs savienojamÄ«bas jautÄjumiem.
Indeksu tabulas
MÄkoÅa lietotnÄ ir sadaļa "Galerija". Tas parÄda multivides saturu no visa mÄkoÅa, sakÄrtots pÄc datuma. Å Ädas atlases optimÄlai ievieÅ”anai blakus galvenajai tabulai ir jÄizveido cita ar jauna veida taustiÅiem. Tajos bÅ«s lauks ar faila izveides datumu, kas darbosies kÄ galvenais ŔķiroÅ”anas kritÄrijs. TÄ kÄ jaunÄs atslÄgas attiecas uz tiem paÅ”iem datiem kÄ atslÄgas pamatÄ esoÅ”ajÄ tabulÄ, tÄs sauc par indeksa atslÄgÄm. ZemÄk esoÅ”ajÄ attÄlÄ tie ir izcelti oranÅ¾Ä krÄsÄ.
Lai vienas datu bÄzes ietvaros atdalÄ«tu dažÄdu tabulu atslÄgas vienu no otras, tÄm visÄm ir pievienots papildu tehniskÄ lauka tableId. Padarot to par ŔķiroÅ”anas augstÄko prioritÄti, atslÄgas grupÄsim vispirms pa tabulÄm, bet jau tabulu iekÅ”pusÄ ā saskaÅÄ ar mÅ«su paÅ”u noteikumiem.ā
Indeksa atslÄga attiecas uz tiem paÅ”iem datiem kÄ primÄrÄ atslÄga. Å Ä« Ä«paÅ”uma vienkÄrÅ”a ievieÅ”ana, saistot ar to primÄrÄs atslÄgas vÄrtÄ«bas daļas kopiju, nav optimÄla no vairÄkiem viedokļiem vienlaikus:ā
No vietas aizÅemtÄ viedokļa metadati var bÅ«t diezgan bagÄti.
No veiktspÄjas viedokļa, jo, atjauninot mezgla metadatus, jums bÅ«s jÄpÄrraksta divas atslÄgas.
Galu galÄ no koda atbalsta viedokļa, ja mÄs aizmirstam atjauninÄt datus vienai no atslÄgÄm, mÄs iegÅ«sim smalku datu neatbilstÄ«bas kļūdu krÄtuvÄ.
Modelis ir labi piemÄrots indeksa tabulas saistÄ«Å”anai ar galveno "atslÄga kÄ vÄrtÄ«ba". KÄ norÄda nosaukums, indeksa ieraksta vÄrtÄ«bas daļa ir primÄrÄs atslÄgas vÄrtÄ«bas kopija. Å Ä« pieeja novÄrÅ” visus iepriekÅ” uzskaitÄ«tos trÅ«kumus, kas saistÄ«ti ar primÄrÄ ieraksta vÄrtÄ«bas daļas kopijas saglabÄÅ”anu. VienÄ«gÄ maksa ir tÄda, ka, lai iegÅ«tu vÄrtÄ«bu pÄc indeksa atslÄgas, datu bÄzei ir jÄveic 2 vaicÄjumi, nevis viens. Shematiski iegÅ«tÄ datu bÄzes shÄma ir Å”Äda.
Cits modelis attiecÄ«bu organizÄÅ”anai starp tabulÄm ir "lieka atslÄga". TÄs bÅ«tÄ«ba ir pievienot atslÄgai papildu atribÅ«tus, kas nepiecieÅ”ami nevis ŔķiroÅ”anai, bet gan saistÄ«tÄs atslÄgas atjaunoÅ”anai, taÄu Mail.ru Cloud lietojumprogrammÄ ir reÄli tÄs izmantoÅ”anas piemÄri, lai izvairÄ«tos no dziļas nirÅ”anas konkrÄtu iOS ietvaru kontekstÄ minÄÅ”u fiktÄ«vu, bet saprotamÄku piemÄru.
MÄkoÅa mobilajiem klientiem ir lapa, kurÄ tiek parÄdÄ«ti visi faili un mapes, ko lietotÄjs ir kopÄ«gojis ar citiem cilvÄkiem. TÄ kÄ Å”Ädu failu ir salÄ«dzinoÅ”i maz un ar tiem ir daudz specifiskas informÄcijas par publicitÄti (kam tiek pieŔķirta piekļuve, ar kÄdÄm tiesÄ«bÄm utt.), nebÅ«tu racionÄli to noslogot ar vÄrtÄ«bas daļu. rekords galvenajÄ tabulÄ. TomÄr, ja vÄlaties Å”Ädus failus parÄdÄ«t bezsaistÄ, jums tie joprojÄm ir kaut kur jÄsaglabÄ. Dabisks risinÄjums ir tam izveidot atseviŔķu tabulu. TÄlÄk redzamajÄ diagrammÄ tÄs atslÄgas prefikss ir āPā, un vietturi āpropnameā var aizstÄt ar konkrÄtÄku vÄrtÄ«bu āpubliskÄ informÄcijaā.ā
Visi unikÄlie metadati, kuru dÄļ tika izveidota jaunÄ tabula, tiek pÄrvietoti uz ieraksta vÄrtÄ«bu daļu. TajÄ paÅ”Ä laikÄ es nevÄlos dublÄt datus par failiem un mapÄm, kas jau ir saglabÄti galvenajÄ tabulÄ. TÄ vietÄ atslÄgai "P" tiek pievienoti lieki dati lauku "mezgla ID" un "laikspiedola" veidÄ. Pateicoties viÅiem, jÅ«s varat izveidot indeksa atslÄgu, ar kuras palÄ«dzÄ«bu jÅ«s varat iegÅ«t primÄro atslÄgu, ar kuru visbeidzot jÅ«s varat iegÅ«t mezgla metadatus.
SecinÄjums
LMDB ievieÅ”anas rezultÄtus vÄrtÄjam pozitÄ«vi. PÄc tÄs pieteikumu iesaldÄÅ”anas skaits samazinÄjÄs par 30%.
PaveiktÄ darba rezultÄti ir atraduÅ”i atsaucÄ«bu Ärpus iOS komandas. Å obrÄ«d uz LMDB lietoÅ”anu ir pÄrgÄjusi arÄ« viena no galvenajÄm sadaļÄm "Faili" Android aplikÄcijÄ, un ceÄ¼Ä ir arÄ« citas daļas. C valoda, kurÄ ir ieviesta atslÄgas vÄrtÄ«bu krÄtuve, bija labs palÄ«gs, lai sÄkotnÄji padarÄ«tu lietojumprogrammu saistoÅ”u ap to starpplatformu C ++ valodÄ. Nevainojamai iegÅ«tÄs C ++ bibliotÄkas savienoÅ”anai ar platformas kodu objektos Objective-C un Kotlin tika izmantots kodu Ä£enerators. Džinni no Dropbox, bet tas ir cits stÄsts.