Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

I titim 2019, tharla imeacht a raibh súil leis le fada i bhfoireann Mail.ru Cloud iOS. Tá an príomhbhunachar sonraí le haghaidh stóráil leanúnach staid iarratais tar éis éirí an-choimhthíocha don domhan soghluaiste Bunachar Sonraí Mapáilte Cuimhne Lightning (LMDB). Faoi bhun an ghearrtha cuirimid athbhreithniú mionsonraithe ar fáil duit i gceithre chuid. Gcéad dul síos, déanaimis labhairt faoi na cúiseanna atá le rogha den sórt sin neamhfhánach agus deacair. Ansin bogfaimid ar aghaidh chun na trí cholún atá i gcroílár ailtireacht LMDB a mheas: comhaid le mapáil chuimhne, B+-tree, cur chuige cóip-ar-scríobh chun idirbheartaíocht agus iolrachas a chur i bhfeidhm. Ar deireadh, le haghaidh milseog - an chuid phraiticiúil. In sé féachfaimid ar conas scéimre bunachar sonraí a dhearadh agus a chur i bhfeidhm le roinnt táblaí, lena n-áirítear innéacs a haon, anuas ar an API ísealluacha eochrach.

Ábhar

  1. Spreagadh le cur i bhfeidhm
  2. Suíomh LMDB
  3. Trí cholún LMDB
    3.1. Míol Mór #1. Comhaid le mapáil chuimhne
    3.2. Míol Mór #2. B+-crann
    3.3. Míol Mór #3. Cóipeáil-ar-scríobh
  4. Scéimre sonraí a dhearadh ar bharr an API eochairluacha
    4.1. Astarraingtí bunúsacha
    4.2. Samhaltú Tábla
    4.3. Caidrimh idir táblaí a shamhaltú

1. Spreagadh don chur i bhfeidhm

Bliain amháin in 2015, bhí an deacracht againn a thomhas cé chomh minic agus a théann comhéadan ár bhfeidhmchlár i léig. Rinneamar é seo ar chúis. Tá gearáin faighte againn níos minice go stopann an feidhmchlár ó am go chéile ag freagairt do ghníomhartha úsáideoirí: ní féidir cnaipí a bhrú, ní scrollaíonn liostaí, etc. Mar gheall ar an meicnic tomhais saor in aisce, inis ar AvitoTech, mar sin anseo a thabhairt liom ach an t-ord uimhreacha.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Tháinig na torthaí tomhais chun bheith ina cithfholcadh fuar dúinn. Iompaigh sé amach go bhfuil i bhfad níos mó fadhbanna de bharr reo ná aon cheann eile. Más rud é sular thuig sé seo go raibh an príomhtháscaire teicniúil cáilíochta saor ó thimpiste, ansin tar éis an fhócas aistrigh ar reo saor in aisce.

Ag tógáil painéal le reo agus tar éis caitheamh cainníochtúil и cáilíocht anailís ar a gcuid cúiseanna, ba é an príomh-namhaid soiléir - loighic gnó trom a fhorghníomhófar i snáithe is mó den iarratas. Ba é an freagra nádúrtha ar an náire seo ná fonn dóite é a bhrú isteach i sruthanna oibre. Chun an fhadhb seo a réiteach go córasach, bhaineamar leas as ailtireacht il-snáithithe bunaithe ar aisteoirí éadroma. Tiomanta mé é dá oiriúnú don domhan iOS dhá shnáithe ar Twitter comhchoiteann agus alt ar Habré. Mar chuid den insint reatha, ba mhaith liom béim a leagan ar na gnéithe sin den chinneadh a raibh tionchar acu ar rogha an bhunachair shonraí.

​Glacann samhail an aisteoir d’eagrú córais leis gurb é an t-ilthreading a dhara bunúsach. Is maith le rudaí múnla atá ann teorainneacha srutha a thrasnú. Agus déanann siad é seo ní uaireanta agus anseo agus ansiúd, ach beagnach i gcónaí agus i ngach áit

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Tá an bunachar sonraí ar cheann de na comhpháirteanna bunchloch sa léaráid a chuirtear i láthair. Is é a phríomhthasc an macrapattern a chur i bhfeidhm Bunachar Sonraí Comhroinnte. Más rud é sa domhan fiontair úsáidtear é chun sioncrónú sonraí a eagrú idir seirbhísí, ansin i gcás ailtireacht aisteoir - sonraí idir snáitheanna. Mar sin, bhí bunachar sonraí de dhíth orainn nach gcruthódh fiú miondeacrachtaí agus muid ag obair leis i dtimpeallacht il-snáithithe. Ciallaíonn sé seo go háirithe go gcaithfidh rudaí a fhaightear uaidh a bheith sábháilte ó thaobh snáitheanna de, agus go hidéalach go hiomlán neamh-chomhshóite. Mar is eol duit, is féidir an dara ceann a úsáid ag an am céanna ó roinnt snáitheanna gan dul i muinín aon ghlasáil, a bhfuil tionchar tairbheach aige ar fheidhmíocht.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOSBa é an dara fachtóir suntasach a raibh tionchar aige ar rogha an bhunachair shonraí ná ár n-API scamall. Ba é an cur chuige sioncrónaithe a ghlac git a spreag é. Cosúil leis, bhí sé mar aidhm againn as líne-an chéad API, a bhreathnaíonn níos mó ná mar is cuí do chliaint scamall. Glacadh leis nach ndéanfadh siad ach staid iomlán an néil a phumpáil amach uair amháin, agus ansin go dtarlódh sioncrónú i bhformhór mór na gcásanna trí athruithe a chur i bhfeidhm. Faraoir, níl an deis seo fós ach sa chrios teoiriciúil, agus níor fhoghlaim cliaint conas oibriú le paistí go praiticiúil. Tá roinnt cúiseanna oibiachtúla ann leis seo, agus, ionas nach gcuirfear moill ar an tabhairt isteach, fágfaimid lúibíní taobh thiar de. Anois, is díol spéise i bhfad níos mó conclúidí oiliúnacha an cheachta faoi cad a tharlaíonn nuair a deir API “A” agus nach ndeir an tomhaltóir “B”.

Mar sin, má shamhlú tú git, a dhéanann, nuair a bhíonn ordú tarraingthe á fhorghníomhú agat, in ionad paistí a chur i bhfeidhm ar phictiúr áitiúil, a staid iomlán a chur i gcomparáid le stát iomlán an fhreastalaí, ansin beidh smaoineamh sách cruinn agat ar conas a tharlaíonn sioncrónú sa scamall. cliaint. Is furasta a buille faoi thuairim, chun é a chur i bhfeidhm, ní mór duit dhá chrann DOM a leithdháileadh i gcuimhne le meiteaisnéis faoi gach freastalaí agus comhad áitiúil. Tarlaíonn sé, má stórálann úsáideoir 500 míle comhad sa scamall, ansin chun é a shioncrónú is gá dhá chrann le 1 milliún nóid a athchruthú agus a scriosadh. Ach is comhiomlán é gach nód ina bhfuil graf d’ábhair. Ina fhianaise sin, bhíothas ag súil leis na torthaí próifílithe. Iompaigh sé amach go fiú gan cur san áireamh an algartam chumaisc, an nós imeachta an-a chruthú agus ina dhiaidh sin scrios ar líon mór de rudaí beaga costas pingin deas.Tá an scéal níos measa ag an bhfíric go bhfuil an oibríocht sioncrónaithe bunúsach san áireamh i líon mór. de scripteanna úsáideora. Mar thoradh air sin, socróimid an dara critéar tábhachtach i roghnú bunachar sonraí - an cumas chun oibríochtaí CRUD a chur i bhfeidhm gan leithdháileadh dinimiciúil rudaí.

Tá ceanglais eile níos traidisiúnta agus seo a leanas a liosta iomlán.

  1. Sábháilteacht snáithe.
  2. Ilphróiseáil. Arna dheachtú ag an mian leis an sampla bunachar sonraí céanna a úsáid chun an stát a shioncrónú, ní hamháin idir snáitheanna, ach freisin idir an príomhfheidhmchlár agus síntí iOS.
  3. An cumas aonáin stóráilte a léiriú mar réada neamh-chomhshóite
  4. Gan aon leithdháiltí dinimiciúla laistigh d'oibríochtaí CRUD.
  5. Tacaíocht idirbhirt le haghaidh airíonna bunúsacha Aigéad: adamhacht, comhsheasmhacht, leithlisiú agus iontaofacht.
  6. Luas ar na cásanna is coitianta.

Leis an sraith riachtanas seo, bhí SQLite ina rogha mhaith agus tá sé fós ina rogha mhaith. Mar chuid den staidéar ar roghanna eile, áfach, tháinig mé trasna ar leabhar "Tosú le LevelDB". Faoina ceannaireacht, scríobhadh tagarmharc a rinne comparáid idir luas na hoibre le bunachair shonraí éagsúla i bhfíorchásanna néil. Sháraigh an toradh ár n-ionchais is fiáine. Sna cásanna is coitianta - cúrsóir a fháil ar liosta sórtáilte de na comhaid go léir agus liosta sórtáilte de na comhaid go léir le haghaidh eolaire ar leith - d'éirigh le LMDB a bheith 10 n-uaire níos tapúla ná SQLite. Tháinig an rogha soiléir.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

2. Suíomh LMDB

Is leabharlann an-bheag é LMDB (ach sraitheanna 10K) a chuireann an ciseal bunúsach bunachair shonraí is ísle i bhfeidhm - stóráil.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Léiríonn an léaráid thuas nach bhfuil comparáid idir LMDB agus SQLite, a chuireann leibhéil níos airde i bhfeidhm freisin, i gcoitinne níos ceart ná SQLite le Croíshonraí. Bheadh ​​sé níos cothroime na hinnill stórála céanna a lua mar iomaitheoirí comhionanna - BerkeleyDB, LevelDB, Sophia, RocksDB, etc. Tá forbairtí fiú nuair a fheidhmíonn LMDB mar chomhpháirt inneall stórála do SQLite. Rinneadh an chéad turgnamh den sórt sin in 2012 caite ag LMDB Howard Chu. Torthaí bhí sé chomh spéisiúil sin gur roghnaigh díograiseoirí OSS a thionscnamh, agus fuair sé go raibh sé ag leanúint ar aghaidh sa duine LumoSQL. I mí Eanáir 2020, ba é Den Shearer údar an tionscadail seo i láthair é ag LinuxConfAu.

Úsáidtear LMDB go príomha mar inneall do bhunachair shonraí feidhmchlár. Tá an leabharlann faoi chomaoin ag na forbróirí OpenLDAP, a bhí an-mhíshásta le BerkeleyDB mar bhunús dá dtionscadal. Ag tosú ó leabharlann measartha crann, Bhí Howard Chu in ann ceann de na roghanna eile is coitianta dár gcuid ama a chruthú. Thiomnaigh sé a thuarascáil iontach don scéal seo, chomh maith le struchtúr inmheánach LMDB. "Bunachar Sonraí ar Léarscáiliú Cuimhne Lightning". Roinn Leonid Yuryev (aka yeo) ó Positive Technologies ina thuarascáil ag Highload 2015 “Is curadh speisialta é inneall an LMDB”. Inti, labhraíonn sé faoi LMDB i gcomhthéacs tasc comhchosúil maidir le ReOpenLDAP a chur i bhfeidhm, agus tá LevelDB faoi réir cáineadh comparáideach cheana féin. Mar thoradh ar an gcur i bhfeidhm, bhí forc ag forbairt go gníomhach fiú ag Positive Technologies MDBX le gnéithe an-bhlasta, optimizations agus ceartúcháin.

Is minic a úsáidtear LMDB mar stór mar atá. Mar shampla, brabhsálaí Mozilla Firefox roghnaigh é le haghaidh roinnt riachtanas, agus, ag tosú ó leagan 9, Xcode fearr a SQLite chun innéacsanna a stóráil.

Tá marc déanta ag an inneall freisin i saol na forbartha soghluaiste. Is féidir rianta de a úsáid teacht ar sa chliant iOS le haghaidh Telegram. Chuaigh LinkedIn níos faide fós agus roghnaigh sé LMDB mar an stóras réamhshocraithe dá chreat um thaisceadh sonraí dúchasacha Rocket Data. inis ina alt in 2016.

Tá LMDB ag troid go rathúil le haghaidh áit sa ghrian sa nideoige a d'fhág BerkeleyDB tar éis dó teacht faoi smacht Oracle. Tá grá ag an leabharlann as a luas agus a hiontaofacht, fiú i gcomparáid lena piaraí. Mar is eol duit, níl aon lónta saor in aisce ann, agus ba mhaith liom béim a chur ar an gcomhbhabhtáil a bheidh ort agus tú ag roghnú idir LMDB agus SQLite. Léiríonn an léaráid thuas go soiléir conas a dhéantar luas méadaithe a bhaint amach. Ar dtús, ní íocaimid as sraitheanna breise astarraingthe ar bharr stórála diosca. Tá sé soiléir nach féidir le dea-ailtireacht a dhéanamh fós gan iad, agus gan dabht beidh siad le feiceáil sa chód iarratais, ach beidh siad i bhfad níos subtle. Ní bheidh gnéithe iontu nach bhfuil ag teastáil ó fheidhmchlár ar leith, mar shampla, tacaíocht d’fhiosrúcháin sa teanga SQL. Ar an dara dul síos, beidh sé indéanta mapáil oibríochtaí feidhmchláir a chur i bhfeidhm ar iarratais ar stóráil diosca. Má SQLite i mo chuid oibre bunaithe ar na meánriachtanais staitistiúla a bhaineann le meánfheidhmchlár, is eol duitse, mar fhorbróir feidhmchlár, na príomhchásanna ualach oibre. Chun réiteach níos táirgiúla a fháil, beidh ort praghas méadaithe a íoc chun an réiteach tosaigh a fhorbairt agus as a thacaíocht ina dhiaidh sin.

3. Trí philéar LMDB

Tar éis féachaint ar an LMDB ó radharc éan, bhí sé in am dul níos doimhne. Beidh na chéad trí chuid eile dírithe ar anailís a dhéanamh ar na príomhcholúin ar a luíonn an ailtireacht stórála:

  1. Comhaid atá léarscáilithe le cuimhne mar mheicníocht chun oibriú le diosca agus chun struchtúir sonraí inmheánacha a shioncronú.
  2. B+-tree mar eagraíocht de struchtúr na sonraí stóráilte.
  3. Cóipeáil-ar-scríobh mar chur chuige chun airíonna idirbheart ACID agus iolrachas a sholáthar.

3.1. Míol Mór #1. Comhaid le mapáil chuimhne

Is gné ailtireachta chomh tábhachtach iad comhaid léarscáilithe cuimhne go bhfuil siad le feiceáil fiú in ainm an stór. Fágtar go hiomlán faoin gcóras oibriúcháin na saincheisteanna a bhaineann le taisceadh agus sioncrónú rochtana ar fhaisnéis stóráilte. Níl aon taisce ann féin ag LMDB. Is cinneadh comhfhiosach é seo ag an údar, ós rud é go gceadaíonn léamh sonraí go díreach ó chomhaid léarscáilithe duit go leor coirnéil a ghearradh i gcur i bhfeidhm an innill. Anseo thíos tá liosta i bhfad ó iomlán de chuid acu.

  1. Is é an córas oibriúcháin atá freagrach as comhsheasmhacht na sonraí sa stóráil a chothabháil agus iad ag obair leis ó roinnt próiseas. Sa chéad chuid eile, pléitear an mheicnic seo go mion agus le pictiúir.
  2. Cuireann easpa caches deireadh le LMDB go hiomlán ón bhforchostas a bhaineann le leithdháiltí dinimiciúla. Is éard atá i gceist le sonraí a léamh go praiticiúil ná pointeoir a shocrú chuig an seoladh ceart i gcuimhne fíorúil agus gan aon rud eile. Fuaimeann sé cosúil le ficsean eolaíochta, ach sa chód foinse stórála tá gach glao chuig calloc comhchruinnithe sa fheidhm chumraíochta stórála.
  3. Ciallaíonn easpa caches freisin nach bhfuil glais ann a bhaineann le sioncrónú a rochtain. Ní thagann léitheoirí, ar féidir líon treallach léitheoirí a bheith ann ag an am céanna, le mutex amháin ar a mbealach chuig na sonraí. Mar gheall air seo, tá inscálaitheacht líneach idéalach ag an luas léitheoireachta bunaithe ar líon na LAPanna. In LMDB, ní dhéantar ach oibríochtaí modhnaithe a shioncronú. Ní féidir ach scríbhneoir amháin a bheith ann ag an am.
  4. Cuireann íosmhéid de loighic taisceadh agus sioncrónaithe deireadh leis an gcineál earráidí thar a bheith casta a bhaineann le bheith ag obair i dtimpeallacht il-snáithithe. Bhí dhá staidéar suimiúil ar bhunachar sonraí ag comhdháil Usenix OSDI 2014: "Níl gach Córas Comhad Cruthaithe Comhionann: Ar Chastacht Feidhmchláir Tuairteála-Comhsheasmhacha a Chruthú" и "Bunachair Sonraí Céastóireachta ar mhaithe le Spraoi agus Brabús". Is féidir leat faisnéis a fháil uathu faoi iontaofacht gan fasach LMDB agus faoi chur i bhfeidhm beagnach gan staonadh na n-airíonna idirbhirt ACID, atá níos fearr ná mar atá ag SQLite.
  5. Ceadaíonn minimalism LMDB ionadaíocht meaisín a chód a shuíomh go hiomlán i dtaisce L1 an phróiseálaí leis na tréithe luais ina dhiaidh sin.

Ar an drochuair, in iOS, le comhaid chuimhne-mhapáilte, níl gach rud chomh scamaill agus ba mhaith linn. Chun labhairt faoi na heasnaimh a bhaineann leo níos comhfhiosach, is gá cuimhneamh ar na prionsabail ghinearálta a bhaineann leis an meicníocht seo a chur i bhfeidhm i gcórais oibriúcháin.

Eolas ginearálta faoi chomhaid atá léarscáilithe le cuimhne

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOSLe gach feidhmchlár a ritheann, déanann an córas oibriúcháin aonán ar a dtugtar próiseas a chomhlachú. Leithdháiltear raon comhtheagmhálach seoltaí do gach próiseas ina gcuireann sé gach rud a theastaíonn uaidh chun oibriú. Ag na seoltaí is ísle tá rannóga le cód agus sonraí agus acmhainní crua-chódaithe. Ansin tagann bloc méadaithe de spás seolta dinimiciúil, a bhfuil aithne mhaith againn air faoin gcarn ainm. Tá seoltaí na n-eintiteas atá le feiceáil le linn oibriú an chláir ann. Ag an mbarr tá an limistéar cuimhne a úsáideann an stack feidhmchlár. Fásann sé nó síneann sé; i bhfocail eile, tá nádúr dinimiciúil ag a mhéid. Chun an chruach agus an gcarn a chosc ó bhrú agus cur isteach ar a chéile, tá siad suite ag foircinn éagsúla den spás seoltaí. Tá poll idir an dá chuid dinimiciúla ag an mbarr agus ag an mbun. Úsáideann an córas oibriúcháin seoltaí sa chuid láir seo chun éagsúlacht eintiteas a nascadh leis an bpróiseas. Go háirithe, is féidir leis sraith leanúnach áirithe seoltaí a cheangal le comhad ar an diosca. Tugtar mapáil chuimhne ar chomhad dá leithéid

Tá an spás seoltaí a leithdháileadh ar an bpróiseas ollmhór. Go teoiriciúil, tá líon na seoltaí teoranta ach amháin ag méid an pointeoir, a chinnfidh cumas giotán an chórais. Dá ndéanfaí cuimhne fhisiciúil a mhapáil dó 1-go-1, ansin bheadh ​​an chéad phróiseas ag brú suas an RAM ar fad, agus ní bheadh ​​aon chaint ar aon iltascáil.

Mar sin féin, ónár dtaithí tá a fhios againn gur féidir le córais oibriúcháin nua-aimseartha an oiread próiseas agus is mian leo a fheidhmiú ag an am céanna. Tá sé seo indéanta toisc nach leithdháileann siad ach go leor cuimhne ar phróisis ar pháipéar, ach i ndáiríre ní lódálann siad isteach sa phríomhchuimhne fhisiceach ach an chuid sin a bhfuil éileamh uirthi anseo agus anois. Mar sin, tugtar fíorúil ar an gcuimhne a bhaineann le próiseas.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Eagraíonn an córas oibriúcháin cuimhne fhíorúil agus fhisiceach i leathanaigh de mhéid áirithe. Chomh luath agus a bhíonn éileamh ar leathanach áirithe de chuimhne fhíorúil, lódálann an córas oibriúcháin é isteach i gcuimhne fhisiciúil agus meaitseálann sé iad i dtábla speisialta. Mura bhfuil aon sliotán saor in aisce ann, ansin déantar ceann de na leathanaigh a lódaíodh roimhe seo a chóipeáil chuig an diosca, agus glacann an ceann ar a bhfuil éileamh a áit. Babhtáil a thugtar ar an nós imeachta seo, a mbeimid ag filleadh air go luath. Léiríonn an figiúr thíos an próiseas a bhfuil cur síos déanta air. Ar sé, lódaíodh leathanach A le seoladh 0 agus cuireadh ar an bpríomhleathanach cuimhne le seoladh 4 é. Léiríodh é seo sa tábla comhfhreagrais i gcill uimhir 0.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Tá an scéal díreach mar a chéile le comhaid mapáilte chun cuimhne. Go loighciúil, tá siad ceaptha go leanúnach agus go hiomlán lonnaithe sa spás seoladh fíorúil. Mar sin féin, cuireann siad cuimhne fisiciúil leathanach de réir leathanaigh agus ach amháin arna iarraidh sin. Déantar mionathrú ar leathanaigh dá leithéid a shioncronú leis an gcomhad ar diosca. Ar an mbealach seo, is féidir leat comhad I/O a dhéanamh trí oibriú go simplí le bearta sa chuimhne - aistreofar gach athrú go huathoibríoch ag eithne an chórais oibriúcháin go dtí an comhad foinse.

Léiríonn an íomhá thíos conas a shioncrónaíonn LMDB a staid agus é ag obair leis an mbunachar sonraí ó phróisis éagsúla. Trí chuimhne fhíorúil próisis éagsúla a mhapáil chuig an gcomhad céanna, cuirimid iallach de facto ar an gcóras oibriúcháin bloic áirithe dá spásanna seoltaí a shioncronú go haistrithe lena chéile, áit a bhféachann LMDB.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Gné thábhachtach eile is ea go ndéanann LMDB, de réir réamhshocraithe, an comhad sonraí a mhodhnú trí mheicníocht glaonna an chórais scríobh, agus go dtaispeánann sé an comhad féin i mód inléite amháin. Tá dhá iarmhairt thábhachtacha ag an gcur chuige seo.

Baineann an chéad iarmhairt le gach córas oibriúcháin. Is é a bunúsach ná cosaint a chur ar dhamáiste neamhbheartaithe don bhunachar sonraí trí chód mícheart. Mar is eol duit, tá treoracha inrite próiseas saor chun rochtain a fháil ar shonraí ó áit ar bith ina spás seoltaí. Ag an am céanna, mar a chuimhnigh muid díreach, má thaispeánann tú comhad i mód léite-scríofa, is féidir le haon teagasc é a mhodhnú freisin. Má dhéanann sí é seo trí dhearmad, ag iarraidh, mar shampla, eilimint eagar a fhorscríobh i ndáiríre ag innéacs nach bhfuil ann, is féidir léi an comhad mapáilte go dtí an seoladh seo a athrú de thaisme, rud a fhágfaidh éilliú sa bhunachar sonraí. Má thaispeánfar an comhad i mód inléite amháin, ansin má dhéantar iarracht an spás seoltaí comhfhreagrach a athrú cuirfear deireadh éigeandála den chlár le comhartha SIGSEGV, agus fanfaidh an comhad slán.

Tá an dara iarmhairt sainiúil do iOS cheana féin. Ní luann an t-údar ná aon fhoinsí eile go sainráite é, ach gan é ní bheadh ​​LMDB oiriúnach le feidhmiú ar an gcóras oibriúcháin soghluaiste seo. Tá an chéad chuid eile dírithe ar a bhreithniú.

Sonraí na gcomhad cuimhne-mhapáilte i iOS

Bhí tuairisc iontach ag WWDC in 2018 "IOS Cuimhne Léim go domhain". Insíonn sé dúinn go bhfuil gach leathanach atá suite i gcuimhne fhisiciúil ar iOS ar cheann de 3 chineál: salach, comhbhrúite agus glan.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Is éard is cuimhne ghlan ann ná bailiúchán de leathanaigh ar féidir iad a dhíluchtú gan phian ón gcuimhne fhisiciúil. Is féidir na sonraí atá iontu a athlódáil de réir mar is gá óna bhfoinsí bunaidh. Tá comhaid inléite amháin le mapáil chuimhne sa chatagóir seo. níl eagla ar iOS na leathanaigh atá mapáilte a dhíluchtú go comhad ón gcuimhne ag am ar bith, ós rud é go bhfuil ráthaíocht orthu a bheith sioncronaithe leis an gcomhad ar diosca.

Tá cuimhne shalach ar gach leathanach modhnaithe, is cuma cá raibh siad lonnaithe ar dtús. Go háirithe, déanfar comhaid chuimhne-mhapáilte arna modhnú trí scríobh chuig an gcuimhne fhíorúil a bhaineann leo a rangú ar an mbealach seo. Oscailt LMDB le bratach MDB_WRITEMAP, tar éis duit athruithe a dhéanamh air, is féidir leat é seo a fhíorú go pearsanta

​A luaithe a thosaíonn feidhmchlár ag glacadh an iomarca cuimhne fhisiciúil, cuireann iOS faoi réir comhbhrú leathanach salach é. Is ionann an chuimhne iomlán atá á áitiú ag leathanaigh shalach agus chomhbhrúite agus lorg cuimhne an fheidhmchláir mar a thugtar air. Nuair a shroicheann sé luach tairsí áirithe, tagann deamhan córas killer OOM tar éis an phróisis agus cuireann sé deireadh leis go héigeantach. Is é seo an peculiarity iOS i gcomparáid le córais oibriúcháin deisce. I gcodarsnacht leis sin, ní chuirtear an lorg cuimhne a laghdú trí leathanaigh a mhalartú ó chuimhne fhisiciúil go diosca ar fáil in iOS. Ní féidir ach na cúiseanna a thomhas B'fhéidir go bhfuil an nós imeachta chun leathanaigh a bhogadh go dian go diosca agus ar ais ró-íditheach ar fhuinneamh do ghléasanna soghluaiste, nó sábhálann iOS an acmhainn chun cealla a athscríobh ar thiomáineann SSD, nó b'fhéidir nach raibh na dearthóirí sásta le feidhmíocht fhoriomlán an chórais, áit a bhfuil gach rud. shíor-mhalartaithe. Bíodh sin mar atá, is fíoras fós é.

Is é an dea-scéal, a luadh cheana féin, ná nach n-úsáideann LMDB de réir réamhshocraithe an meicníocht mmap chun comhaid a nuashonrú. Ciallaíonn sé seo go bhfuil na sonraí ar taispeáint rangaithe ag iOS mar chuimhne glan agus nach gcuireann siad le lorg cuimhne. Is féidir leat é seo a fhíorú ag baint úsáide as uirlis Xcode ar a dtugtar VM Tracker. Taispeánann an scáileán thíos staid chuimhne fhíorúil iOS an fheidhmchláir Cloud le linn oibriú. Ag an tús, cuireadh tús le 2 chás LMDB ann. Ceadaíodh an chéad cheann a chomhad a thaispeáint ar 1GiB de chuimhne fíorúil, an dara ceann - 512MiB. In ainneoin go n-áitíonn an dá stóráil méid áirithe de chuimhne cónaitheach, ní chuireann ceachtar acu méid salach.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Agus anois tá sé in am don drochscéal. A bhuí leis an meicníocht babhtála i gcórais oibriúcháin deisce 64-giotán, is féidir le gach próiseas an oiread spáis seoltaí fíorúil a áitiú agus a cheadaíonn an spás diosca crua saor in aisce dá bhabhtáil féideartha. Laghdaítear go mór an t-uasmhéid teoiriciúil má chuirtear comhbhrú in ionad babhtála i iOS. Anois caithfidh gach próiseas maireachtála luí isteach sa phríomhchuimhne (léamh RAM), agus ní mór iallach a chur ar gach duine nach n-oireann deireadh a chur leis. Luaitear é seo mar a luaitear thuas tuarascáilagus i doiciméadú oifigiúil. Mar thoradh air sin, cuireann iOS teorainn mhór ar an méid cuimhne atá ar fáil le leithdháileadh trí mmap. Anseo anseo Is féidir leat breathnú ar na teorainneacha eimpíreacha ar an méid cuimhne a d'fhéadfaí a leithdháileadh ar ghléasanna éagsúla ag baint úsáide as an nglao córais seo. Ar na samhlacha smartphone is nua-aimseartha, tá iOS tar éis éirí flaithiúil ag 2 ghigibheart, agus ar na leaganacha barr den iPad - faoi 4. Go praiticiúil, ar ndóigh, caithfidh tú díriú ar na samhlacha gléas is ísle le tacaíocht, áit a bhfuil gach rud an-brónach. Níos measa fós, trí bhreathnú ar staid chuimhne an fheidhmchláir i VM Tracker, gheobhaidh tú amach go bhfuil LMDB i bhfad ón t-aon cheann a mhaíonn go bhfuil cuimhne aige. Itheann na leithdháilteoirí córais, comhaid acmhainne, creataí íomhá agus creachadóirí beaga eile smuillí maithe.

Bunaithe ar thorthaí turgnaimh sa Cloud, thángamar ar na luachanna comhréitigh seo a leanas don chuimhne a leithdháileadh ag LMDB: 384 meigeavata le haghaidh feistí 32-giotán agus 768 le haghaidh feistí 64-giotán. Tar éis an méid seo a bheith ídithe, tosaíonn aon oibríochtaí modhnúcháin ag críochnú leis an gcód MDB_MAP_FULL. Breathnaímid ar na hearráidí sin inár monatóireacht, ach tá siad beag go leor gur féidir faillí a dhéanamh orthu ag an bpointe seo.

Is féidir le hidirbhearta fadsaoil a bheith mar chúis neamhshoiléir le tomhaltas cuimhne iomarcach ag an stóráil. Chun tuiscint a fháil ar an nasc idir an dá fheiniméin seo, cabhrófar linn trí bhreithniú a dhéanamh ar an dá cholún eile den LMDB.

3.2. Míol Mór #2. B+-crann

Chun táblaí a aithris ar bharr stór eochairluacha, ní mór na hoibríochtaí seo a leanas a bheith i láthair ina API:

  1. Gné nua a chur isteach.
  2. Cuardaigh eilimint le heochair ar leith.
  3. Gné a bhaint.
  4. Atriail thar eatraimh eochracha san ord ina bhfuil siad curtha in eagar.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOSIs crann cuardaigh dénártha é an struchtúr sonraí is simplí ar féidir leis na ceithre oibríocht go léir a chur i bhfeidhm go héasca. Léiríonn gach ceann dá nóid eochair a roinneann an fothacar iomlán d’eochracha leanaí ina dhá fhochrainn. Ar an taobh clé tá na cinn atá níos lú ná an tuismitheoir, agus tá na cinn atá níos mó sa cheann ar dheis. Baintear amach sraith ordaithe eochracha a fháil trí cheann de na trasbhealaí crann clasaiceach

Tá dhá locht bunúsacha ag crainn dhénártha a chuireann cosc ​​​​orthu a bheith éifeachtach mar struchtúr sonraí diosca-bhunaithe. Ar an gcéad dul síos, ní féidir méid a gcothromaíocht a thuar. Tá baol mór ann go bhfaighfear crainn inar féidir airde na mbrainsí éagsúla a bheith éagsúil go mór, rud a mhéadaíonn go mór castacht algartamaíoch an chuardaigh i gcomparáid leis an méid a bhfuiltear ag súil leis. Ar an dara dul síos, mar gheall ar an iliomad tras-naisc idir nóid, baintear na crainn dhénártha den cheantar sa chuimhne. Mar thoradh air sin, d'fhéadfadh go mbeadh gá le cuairt a thabhairt ar líon inchomparáide leathanach fiú le trasnú simplí ar roinnt nóid chomharsanachta i gcrann. Is fadhb é seo fiú nuair a dhéanaimid labhairt faoi éifeachtacht chrainn dhénártha mar struchtúr sonraí in-chuimhne, ós rud é nach pléisiúr saor é leathanaigh a rothlú i gcónaí i dtaisce an phróiseálaí. Nuair a thagann sé chun leathanaigh a bhaineann le nóid a aisghabháil ón diosca go minic, éiríonn an scéal go hiomlán truamhéalach.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOSRéitíonn B-crainn, mar éabhlóid de chrainn dhénártha, na fadhbanna a aithníodh sa mhír roimhe seo. Ar an gcéad dul síos, tá siad féin-chothromaithe. Ar an dara dul síos, scoilteann gach ceann dá nóid an tsraith eochracha leanaí ní i 2, ach i bhfo-thacair ordaithe M, agus is féidir leis an uimhir M a bheith sách mór, ar ord na gcéadta, nó fiú na mílte.

Mar sin:

  1. Tá líon mór eochracha atá ordaithe cheana féin i ngach nód agus tá na crainn an-ghearr.
  2. Faigheann an crann seilbh na háite mar chuimhne, ós rud é go bhfuil eochracha atá gar dá luach suite go nádúrtha in aice lena chéile ar na nóid chéanna nó in aice láimhe.
  3. Laghdaítear líon na nóid idirthurais nuair a thagann crann síos le linn oibríocht chuardaigh.
  4. Laghdaítear líon na nóid sprice a léitear le linn fiosrúcháin raoin, ós rud é go bhfuil líon mór eochracha ordaithe i ngach ceann acu cheana féin.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Úsáideann LMDB athrú ar an gcrann B ar a dtugtar crann B+ chun sonraí a stóráil. Taispeánann an léaráid thuas na trí chineál nóid atá ann:

  1. Ag an mbarr tá an fhréamh. Ní bhaineann sé le hábhar ach coincheap bunachar sonraí laistigh de stóras. Laistigh de chás LMDB amháin, is féidir leat roinnt bunachair shonraí a chruthú a roinneann spás seoltaí fíorúla mapáilte. Tosaíonn gach ceann acu óna fhréamh féin.
  2. Ag an leibhéal is ísle tá na duilleoga. Tá na péirí eochairluacha atá stóráilte sa bhunachar sonraí iontu agus acu sin amháin. Dála an scéil, is é seo an peculiarity de B+-crainn. Má stórálann crann B rialta páirteanna i nóid de gach leibhéal, ansin níl an t-athrú B+ ach ag an gceann is ísle. Tar éis dúinn an méid sin a shocrú, is crann B amháin a thabharfaimid ar fhochineál an chrainn a úsáidtear in LMDB.
  3. Idir an fhréamh agus na duilleoga tá 0 nó níos mó leibhéal teicniúil le nóid loingseoireachta (brainse). Is é an tasc atá acu ná an tacar sórtáilte eochracha a roinnt idir na duilleoga.

Go fisiciúil, is bloic cuimhne iad nóid ar fhad réamhshocraithe. Is iolraí de mhéid na leathanach cuimhne sa chóras oibriúcháin é a méid, rud a phléamar thuas. Taispeántar struchtúr an nód thíos. Tá meiteaisnéis sa cheanntásc, agus is é an tseic is follasaí mar shampla. Ar aghaidh tagann faisnéis faoi na fritháirimh ina bhfuil na cealla le sonraí suite. Féadfaidh na sonraí a bheith ina n-eochracha, má táimid ag caint faoi nóid loingseoireachta, nó péirí eochairluacha ar fad i gcás duilleoga. Is féidir leat tuilleadh a léamh faoi struchtúr na leathanaigh san obair "Meastóireacht ar Stórais Ardluacha Ardfheidhmíochta".

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Tar éis déileáil le hábhar inmheánach nóid leathanaigh, déanfaimid tuilleadh ionadaíochta ar an B-crann LMDB ar bhealach simplithe san fhoirm seo a leanas.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Tá leathanaigh le nóid suite go seicheamhach ar dhiosca. Tá leathanaigh níos airde uimhrithe suite i dtreo dheireadh an chomhaid. Tá faisnéis ar an leathanach meta mar a thugtar air faoi na fritháirimh trína bhféadfar fréamhacha na gcrann go léir a fháil. Nuair a bhíonn comhad á oscailt, déanann LMDB an comhad a scanadh leathanach de réir leathanaigh ó thús deireadh agus é ar thóir meite-leathanach bailí agus aimsíonn sé bunachair shonraí atá ann cheana féin.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Anois, agus smaoineamh againn ar struchtúr loighciúil agus fisiceach na heagraíochta sonraí, is féidir linn bogadh ar aghaidh chun an tríú colún de LMDB a mheas. Is lena chabhair a tharlaíonn gach modhnú stórála go hidirbheartach agus ina n-aonar óna chéile, rud a thugann maoin iolrachais don bhunachar sonraí ina iomláine.

3.3. Míol Mór #3. Cóipeáil-ar-scríobh

Baineann roinnt oibríochtaí crann-B le sraith athruithe a dhéanamh ar a nóid. Sampla amháin is ea eochair nua a chur le nód a bhfuil a acmhainn uasta bainte amach aige cheana féin. Sa chás seo, is gá, ar an gcéad dul síos, an nód a roinnt ina dhá, agus ar an dara dul síos, nasc a chur leis an nód nua linbh ina thuismitheoir. D’fhéadfadh an nós imeachta seo a bheith an-chontúirteach. Más rud é ar chúis éigin (timpiste, briseadh cumhachta, etc.) nach dtarlaíonn ach cuid de na hathruithe ón tsraith, ansin fanfaidh an crann i stát neamhréireach.

Réiteach traidisiúnta amháin chun bunachar sonraí locht-fhulangach a dhéanamh ná struchtúr sonraí breise ar an diosca a chur leis in aice leis an gcrann B - loga idirbhirt, ar a dtugtar loga réamhscríobh (WAL) freisin. Is comhad é a bhfuil an oibríocht atá beartaithe scríofa go docht ag an deireadh sula modhnaítear an B-crann féin. Mar sin, má aimsítear éilliú sonraí le linn féin-dhiagnóisithe, téann an bunachar sonraí i gcomhairle leis an logáil chun é féin a chur in ord.

Tá modh difriúil roghnaithe ag LMDB mar mheicníocht lamháltais locht, ar a dtugtar cóip-ar-scríobh. Is é an bunús atá leis ná in ionad sonraí a nuashonrú ar leathanach atá ann cheana féin, déanann sé é a chóipeáil go hiomlán ar dtús agus déanann sé gach modhnú ar an gcóip.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Ansin, le go mbeidh na sonraí nuashonraithe ar fáil, is gá an nasc chuig an nód atá anois ina mháthairnód a athrú. Ós rud é gur gá é a mhodhnú chuige seo freisin, déantar é a chóipeáil roimh ré freisin. Leanann an próiseas athchúrsach léir ar an mbealach go dtí an fhréamh. Is é an rud deireanach le hathrú ná na sonraí ar an meitealeathanach

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Más rud é go tobann tuairteanna an próiseas le linn an nós imeachta nuashonraithe, ní bheidh ceachtar meitealeathanach nua a chruthú, nó ní bheidh sé a scríobh chuig diosca go hiomlán, agus beidh a sheiceála a bheith mícheart. I gceachtar den dá chás seo, ní bheidh aon tionchar ar leathanaigh nua, ach ní bheidh aon tionchar ar na seanchinn. Cuireann sé seo deireadh leis an ngá atá le LMDB logáil a scríobh chun tosaigh chun comhsheasmhacht sonraí a choinneáil. De facto, glacann struchtúr na stórála sonraí ar an diosca a thuairiscítear thuas a fheidhm ag an am céanna. Tá easpa loga idirbhearta sainráite ar cheann de na gnéithe de LMDB a sholáthraíonn luas ard léitheoireachta sonraí

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Soláthraíonn an dearadh mar thoradh air, ar a dtugtar B-crann aguisín amháin, aonrú idirbheartaíochta agus illeaganacha go nádúrtha. In LMDB, tá baint ag gach idirbheart oscailte leis an bhfréamh crann atá ábhartha faoi láthair. Go dtí go mbeidh an t-idirbheart críochnaithe, ní athrófar ná ní athúsáidfear leathanaigh an chrainn a bhaineann leis le haghaidh leaganacha nua de na sonraí. Mar sin, is féidir leat oibriú chomh fada agus is mian leat leis an tacar sonraí go beacht a bhí ábhartha ag an am Osclaíodh an t-idirbheart, fiú má leanann an stóráil a nuashonrú go gníomhach ag an am seo. Is é seo an croílár multiversion, a dhéanamh LMDB foinse sonraí idéalach le haghaidh ár beloved UICollectionView. Tar éis idirbheart a oscailt, ní gá lorg cuimhne an fheidhmchláir a mhéadú trí shonraí reatha a phumpáil amach go pras i struchtúr cuimhneacháin éigin, ar eagla nach bhfágfar aon rud ar bith. Déanann an ghné seo idirdhealú idir LMDB agus an SQLite céanna, nach féidir a bheith bródúil as an leithlisiú iomlán sin. Tar éis dhá idirbheart a oscailt sa dara ceann agus taifead áirithe a scriosadh laistigh de cheann amháin acu, ní bheidh sé indéanta an taifead céanna a fháil a thuilleadh laistigh den dara ceann atá fágtha.

Is é an taobh smeach den bhoinn an tomhaltas a d’fhéadfadh a bheith i bhfad níos airde de chuimhne fhíorúil. Taispeánann an sleamhnán an chuma a bheidh ar struchtúr an bhunachair sonraí má athraítear é go comhuaineach le 3 idirbheart léite oscailte ag féachaint ar leaganacha éagsúla den bhunachar sonraí. Ós rud é nach féidir le LMDB nóid atá insroichte ó fhréamhacha a bhaineann le hidirbhearta reatha a athúsáid, níl aon rogha ag an siopa ach an ceathrú fréamh eile a leithdháileadh sa chuimhne agus na leathanaigh leasaithe faoi a chlónáil arís.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Bheadh ​​sé úsáideach an rannán ar chomhaid atá léarscáilithe le cuimhne a thabhairt chun cuimhne anseo. Dealraíonn sé nár cheart go gcuirfeadh tomhaltas breise cuimhne fhíorúil mórán imní orainn, ós rud é nach gcuireann sé le lorg cuimhne an fheidhmchláir. Ag an am céanna, áfach, tugadh faoi deara go bhfuil iOS an-ghéar maidir lena leithdháileadh, agus ní féidir linn, cosúil le freastalaí nó deasc, réigiún LMDB de 1 terabyte a sholáthar agus gan smaoineamh ar an ngné seo ar chor ar bith. Más féidir, ba cheart duit iarracht a dhéanamh saolré na n-idirbheart a dhéanamh chomh gearr agus is féidir.

4. Scéimre sonraí a dhearadh ar bharr an API eochairluacha

Cuirimis tús lenár n-anailís API trí bhreathnú ar na hastarraingtí bunúsacha a sholáthraíonn LMDB: comhshaol agus bunachair shonraí, eochracha agus luachanna, idirbhearta agus cúrsóirí.

Nóta faoi liostaí cód

Tugann gach feidhm san API LMDB poiblí toradh a gcuid oibre ar ais i bhfoirm cód earráide, ach i ngach liostaí ina dhiaidh sin fágtar a fhíorú ar lár ar mhaithe le gairid. forc C++ cumhdaigh lmdbxx, ina ndéantar earráidí mar eisceachtaí C++.

Mar an bealach is tapúla chun LMDB a nascadh le tionscadal le haghaidh iOS nó macOS, molaim mo CocoaPod POSLMDB.

4.1. Astarraingtí bunúsacha

Timpeallacht

Struchtúr MDB_env is stór de staid inmheánach an LMDB. Teaghlach feidhme réamhshocrú mdb_env ligeann duit cuid dá n-airíonna a chumrú. Sa chás is simplí, tá cuma mar seo ar thúsú inneall.

mdb_env_create(env);​
mdb_env_set_map_size(*env, 1024 * 1024 * 512)​
mdb_env_open(*env, path.UTF8String, MDB_NOTLS, 0664);

In iarratas Mail.ru Cloud, d'athraigh muid na luachanna réamhshocraithe ach dhá pharaiméadar.

Is é an chéad cheann méid an spáis seoltaí fíorúil a bhfuil an comhad stórála mapáilte dó. Ar an drochuair, fiú ar an bhfeiste céanna, is féidir leis an luach sonrach a bheith éagsúil go mór ó rith go rith. Chun an ghné seo de iOS a chur san áireamh, roghnaítear an t-uasmhéid stórála go dinimiciúil. Ag tosú ó luach áirithe, déantar é a leath go seicheamhach go dtí an fheidhm mdb_env_open ní thabharfaidh sé ar ais toradh difriúil ó ENOMEM. Go teoiriciúil, tá a mhalairt ar fad ann freisin - an chéad íosmhéid cuimhne a leithdháileadh ar an inneall, agus ansin, nuair a fhaightear earráidí, MDB_MAP_FULL, é a mhéadú. Mar sin féin, tá sé i bhfad níos déine. Is é an chúis go bhfuil an nós imeachta chun ath-leithdháileadh cuimhne (remap) ag baint úsáide as an fheidhm mdb_env_set_map_size neamhbhailíochtaíonn sé gach aonán (cúrsóirí, idirbheart, eochracha agus luachanna) a fuarthas roimhe seo ón inneall. Má chuirtear an t-imeacht seo san áireamh sa chód, beidh sé ina chasta go mór. Más rud é, áfach, go bhfuil cuimhne fhíorúil an-tábhachtach duit, d'fhéadfadh sé seo a bheith ina chúis le breathnú níos géire ar an bhforc atá imithe i bhfad ar aghaidh MDBX, áit a bhfuil “coigeartú uathoibríoch ar mhéid an bhunachair sonraí ar an eitilt” i measc na ngnéithe a fógraíodh.

Is é an dara paraiméadar, nach raibh a luach réamhshocraithe oiriúnach dúinn, a rialaíonn na meicníochtaí chun sábháilteacht snáithe a chinntiú. Ar an drochuair, tá fadhbanna ag iOS 10 ar a laghad le tacaíocht do stóráil áitiúil snáithe. Ar an gcúis seo, sa sampla thuas, osclaítear an stór leis an bratach MDB_NOTLS. Chomh maith leis seo, bhí sé riachtanach freisin forc C++ fillteán lmdbxxchun athróga a ghearradh amach leis an tréith seo agus inti.

Bunachair Sonraí

Is sampla crann B ar leith é an bunachar sonraí, rud a phléamar thuas. Tarlaíonn a oscailt taobh istigh d'idirbheart, rud a d'fhéadfadh cuma beagán aisteach ar dtús.

MDB_txn *txn;​
MDB_dbi dbi;​
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);​
mdb_dbi_open(txn, NULL, MDB_CREATE, &dbi);​
mdb_txn_abort(txn);

Go deimhin, is aonán stórála é idirbheart LMDB, ní eintiteas sonrach bunachair shonraí. Ligeann an coincheap seo duit oibríochtaí adamhach a dhéanamh ar eintitis atá lonnaithe i mbunachair shonraí éagsúla. Go teoiriciúil, osclaíonn sé seo an fhéidearthacht táblaí a shamhaltú i bhfoirm bunachair shonraí éagsúla, ach ag aon am amháin ghlac mé cosán difriúil, a thuairiscítear go mion thíos.

Eochracha agus luachanna

Struchtúr MDB_val múnlaí coincheap an eochair agus an luacha araon. Níl aon smaoineamh ag an stór faoina shéimeantaic. Maidir léi, níl i rud éigin eile ach sraith beart de mhéid áirithe. Is é 512 beart uasmhéid na heochrach.

typedef struct MDB_val {​
    size_t mv_size;​
    void *mv_data;​
} MDB_val;​​

Ag baint úsáide as comparadóir, déanann an siopa na heochracha a shórtáil in ord ardaitheach. Mura gcuireann tú do cheann féin ina ionad, bainfear úsáid as an gceann réamhshocraithe, a shórtáilfear beart-ar-beart in ord foclóireachta.

Idirbhearta

Déantar cur síos mionsonraithe ar an struchtúr idirbhirt i chaibidil roimhe seo, mar sin anseo déanfaidh mé a bpríomh-airíonna arís go hachomair:

  1. Tacaíonn gach bun-airíonna Aigéad: adamhacht, comhsheasmhacht, leithlisiú agus iontaofacht. Ní féidir liom cabhrú ach a thabhairt faoi deara go bhfuil fabht i dtéarmaí marthanachta ar macOS agus iOS a socraíodh in MDBX. Is féidir leat níos mó a léamh ina gcuid README.
  2. Déanann an scéim “scríbhneoir aonair / léitheoirí iolracha” cur síos ar an gcur chuige i leith il-snáithe. Cuireann scríbhneoirí bac ar a chéile, ach ná bac le léitheoirí. Ní bhacann léitheoirí le scríbhneoirí ná lena chéile.
  3. Tacaíocht le haghaidh idirbhearta neadaithe.
  4. Tacaíocht iolraithe.

Tá iolrachas i LMDB chomh maith sin gur mhaith liom é a léiriú i ngníomh. Ón gcód thíos is féidir leat a fheiceáil go n-oibríonn gach idirbheart go díreach leis an leagan den bhunachar sonraí a bhí ann faoi láthair nuair a osclaíodh é, agus é scoite amach go hiomlán ó gach athrú ina dhiaidh sin. Ní hionann an stóráil a thosú agus taifead tástála a chur leis, rud ar bith suimiúil, mar sin fágtar na deasghnátha seo faoin spoiler.

Ag cur iontráil tástála leis

MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;

mdb_env_create(&env);
mdb_env_open(env, "./testdb", MDB_NOTLS, 0664);

mdb_txn_begin(env, NULL, 0, &txn);
mdb_dbi_open(txn, NULL, 0, &dbi);
mdb_txn_abort(txn);

char k = 'k';
MDB_val key;
key.mv_size = sizeof(k);
key.mv_data = (void *)&k;

int v = 997;
MDB_val value;
value.mv_size = sizeof(v);
value.mv_data = (void *)&v;

mdb_txn_begin(env, NULL, 0, &txn);
mdb_put(txn, dbi, &key, &value, MDB_NOOVERWRITE);
mdb_txn_commit(txn);

MDB_txn *txn1, *txn2, *txn3;
MDB_val val;

// Открываем 2 транзакции, каждая из которых смотрит
// на версию базы данных с одной записью.
mdb_txn_begin(env, NULL, 0, &txn1); // read-write
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn2); // read-only

// В рамках первой транзакции удаляем из базы данных существующую в ней запись.
mdb_del(txn1, dbi, &key, NULL);
// Фиксируем удаление.
mdb_txn_commit(txn1);

// Открываем третью транзакцию, которая смотрит на
// актуальную версию базы данных, где записи уже нет.
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn3);
// Убеждаемся, что запись по искомому ключу уже не существует.
assert(mdb_get(txn3, dbi, &key, &val) == MDB_NOTFOUND);
// Завершаем транзакцию.
mdb_txn_abort(txn3);

// Убеждаемся, что в рамках второй транзакции, открытой на момент
// существования записи в базе данных, её всё ещё можно найти по ключу.
assert(mdb_get(txn2, dbi, &key, &val) == MDB_SUCCESS);
// Проверяем, что по ключу получен не абы какой мусор, а валидные данные.
assert(*(int *)val.mv_data == 997);
// Завершаем транзакцию, работающей хоть и с устаревшей, но консистентной базой данных.
mdb_txn_abort(txn2);

Molaim duit an cleas céanna a thriail le SQLite agus féachaint cad a tharlaíonn.

Tugann Multiversion buntáistí an-deas do shaol an fhorbróra iOS. Ag baint úsáide as an maoin seo, is féidir leat ráta nuashonraithe na foinse sonraí le haghaidh foirmeacha scáileáin a choigeartú go héasca agus go nádúrtha, bunaithe ar bhreithnithe taithí úsáideora. Mar shampla, déanaimis gné den fheidhmchlár Mail.ru Cloud a ghlacadh mar ábhar a uathlódáil ó ghailearaí meán an chórais. Le nasc maith, tá an cliant in ann roinnt grianghraif in aghaidh an tsoicind a chur leis an bhfreastalaí. Má nuashonraíonn tú tar éis gach íoslódáil UICollectionView le hábhar meáin i scamall an úsáideora, is féidir leat dearmad a dhéanamh ar thart ar 60 fps agus scrollaigh réidh le linn an phróisis seo. Chun nuashonruithe scáileáin rialta a chosc, ní mór duit teorainn a chur ar bhealach éigin ar an ráta a n-athraíonn sonraí sa bhun UICollectionViewDataSource.

Mura dtacaíonn an bunachar sonraí leis an iolrachas agus mura gceadaíonn sé duit oibriú ach leis an staid reatha atá ann faoi láthair, ansin chun pictiúr ama-cobhsaí a chruthú de na sonraí is gá duit é a chóipeáil chuig struchtúr sonraí i gcuimhne nó chuig tábla sealadach. Tá aon cheann de na cineálacha cur chuige seo an-chostasach. I gcás stórála cuimhne, faigheann muid costais ó thaobh cuimhne de, de bharr rudaí tógtha a stóráil, agus in am, a bhaineann le trasfhoirmiúcháin iomarcacha ORM. Maidir leis an tábla sealadach, is pléisiúr níos costasaí é seo, rud a fhágann nach bhfuil ciall leis ach i gcásanna neamhfhánacha.

Réitíonn réiteach iolraithe LMDB an fhadhb a bhaineann le foinse sonraí cobhsaí a chothabháil ar bhealach an-ghalánta. Is leor idirbheart agus voila a oscailt - go dtí go gcuirfimid é i gcrích, tá ráthaíocht ann go mbeidh an tacar sonraí socraithe. Tá an loighic dá luas nuashonraithe go hiomlán i lámha na sraithe cur i láthair anois, gan aon forchostas ar acmhainní suntasacha.

Cúrsóirímóra

Soláthraíonn cúrsóirí meicníocht le haghaidh atriallta ordúil thar péirí eochairluacha trí thrasnú B-crann. Gan iad, bheadh ​​sé dodhéanta na táblaí sa bhunachar sonraí a shamhaltú go héifeachtach, ar a dtugaimid anois.

4.2. Samhaltú Tábla

Ligeann an t-airí atá ag eochair-ordú duit astarraingt ardleibhéil a dhéanamh mar tábla ar bharr na n-astarraingtí bunúsacha. Déanaimis an próiseas seo a mheas ag baint úsáide as an sampla de phríomhthábla cliant néil, a thaisceann faisnéis faoi chomhaid agus fillteáin uile an úsáideora.

Scéimre tábla

Ar cheann de na cásanna coitianta ar cheart struchtúr tábla agus crann fillteáin a chur in oiriúint dó is ea roghnú na n-eilimintí go léir atá suite laistigh d’eolaire ar leith. Liosta Cóngarachta. Chun é a chur i bhfeidhm ar bharr an stórais eochairluacha, is gá eochracha na gcomhad agus na bhfillteán a shórtáil sa chaoi is go ndéantar iad a ghrúpáil bunaithe ar a mballraíocht san eolaire tuismitheoirí. Ina theannta sin, chun ábhar an eolaire a thaispeáint san fhoirm a bhfuil aithne ag úsáideoir Windows air (an chéad fillteáin, ansin comhaid, an dá sórt curtha in ord aibítre), is gá na réimsí breise comhfhreagracha a chur san eochair.

Léiríonn an pictiúr thíos conas, bunaithe ar an tasc atá idir lámha, a d’fhéadfadh a bheith cosúil le léiriú eochracha i bhfoirm eagar beart. Cuirtear na bearta le haitheantóir an eolaire tuismitheora (dearg) ar dtús, ansin leis an gcineál (glas) agus san eireaball leis an ainm (gorm). modh riachtanach. Trí eochracha a thrasnú go seicheamhach leis an réimír dearg céanna tugann sé a luachanna gaolmhara dúinn san ord ba cheart iad a thaispeáint sa chomhéadan úsáideora (ar dheis), gan aon iar-phróiseáil bhreise a cheangal.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Eochracha agus Luachanna a Shraithniú

Tá go leor modhanna chun rudaí a serializing invented ar fud an domhain. Ós rud é nach raibh aon riachtanas eile againn seachas luas, roghnaigh muid an ceann is tapúla a d'fhéadfadh a bheith againn - dumpáil den chuimhne a bhí á áitiú ag sampla de struchtúr teanga C. Mar sin, is féidir eochair eilimint eolaire a mhúnlú leis an struchtúr seo a leanas NodeKey.

typedef struct NodeKey {​
    EntityId parentId;​
    uint8_t type;​
    uint8_t nameBuffer[256];​
} NodeKey;

Sabháil NodeKey i stóráil ag teastáil i réad MDB_val seasamh an pointeoir sonraí chuig seoladh tús an struchtúir, agus ríomh a mhéid leis an bhfeidhm sizeof.

MDB_val serialize(NodeKey * const key) {
    return MDB_val {
        .mv_size = sizeof(NodeKey),
        .mv_data = (void *)key
    };
}

Sa chéad chaibidil ar chritéir roghnúcháin bunachar sonraí, luaigh mé go mbeadh íoslaghdú leithdháiltí dinimiciúla laistigh d’oibríochtaí CRUD mar fhachtóir roghnúcháin tábhachtach. Cód feidhme serialize léiríonn sé conas i gcás LMDB is féidir iad a sheachaint go hiomlán agus taifid nua á gcur isteach sa bhunachar sonraí. Déantar an t-eagar beart atá ag teacht isteach ón bhfreastalaí a chlaochlú ar dtús i struchtúir chruach, agus ansin déantar iad a dhumpáil go fánach isteach sa stóráil. Ag cur san áireamh nach bhfuil aon leithdháiltí dinimiciúla taobh istigh de LMDB freisin, is féidir leat staid iontach a fháil de réir caighdeáin iOS - bain úsáid as cuimhne cruachta amháin chun oibriú le sonraí ar feadh an chosáin iomlán ón líonra go dtí an diosca!

Eochracha a ordú le comparáideoir dénártha

Sonraítear an gaol eochair-ord le feidhm speisialta ar a dtugtar comparadóir. Ós rud é nach bhfuil aon rud ar eolas ag an inneall faoi shéimeantaic na mbeart atá iontu, níl aon rogha ag an gcomparadóir réamhshocraithe ach na heochracha a shocrú in ord foclóireachta, ag dul i muinín comparáide beart-ar-beart. Is ionann é a úsáid chun struchtúir a eagrú agus bearrtha le tua gearrtha. Mar sin féin, i gcásanna simplí is dóigh liom go bhfuil an modh seo inghlactha. Déantar cur síos ar an rogha eile thíos, ach anseo tabharfaidh mé faoi deara cúpla rácaí scaipthe ar an gcosán seo.

Is é an chéad rud atá le cuimhneamh ná léiriú cuimhne ar chineálacha sonraí primitive. Mar sin, ar gach feiste Apple, stóráiltear athróga slánuimhir san fhormáid Endian Beag. Ciallaíonn sé seo go mbeidh an beart is lú suntasaí ar thaobh na láimhe clé, agus ní bheidh sé indéanta slánuimhreacha a shórtáil ag baint úsáide as comparáid beart-ar-beart. Mar shampla, ag iarraidh é seo a dhéanamh le sraith uimhreacha ó 0 go 511 beidh an toradh seo a leanas.

// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)

Chun an fhadhb seo a réiteach, ní mór na slánuimhreacha a stóráil san eochair i bhformáid atá oiriúnach don chomparadóir beart. Cabhróidh feidhmeanna ón teaghlach leat an claochlú riachtanach a dhéanamh hton* (go háirithe htons le haghaidh uimhreacha beart dúbailte ón sampla).

Is é an fhormáid chun teaghráin a léiriú i ríomhchlárú ná, mar is eol duit, ina iomláine Stair. Má thugann semantics na teaghráin, chomh maith leis an ionchódú a úsáidtear chun iad a léiriú sa chuimhne, le fios go bhféadfadh níos mó ná beart amháin in aghaidh an charachtair a bheith ann, ansin is fearr an smaoineamh a thréigean láithreach le comparadóir réamhshocraithe a úsáid.

Is é an dara rud a choinneáil i gcuimhne prionsabail ailínithe tiomsaitheoir réimse struchtúr. Mar gheall orthu, is féidir bytes le luachanna truflais a fhoirmiú i gcuimhne idir réimsí, a bhriseann, ar ndóigh, sórtáil beart-byte. Chun deireadh a chur le truflais, ní mór duit na réimsí a dhearbhú in ord atá sainmhínithe go docht, ag coinneáil na rialacha ailínithe i gcuimhne, nó an tréith sa dearbhú struchtúir a úsáid. packed.

Eochracha a ordú le comparadóir seachtrach

D’fhéadfadh an eochairloighic comparáide a bheith ró-chasta do chomparadóir dénártha. Ceann de na cúiseanna iomadúla is ea láithreacht réimsí teicniúla laistigh de struchtúir. Léireoidh mé a dtarlú ag baint úsáide as an sampla d'eochair le haghaidh eilimint eolaire a bhfuil cur amach againn cheana féin.

typedef struct NodeKey {​
    EntityId parentId;​
    uint8_t type;​
    uint8_t nameBuffer[256];​
} NodeKey;

In ainneoin a simplíochta, i bhformhór mór na gcásanna ídíonn sé an iomarca cuimhne. Tógann an maolán don ainm suas le 256 beart, cé gur annamh a sháraíonn ainmneacha comhaid agus fillteán idir 20-30 carachtar ar an meán.

Ceann de na teicníochtaí caighdeánacha chun méid taifead a bharrfheabhsú ná é a “ghearradh” go dtí an méid iarbhír. Is é a bunúsach ná go ndéantar inneachar na réimsí fad athróg go léir a stóráil i maolán ag deireadh an struchtúir, agus go stóráiltear a gcuid faid in athróga ar leithligh. De réir an chur chuige seo, is é an eochair NodeKey a chlaochlú mar seo a leanas.

typedef struct NodeKey {​
    EntityId parentId;​
    uint8_t type;​
    uint8_t nameLength;​
    uint8_t nameBuffer[256];​
} NodeKey;

Thairis sin, nuair a serializing, nach bhfuil an méid sonraí sonraithe sizeof an struchtúr iomlán, agus tá méid na réimsí uile fad seasta móide méid an chuid a úsáidtear i ndáiríre den mhaolán.

MDB_val serialize(NodeKey * const key) {
    return MDB_val {
        .mv_size = offsetof(NodeKey, nameBuffer) + key->nameLength,
        .mv_data = (void *)key
    };
}

Mar thoradh ar an athmhacrú, fuaireamar coigilteas suntasach sa spás ina raibh eochracha. Mar sin féin, mar gheall ar an réimse teicniúil nameLength, níl an comparadóir dénártha réamhshocraithe oiriúnach a thuilleadh le haghaidh comparáide eochair. Mura gcuirfimid ár gcuid féin ina ionad, ansin beidh fad an ainm mar fhachtóir tosaíochta níos airde sa sórtáil ná an t-ainm féin.

Ceadaíonn LMDB a phríomhfheidhm comparáide féin a bheith ag gach bunachar sonraí. Déantar é seo ag baint úsáide as an fheidhm mdb_set_compare go docht roimh oscailt. Ar chúiseanna soiléire, ní féidir é a athrú le linn shaolré an bhunachair shonraí. Faigheann an comparadóir dhá eochair i bhformáid dhénártha mar ionchur, agus ag an aschur filleann sé an toradh comparáide: níos lú ná (-1), níos mó ná (1) nó cothrom le (0). Pseudocode le haghaidh NodeKey cuma mar sin.

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 // ...
}​

Chomh fada is go bhfuil na heochracha go léir sa bhunachar sonraí den chineál céanna, tá sé dlíthiúil a n-ionadaíocht beart a chaitheamh go neamhchoinníollach le cineál struchtúr eochair an iarratais. Tá nuance amháin anseo, ach pléifear é thíos san fho-alt “Reading Records”.

Luachanna a Shraithniú

Oibríonn LMDB thar a bheith dian le heochracha na dtaifead stóráilte. Tarlaíonn a gcomparáid lena chéile faoi chuimsiú aon oibríochta a chuirtear i bhfeidhm, agus braitheann feidhmíocht an réitigh iomláin ar luas an chomparáideora. I saol idéalach, ba chóir go mbeadh an comparadóir dénártha réamhshocraithe go leor chun eochracha a chur i gcomparáid, ach má bhí ort do chuid féin a úsáid, ba cheart go mbeadh an nós imeachta chun eochracha a dhíscriosú ann chomh tapa agus is féidir.

Níl suim ar leith ag an mbunachar sonraí sa chuid luacha den taifead (luach). Ní tharlaíonn a chomhshó ó léiriú beart go rud ach amháin nuair a éilíonn an cód iarratais cheana féin é, mar shampla, chun é a thaispeáint ar an scáileán. Ós rud é go dtarlaíonn sé seo go hannamh, níl na ceanglais luais don nós imeachta seo chomh ríthábhachtach, agus ina chur i bhfeidhm táimid i bhfad níos saoirse díriú ar áisiúlacht. NSKeyedArchiver.

NSData *data = serialize(object);​
MDB_val value = {​
    .mv_size = data.length,​
    .mv_data = (void *)data.bytes​
};

Mar sin féin, tá amanna ann nuair a bhíonn feidhmíocht fós tábhachtach. Mar shampla, nuair a shábháiltear faisnéis faoi struchtúr comhaid scamall úsáideora, bainimid úsáid as an dumpáil chuimhne chéanna de rudaí. Is é an buaicphointe a bhaineann leis an tasc a bhaineann le léiriú sraitheach díobh a ghiniúint ná go bhfuil gnéithe eolaire múnlaithe ag ordlathas ranganna.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Chun é a chur i bhfeidhm sa teanga C, cuirtear réimsí sonracha na n-oidhrí i struchtúir ar leithligh, agus sonraítear a nasc leis an mbonn amháin trí réimse aontas cineáil. Sonraítear inneachar iarbhír an aontais tríd an gcineál tréith theicniúil.

typedef struct NodeValue {​
    EntityId localId;​
    EntityType type;​
    union {​
        FileInfo file;​
        DirectoryInfo directory;​
    } info;​
    uint8_t nameLength;​
    uint8_t nameBuffer[256];​
} NodeValue;​

Taifid a shuimiú agus a nuashonrú

Is féidir an eochair sraitheach agus an luach a chur leis an siopa. Chun seo a dhéanamh, bain úsáid as an fheidhm mdb_put.

// key и value имеют тип MDB_val​
mdb_put(..., &key, &value, MDB_NOOVERWRITE);

Ag céim na cumraíochta, is féidir an stóráil a cheadú nó a thoirmeasc ó thaifid iolracha a stóráil leis an eochair chéanna.Má tá cosc ​​​​ar dúbailt eochracha, ansin nuair a chuireann tú taifead isteach, is féidir leat a chinneadh an gceadaítear taifead atá ann cheana a nuashonrú nó nach bhfuil. Mura féidir fraying tarlú ach amháin mar thoradh ar earráid sa chód, ansin is féidir leat tú féin a chosaint ó sé ag sonrú an bhratach NOOVERWRITE.

Léamh iontrálacha

Chun taifid i LMDB a léamh, úsáid an fheidhm mdb_get. Má tá an péire eochair-luach léirithe ag struchtúir dumpáilte roimhe seo, ansin is cosúil leis an nós imeachta seo.

NodeValue * const readNode(..., NodeKey * const key) {​
    MDB_val rawKey = serialize(key);​
    MDB_val rawValue;​
    mdb_get(..., &rawKey, &rawValue);​
    return (NodeValue * const)rawValue.mv_data;​
}

Léiríonn an liostú a chuirtear i láthair an chaoi a ligeann sraithiú trí dhumpáil struchtúir duit fáil réidh le leithdháiltí dinimiciúla, ní hamháin agus tú ag scríobh, ach nuair a bhíonn sonraí á léamh. Díorthaithe ó fheidhm mdb_get Breathnaíonn an pointeoir go díreach ar an seoladh cuimhne fíorúil áit a stórálann an bunachar sonraí an beart ionadaíocht ar an réad. Go deimhin, faigheann muid cineál ORM a sholáthraíonn luas léitheoireachta sonraí an-ard beagnach saor in aisce. In ainneoin áilleacht uile an chur chuige, is gá cuimhneamh ar roinnt gnéithe a bhaineann leis.

  1. Maidir le hidirbheart inléite amháin, ráthaítear nach mbeidh an pointeoir don struchtúr luacha bailí go dtí go ndúntar an t-idirbheart. Mar a luadh níos luaithe, níl aon athrú ar na leathanaigh B-crann ar a bhfuil réad suite, a bhuíochas leis an bprionsabal cóip-ar-scríobh, chomh fada agus a dhéantar tagairt dóibh ag idirbheart amháin ar a laghad. Ag an am céanna, chomh luath agus a chríochnaíonn an t-idirbheart deireanach a bhaineann leo, is féidir na leathanaigh a athúsáid le haghaidh sonraí nua. Más gá go n-éireodh le réada an t-idirbheart a ghin iad, ní mór iad a chóipeáil fós.
  2. Maidir le hidirbheart inléite, ní bheidh an pointeoir don struchtúr luacha a bheidh mar thoradh air sin bailí ach go dtí an chéad nós imeachta modhnaithe (sonraí a scríobh nó a scriosadh).
  3. Cé go bhfuil an struchtúr NodeValue gan a bheith lán-chuimsitheach, ach bearrtha (féach an fo-alt “Eochracha a ordú ag baint úsáide as comparadóir seachtrach”), is féidir leat a réimsí a rochtain go sábháilte tríd an bpointeoir. Is é an rud is mó gan dereference é!
  4. Níor cheart in imthosca ar bith an struchtúr a mhodhnú tríd an pointeoir faighte. Ní mór gach athrú a dhéanamh ach amháin tríd an modh mdb_put. Mar sin féin, is cuma cé chomh deacair is mian leat é seo a dhéanamh, ní bheidh sé indéanta, ós rud é go bhfuil an limistéar cuimhne ina bhfuil an struchtúr seo suite mapáilte i mód inléite amháin.
  5. Athmapáil comhad chuig spás seoltaí an phróisis chun, mar shampla, an t-uasmhéid stórála a mhéadú ag baint úsáide as an bhfeidhm mdb_env_set_map_size déanann sé gach idirbheart agus aonán gaolmhar i gcoitinne a neamhbhailíochtú go hiomlán agus treoraíonn sé rudaí áirithe go háirithe.

Mar fhocal scoir, tá gné eile chomh mealltach sin nach luíonn nochtadh a bunúsach in alt eile. Sa chaibidil mar gheall ar an B-crann, thug mé léaráid de conas a leathanaigh eagraithe i gcuimhne. Leanann sé as seo gur féidir le seoladh thús an mhaoláin le sonraí srathaithe a bheith go hiomlán treallach. Mar gheall ar seo, fuair an pointeoir dóibh sa struchtúr MDB_val agus a laghdú go pointeoir le struchtúr, casadh sé amach a bheith neamhailínithe sa chás ginearálta. Ag an am céanna, éilíonn ailtireachtaí roinnt sliseanna (i gcás iOS is é seo armv7) go mbeadh seoladh aon sonraí ina iolraí de mhéid an fhocail meaisín nó, i bhfocail eile, méid giotán an chórais ( le haghaidh armv7 tá sé 32 giotán). I bhfocail eile, oibríocht cosúil le *(int *foo)0x800002 orthu atá comhionann le éalú agus mar thoradh ar fhorghníomhú le fíorasc EXC_ARM_DA_ALIGN. Tá dhá bhealach ann chun cinniúint chomh brónach a sheachaint.

Baineann an chéad cheann leis an réamhchóipeáil sonraí go struchtúr atá ailínithe ar ndóigh. Mar shampla, ar chomparadóir saincheaptha léireofar é seo mar seo a leanas.

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 // ...
}

Bealach eile is ea é a chur in iúl don tiomsaitheoir roimh ré go bhféadfadh sé nach mbeadh struchtúir eochairluacha ailínithe le tréithe aligned(1). Ar ARM is féidir an éifeacht chéanna a bheith agat bhaint amach agus an tréith pacáilte á úsáid. Ag cur san áireamh go gcabhraíonn sé freisin leis an spás atá á áitiú ag an struchtúr a bharrfheabhsú, is cosúil go bhfuil an modh seo níos fearr liom, cé go bhfuil приводит le méadú ar chostas oibríochtaí rochtana sonraí.

typedef struct __attribute__((packed)) NodeKey {
    uint8_t parentId;
    uint8_t type;
    uint8_t nameLength;
    uint8_t nameBuffer[256];
} NodeKey;

Ceisteanna raoin

Chun athrá a dhéanamh ar ghrúpa taifead, soláthraíonn LMDB astarraingt cúrsóra. Breathnaímid ar conas oibriú leis ag baint úsáide as an sampla de thábla le meiteashonraí scamall úsáideora a bhfuil eolas againn cheana féin air.

Mar chuid de liosta comhad a thaispeáint in eolaire, is gá na heochracha go léir a aimsiú a bhfuil baint ag a chuid comhad leanaí agus fillteáin. Sna fo-ailt roimhe seo rinneamar na heochracha a shórtáil NodeKey ionas go n-ordaítear iad go príomha ag ID an eolaire tuismitheoirí. Mar sin, go teicniúil, is é an tasc atá le hábhar fillteán a aisghabháil ná an cúrsóir a chur ar theorainn uachtarach an ghrúpa eochracha le réimír tugtha agus ansin atriall go dtí an teorainn íochtair.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Is féidir an teorainn uachtarach a fháil go díreach trí chuardach seicheamhach. Chun seo a dhéanamh, cuirtear an cúrsóir ag tús liosta iomlán na n-eochracha sa bhunachar sonraí agus déantar é a bhreisiú go dtí go bhfeictear eochair le haitheantóir an eolaire tuismitheora faoina bhun. Tá 2 mhíbhuntáiste soiléir ag an gcur chuige seo:

  1. Castacht cuardaigh líneach, cé gur féidir, mar is eol, i gcrainn go ginearálta agus i gcrann-B go háirithe, é a dhéanamh in am logartamach.
  2. Go neamhbhalbh, déantar gach leathanach roimh an gceann atá á lorg a ardú ón gcomhad go dtí an príomhchuimhne, rud atá thar a bheith costasach.

Go fortunately, soláthraíonn API LMDB bealach éifeachtach chun an cúrsóir a shuíomh ar dtús.Chun seo a dhéanamh, ní mór duit eochair a ghiniúint a bhfuil a luach soiléir níos lú ná nó cothrom leis an eochair atá suite ag teorainn uachtarach an eatraimh. Mar shampla, maidir leis an liosta ar an bhfigiúr thuas, is féidir linn a dhéanamh eochair ina bhfuil an réimse parentId beidh sé comhionann le 2, agus an chuid eile go léir a líonadh le nialais. Soláthraítear eochair páirtlíonta den sórt sin don ionchur feidhme mdb_cursor_get ag léiriú na hoibríochta MDB_SET_RANGE.

NodeKey upperBoundSearchKey = {​
    .parentId = 2,​
    .type = 0,​
    .nameLength = 0​
};​
MDB_val value, key = serialize(upperBoundSearchKey);​
MDB_cursor *cursor;​
mdb_cursor_open(..., &cursor);​
mdb_cursor_get(cursor, &key, &value, MDB_SET_RANGE);

Má aimsítear teorainn uachtarach ghrúpa eochracha, déanaimid atriall thairis air go mbuailfimid nó go mbuaileann an eochair ceann eile parentId, nó ní rithfidh na heochracha amach ar chor ar bith

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​​

Is é an rud atá go deas ná mar chuid den atriall ag baint úsáide as mdb_cursor_get, ní hamháin go bhfaighimid an eochair, ach an luach freisin. Más rud é, chun na coinníollacha samplála a chomhlíonadh, is gá duit na réimsí ón gcuid luach den taifead a sheiceáil, i measc rudaí eile, tá siad inrochtana go leor gan gothaí breise.

4.3. Caidrimh idir táblaí a shamhaltú

Faoin am seo, d'éirigh linn breithniú a dhéanamh ar gach gné de dhearadh agus oibriú le bunachar sonraí aon tábla. Is féidir linn a rá gur sraith taifead sórtáilte é tábla ina bhfuil na péirí eochairluacha céanna. Má thaispeánann tú eochair mar dhronuilleog agus an luach gaolmhar mar phíopa comhthreomhar, gheobhaidh tú léaráid amhairc den bhunachar sonraí.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Mar sin féin, sa saol fíor is annamh is féidir a fháil tríd le doirteadh fola chomh beag. Go minic i mbunachar sonraí is gá, ar an gcéad dul síos, roinnt táblaí a bheith ann, agus ar an dara dul síos, roghnúcháin a dhéanamh iontu in ord difriúil ón bpríomheochair. Tá an chuid dheireanach seo dírithe ar na saincheisteanna a bhaineann lena gcruthú agus lena n-idirnascadh.

Táblaí innéacs

Tá alt "Gailearaí" ag an iarratas scamall. Taispeánann sé ábhar meán ón néal iomlán, curtha in eagar de réir dáta. Chun rogha den sórt sin a chur i bhfeidhm go barrmhaith, in aice leis an bpríomhthábla is gá duit ceann eile a chruthú le cineál nua eochracha. Beidh réimse iontu leis an dáta a cruthaíodh an comhad, a fheidhmeoidh mar phríomhchritéar sórtála. Toisc go ndéanann na heochracha nua tagairt do na sonraí céanna leis na heochracha sa phríomhthábla, tugtar eochracha innéacs orthu. Sa phictiúr thíos tá siad aibhsithe in oráiste.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

D'fhonn eochracha na dtáblaí éagsúla a scaradh óna chéile laistigh den bhunachar sonraí céanna, cuireadh tábla réimse teicniúil breise le gach ceann acu. Trí é a dhéanamh mar an tosaíocht is airde don sórtáil, bainfimid amach grúpáil eochracha ar dtús de réir táblaí, agus laistigh de tháblaí - de réir ár rialacha féin.

Déanann an eochair innéacs tagairt do na sonraí céanna leis an bpríomheochair. Níl sé barrmhaith an mhaoin seo a chur i bhfeidhm go díreach trí chóip den luach den eochair phríomha a chomhcheangal leis ó roinnt tuairimí:

  1. Maidir leis an spás a thógtar suas, is féidir leis na meiteashonraí a bheith saibhir go leor.
  2. Ó thaobh feidhmíochta de, ós rud é agus tú ag nuashonrú meiteashonraí nód, beidh ort é a athscríobh ag baint úsáide as dhá eochair.
  3. Ó thaobh na tacaíochta cód, má dhéanaimid dearmad ar na sonraí a nuashonrú le haghaidh ceann de na heochracha, gheobhaidh muid fabht do-sheachanta de neamhréireacht sonraí sa stóráil.

Ansin, déanfaimid machnamh ar conas na heasnaimh seo a dhíchur.

Eagrú caidrimh idir táblaí

Tá an patrún oiriúnach go maith chun an tábla innéacs a nascadh leis an bpríomhthábla "eochair mar luach". Mar a thugann an t-ainm le fios, is cóip den phríomhluach atá sa chuid luacha den taifead innéacs. Cuireann an cur chuige seo deireadh leis na míbhuntáistí thuasluaite go léir a bhaineann le cóip den luach den taifead príomhúil a stóráil. Is é an t-aon chostas atá air ná go gcaithfidh tú 2 cheist a chur chuig an mbunachar sonraí in ionad ceann amháin chun luach de réir eochair innéacs a fháil. Go scéimreach, tá an chuma ar an scéimre bunachar sonraí mar seo.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Is patrún eile é chun caidreamh a eagrú idir táblaí "eochair iomarcach". Is é a bunúsach tréithe breise a chur leis an eochair, a bhfuil gá leo ní le haghaidh sórtála, ach le haghaidh athchruthú an eochair ghaolmhar.In feidhmchlár Mail.ru Cloud tá fíor-shamplaí dá úsáid, áfach, chun tumadóireacht dhomhain a sheachaint. i gcomhthéacs creataí sonracha iOS, tabharfaidh mé sampla bréige, ach níos soiléire.​

Tá leathanach ag cliaint soghluaiste scamall a thaispeánann na comhaid agus na fillteáin go léir atá roinnte ag an úsáideoir le daoine eile. Ós rud é nach bhfuil ach líon réasúnta beag comhad den sórt sin, agus go bhfuil go leor cineálacha éagsúla faisnéise sainiúla maidir le poiblíocht a bhaineann leo (cé a dheonaítear rochtain, cad iad na cearta, etc.), ní bheidh sé réasúnach an luach a ualach mar chuid den taifead sa tábla is mó leis. Mar sin féin, más mian leat comhaid den sórt sin a thaispeáint as líne, ní mór duit fós é a stóráil áit éigin. Is é réiteach nádúrtha tábla ar leith a chruthú dó. Sa léaráid thíos, cuirtear “P” ar a eochair, agus is féidir “faisnéis phoiblí” a chur in ionad an áitsealbhóra “propname”.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Cuirtear gach meiteashonraí uathúla, ar mhaithe le stóráil a cruthaíodh an tábla nua, sa chuid luacha den taifead. Ag an am céanna, níl tú ag iarraidh na sonraí faoi chomhaid agus faoi fhillteáin atá stóráilte sa phríomhthábla cheana féin a dhúbailt. Ina áit sin, cuirtear sonraí iomarcacha leis an eochair “P” i bhfoirm na réimsí “ID nód” agus “stampa ama”. A bhuíochas leo, is féidir leat eochair innéacs a thógáil, ónar féidir leat eochair phríomha a fháil, ónar féidir leat meiteashonraí nód a fháil ar deireadh.

Conclúid

Déanaimid measúnú dearfach ar thorthaí chur i bhfeidhm LMDB. Tar éis é, tháinig laghdú 30% ar líon na reo iarratais.

Brilliance agus bochtaineacht bhunachar sonraí eochairluacha LMDB in feidhmchláir iOS

Bhain torthaí na hoibre a rinneadh le hais na foirne iOS. Faoi láthair, tá ceann de na príomh-rannóga "Comhaid" san fheidhmchlár Android tar éis LMDB a úsáid freisin, agus tá codanna eile ar an mbealach. Ba mhór an chabhair í an teanga C, ina gcuirtear an stór eochairluacha i bhfeidhm, chun creat feidhmchláir a chruthú timpeall uirthi tras-ardán in C++. Baineadh úsáid as gineadóir cóid chun an leabharlann C++ mar thoradh air a nascadh gan uaim le cód ardáin i Cuspóir-C agus Kotlin Djinni ó Dropbox, ach sin scéal go hiomlán difriúil.

Foinse: will.com

Add a comment