Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ni isubu ti ọdun 2019, iṣẹlẹ ti a nreti pipẹ waye ninu ẹgbẹ Mail.ru Cloud iOS. Ipamọ data akọkọ fun ibi ipamọ igbagbogbo ti ipo ohun elo ti di nla pupọ fun agbaye alagbeka Monomono Memory-Mapped aaye data (LMDB). Ni isalẹ gige a fun ọ ni atunyẹwo alaye ti o ni awọn ẹya mẹrin. Ni akọkọ, jẹ ki a sọrọ nipa awọn idi fun iru yiyan ti kii ṣe bintin ati ti o nira. Lẹhinna a yoo lọ siwaju lati gbero awọn ọwọn mẹta ti o wa ni ọkan ti faaji LMDB: awọn faili ti a ṣe iranti, B + -igi, daakọ-lori-kikọ fun imuse iṣowo ati isodipupo. Nikẹhin, fun desaati - apakan ti o wulo. Ninu rẹ a yoo wo bi a ṣe le ṣe apẹrẹ ati imuse ero data data pẹlu ọpọlọpọ awọn tabili, pẹlu ọkan atọka, lori oke API bọtini-kekere ipele.

Awọn akoonu

  1. Iwuri fun imuse
  2. Ipo ipo LMDB
  3. Awọn ọwọn mẹta ti LMDB
    3.1. Whale #1. Awọn faili ti o ya aworan iranti
    3.2. Whale #2. B + - igi
    3.3. Whale #3. Daakọ-lori-kọ
  4. Ṣiṣe eto eto data lori oke API iye-bọtini
    4.1. Awọn abstractions ipilẹ
    4.2. Table Modelling
    4.3. Awoṣe ibasepo laarin awọn tabili

1. Iwuri fun imuse

Odun kan ni 2015, a mu wahala lati wiwọn bi igba ni wiwo lags ohun elo. A ṣe eyi fun idi kan. A ti gba awọn ẹdun loorekoore diẹ sii ti nigbakan ohun elo ma da idahun si awọn iṣe olumulo: awọn bọtini ko le tẹ, awọn atokọ ko yi lọ, ati bẹbẹ lọ. Nipa awọn ẹrọ ti awọn wiwọn so fun lori AvitoTech, nitorinaa Mo fun ni aṣẹ awọn nọmba nikan.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Awọn abajade wiwọn di iwẹ tutu fun wa. O wa ni jade wipe ọpọlọpọ awọn siwaju sii isoro ṣẹlẹ nipasẹ didi ju eyikeyi miiran. Ti ṣaaju ki o to mọ otitọ yii, itọkasi imọ-ẹrọ akọkọ ti didara jẹ jamba, lẹhinna lẹhin idojukọ naa yi lọ yi bọ lori didi.

Ti kọ Dasibodu pẹlu didi ati lẹhin inawo pipo и ччественный igbekale ti awọn idi wọn, ọta akọkọ di mimọ - ọgbọn iṣowo ti o wuwo ti a ṣe ni okun akọkọ ti ohun elo naa. Ihuwasi ti ẹda si itiju yii jẹ ifẹ gbigbona lati gbe e sinu ṣiṣan iṣẹ. Lati le yanju iṣoro yii ni eto, a bẹrẹ si faaji olona-asapo ti o da lori awọn oṣere iwuwo fẹẹrẹ. Mo ti yasọtọ o si awọn oniwe-aṣamubadọgba fun iOS aye okun meji lori apapọ Twitter ati article on Habré. Gẹgẹbi apakan ti alaye lọwọlọwọ, Mo fẹ lati tẹnumọ awọn apakan ti ipinnu ti o ni ipa yiyan ti data data.

Awoṣe oṣere ti eto eto dawọle pe multithreading di koko keji rẹ. Awọn nkan awoṣe ninu rẹ fẹran lati kọja awọn aala ṣiṣan. Ati pe wọn ṣe eyi kii ṣe nigbakan ati nibi ati nibẹ, ṣugbọn o fẹrẹẹ nigbagbogbo ati nibi gbogbo

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ibi ipamọ data jẹ ọkan ninu awọn paati okuta igun-ile ninu aworan atọka ti a gbekalẹ. Iṣẹ akọkọ rẹ ni lati ṣe imuse macropattern Aaye data Pipin. Ti o ba wa ni agbaye iṣowo o ti lo lati ṣeto imuṣiṣẹpọ data laarin awọn iṣẹ, lẹhinna ninu ọran ti faaji oṣere - data laarin awọn okun. Bayi, a nilo aaye data ti kii yoo fa paapaa awọn iṣoro ti o kere ju nigbati o ba n ṣiṣẹ pẹlu rẹ ni agbegbe ti o ni ọpọlọpọ-asapo. Ni pataki, eyi tumọ si pe awọn nkan ti o gba lati ọdọ rẹ gbọdọ jẹ o kere ju okun-ailewu, ati pe apere ni pipe ti kii ṣe iyipada. Bi o ṣe mọ, igbehin le ṣee lo ni igbakanna lati ọpọlọpọ awọn okun laisi lilo si eyikeyi titiipa, eyiti o ni ipa anfani lori iṣẹ ṣiṣe.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOSOhun pataki keji ti o ni ipa lori yiyan data data jẹ API awọsanma wa. O jẹ atilẹyin nipasẹ ọna imuṣiṣẹpọ ti a gba nipasẹ git. Gẹgẹbi rẹ, a ṣe ifọkansi ni offline-akọkọ API, eyi ti o dabi diẹ sii ju ti o yẹ fun awọn onibara awọsanma. O ti ro pe wọn yoo fa ipo kikun ti awọsanma jade ni ẹẹkan, ati lẹhinna mimuuṣiṣẹpọ ni ọpọlọpọ awọn ọran yoo waye nipasẹ yiyi awọn ayipada. Alas, anfani yii tun wa ni agbegbe imọ-jinlẹ nikan, ati pe awọn alabara ko kọ ẹkọ bi o ṣe le ṣiṣẹ pẹlu awọn abulẹ ni iṣe. Awọn idi pataki kan wa fun eyi, eyiti, ni ibere ki o ma ṣe idaduro ifihan, a yoo fi sile awọn biraketi. Bayi, kini iwulo diẹ sii ni awọn ipinnu ikẹkọ ti ẹkọ nipa ohun ti o ṣẹlẹ nigbati API sọ “A” ati pe alabara rẹ ko sọ “B”.

Nitorinaa, ti o ba foju inu git, eyiti, nigbati o ba n ṣiṣẹ pipaṣẹ fifa, dipo lilo awọn abulẹ si aworan agbegbe kan, ṣe afiwe ipo kikun rẹ pẹlu ipo olupin ni kikun, lẹhinna o yoo ni imọran deede ti bi amuṣiṣẹpọ ṣe waye ninu awọsanma. ibara. O rọrun lati gboju pe lati ṣe imuse rẹ, o nilo lati pin awọn igi DOM meji ni iranti pẹlu alaye-meta nipa gbogbo olupin ati awọn faili agbegbe. O wa ni pe ti olumulo kan ba tọju awọn faili 500 ẹgbẹrun ni awọsanma, lẹhinna lati muuṣiṣẹpọ o jẹ dandan lati tun ṣe ati pa awọn igi meji run pẹlu awọn apa 1 milionu. Ṣugbọn ipade kọọkan jẹ akojọpọ ti o ni awọn aworan ti awọn koko-ọrọ ninu. Ni imọlẹ yii, awọn abajade profaili ni a nireti. O wa ni jade pe paapaa laisi akiyesi algorithm iṣọpọ, ilana pupọ ti ṣiṣẹda ati piparẹ nọmba nla ti awọn nkan kekere jẹ idiyele penny lẹwa kan. ti awọn iwe afọwọkọ olumulo. Bi abajade, a ṣe atunṣe ami pataki keji ni yiyan data data - agbara lati ṣe awọn iṣẹ CRUD laisi ipinfunni agbara ti awọn nkan.

Awọn ibeere miiran jẹ aṣa diẹ sii ati gbogbo atokọ wọn jẹ atẹle.

  1. Aabo okun.
  2. Multiprocessing. Ti paṣẹ nipasẹ ifẹ lati lo apẹẹrẹ data data kanna lati muuṣiṣẹpọ ipo kii ṣe laarin awọn okun nikan, ṣugbọn tun laarin ohun elo akọkọ ati awọn amugbooro iOS.
  3. Agbara lati ṣe aṣoju awọn nkan ti o fipamọ bi awọn ohun ti kii ṣe iyipada
  4. Ko si awọn ipin ti o ni agbara laarin awọn iṣẹ CRUD.
  5. Atilẹyin iṣowo fun awọn ohun-ini ipilẹ ACID: atomity, aitasera, ipinya ati dede.
  6. Iyara lori awọn ọran olokiki julọ.

Pẹlu ṣeto awọn ibeere, SQLite jẹ ati pe o jẹ yiyan ti o dara. Bibẹẹkọ, gẹgẹ bi apakan ti iwadii awọn yiyan, Mo wa iwe kan "Bibẹrẹ pẹlu LevelDB". Labẹ itọsọna rẹ, a ti kọ ala-ilẹ kan ni ifiwera iyara iṣẹ pẹlu oriṣiriṣi awọn apoti isura infomesonu ni awọn oju iṣẹlẹ awọsanma gidi. Abajade ti kọja awọn ireti egan wa. Ninu awọn ọran ti o gbajumọ julọ - gbigba kọsọ lori atokọ lẹsẹsẹ ti gbogbo awọn faili ati atokọ lẹsẹsẹ ti gbogbo awọn faili fun liana ti a fun - LMDB yipada lati jẹ awọn akoko 10 yiyara ju SQLite. Yiyan di kedere.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

2. Ipo ipo LMDB

LMDB jẹ ile-ikawe kekere pupọ (awọn ori ila 10K nikan) ti o ṣe imuse ipilẹ ipilẹ ti o kere julọ ti awọn apoti isura data - ibi ipamọ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Aworan ti o wa loke fihan pe ifiwera LMDB pẹlu SQLite, eyiti o tun ṣe awọn ipele ti o ga julọ, kii ṣe deede diẹ sii ju SQLite pẹlu Data Core. Yoo jẹ ẹtọ diẹ sii lati tọka awọn ẹrọ ibi ipamọ kanna bi awọn oludije dogba - BerkeleyDB, LevelDB, Sophia, RocksDB, bbl Awọn idagbasoke paapaa wa nibiti LMDB n ṣiṣẹ bi paati ẹrọ ipamọ fun SQLite. Ni igba akọkọ ti iru adanwo wà ni 2012 lo nipasẹ LMDB Howard Chu. Результаты yipada lati jẹ iyanilenu pupọ pe ipilẹṣẹ rẹ ni awọn alara OSS gbe soke, o si rii ilọsiwaju rẹ ninu eniyan naa. LumoSQL. Ni Oṣu Kini ọdun 2020, onkọwe ti iṣẹ akanṣe yii ni Den Shearer gbekalẹ o ni LinuxConfAu.

LMDB ni pataki lo bi ẹrọ fun awọn apoti isura infomesonu ohun elo. Ile-ikawe naa jẹ irisi irisi rẹ si awọn olupilẹṣẹ Ṣii LDAP, ti wọn ko ni itẹlọrun pupọ pẹlu BerkeleyDB gẹgẹbi ipilẹ fun iṣẹ akanṣe wọn. Bibẹrẹ lati ile-ikawe iwọntunwọnsi btree, Howard Chu ni anfani lati ṣẹda ọkan ninu awọn julọ gbajumo yiyan ti wa akoko. O ṣe iyasọtọ ijabọ itunu pupọ si itan yii, ati si eto inu ti LMDB. "Ibi-ipamọ data ti a ṣe afihan Iranti Monomono". Apeere to dara ti bibori ibi ipamọ ni a pin nipasẹ Leonid Yuryev (aka yleo) lati Awọn Imọ-ẹrọ Rere ninu ijabọ rẹ ni Highload 2015 “Ẹnjini LMDB jẹ aṣaju pataki kan”. Ninu rẹ, o sọrọ nipa LMDB ni agbegbe ti iṣẹ ṣiṣe ti o jọra ti imuse ReOpenLDAP, ati pe LevelDB ti wa labẹ ibawi afiwera tẹlẹ. Bi abajade imuse naa, Awọn Imọ-ẹrọ Rere paapaa ni orita ti n dagbasoke ni itara MDBX pẹlu gan dun awọn ẹya ara ẹrọ, optimizations ati bugfixes.

LMDB nigbagbogbo lo bi ibi-itọju bi-jẹ. Fun apẹẹrẹ, Mozilla Firefox browser yàn o fun nọmba kan ti aini, ati, ti o bere lati version 9, Xcode ayanfẹ SQLite rẹ fun titoju awọn atọka.

Ẹrọ naa tun ti ṣe ami rẹ ni agbaye ti idagbasoke alagbeka. Awọn itọpa ti lilo rẹ le jẹ wa ninu alabara iOS fun Telegram. LinkedIn lọ paapaa siwaju ati pe o yan LMDB gẹgẹbi ibi ipamọ aifọwọyi fun ipilẹ data caching data ile rẹ Rocket Data, nipa eyiti so fun ninu nkan rẹ ni ọdun 2016.

LMDB n ja ija ni aṣeyọri fun aaye kan ninu oorun ni onakan ti BerkeleyDB fi silẹ lẹhin ti o wa labẹ iṣakoso Oracle. Ile-ikawe naa nifẹ fun iyara ati igbẹkẹle rẹ, paapaa ni akawe si awọn ẹlẹgbẹ rẹ. Bi o ṣe mọ, ko si awọn ounjẹ ọsan ọfẹ, ati pe Emi yoo fẹ lati tẹnumọ iṣowo-pipa ti iwọ yoo ni lati koju nigbati o yan laarin LMDB ati SQLite. Aworan ti o wa loke fihan kedere bi iyara ti o pọ si ti waye. Ni akọkọ, a ko sanwo fun awọn ipele afikun ti abstraction lori oke ibi ipamọ disk. O han gbangba pe faaji ti o dara tun ko le ṣe laisi wọn, ati pe wọn yoo han gbangba ninu koodu ohun elo, ṣugbọn wọn yoo jẹ arekereke pupọ. Wọn kii yoo ni awọn ẹya ti ko nilo nipasẹ ohun elo kan, fun apẹẹrẹ, atilẹyin fun awọn ibeere ni ede SQL. Ni ẹẹkeji, o ṣee ṣe lati ṣe imuse ti aipe ti awọn iṣẹ ṣiṣe ohun elo lori awọn ibeere si ibi ipamọ disk. Ti o ba ti SQLite ninu ise mi da lori awọn iwulo iṣiro apapọ ti ohun elo apapọ, lẹhinna iwọ, bi olupilẹṣẹ ohun elo, mọ daradara ti awọn oju iṣẹlẹ fifuye iṣẹ akọkọ. Fun ojutu iṣelọpọ diẹ sii, iwọ yoo ni lati san aami idiyele ti o pọ si mejeeji fun idagbasoke ti ojutu akọkọ ati fun atilẹyin atẹle rẹ.

3. Mẹta ọwọn ti LMDB

Lehin ti o ti wo LMDB lati oju oju eye, o to akoko lati lọ jinle. Awọn apakan mẹta ti o tẹle yoo jẹ iyasọtọ si itupalẹ ti awọn ọwọn akọkọ lori eyiti faaji ibi-itọju duro:

  1. Awọn faili ti o ya aworan iranti bi ẹrọ kan fun ṣiṣẹ pẹlu disiki ati mimuuṣiṣẹpọ awọn ẹya data inu.
  2. B + -igi bi ohun agbari ti o ti fipamọ data.
  3. Daakọ-lori-kọ gẹgẹbi ọna lati pese awọn ohun-ini idunadura ACID ati isodipupo.

3.1. Whale #1. Awọn faili ti o ya aworan iranti

Awọn faili ti a ṣe aworan iranti jẹ iru ẹya pataki ti ayaworan ti wọn paapaa han ni orukọ ibi ipamọ naa. Awọn ọran ti caching ati amuṣiṣẹpọ ti iraye si alaye ti o fipamọ ni a fi silẹ patapata si ẹrọ ṣiṣe. LMDB ko ni awọn caches eyikeyi ninu funrararẹ. Eyi jẹ ipinnu mimọ nipasẹ onkọwe, nitori kika data taara lati awọn faili ti o ya aworan gba ọ laaye lati ge awọn igun pupọ ninu imuse ẹrọ naa. Ni isalẹ ni a jina lati pipe akojọ ti diẹ ninu awọn ti wọn.

  1. Mimu aitasera ti data ninu ibi ipamọ nigba ṣiṣẹ pẹlu rẹ lati awọn ilana pupọ di ojuse ti ẹrọ ṣiṣe. Ni apakan ti o tẹle, awọn ẹrọ-ẹrọ yii jẹ ijiroro ni awọn alaye ati pẹlu awọn aworan.
  2. Aisi awọn caches patapata yọkuro LMDB kuro ni oke ti o ni nkan ṣe pẹlu awọn ipin agbara. Kika data ni adaṣe tumọ si ṣeto itọka si adirẹsi ti o pe ni iranti foju ati pe ko si diẹ sii. O dabi itan-akọọlẹ imọ-jinlẹ, ṣugbọn ninu koodu orisun ipamọ gbogbo awọn ipe si calloc ti wa ni idojukọ ninu iṣẹ iṣeto ibi ipamọ.
  3. Aisi awọn caches tun tumọ si isansa ti awọn titiipa ti o ni nkan ṣe pẹlu amuṣiṣẹpọ ti iraye si wọn. Awọn oluka, eyiti o le jẹ nọmba lainidii ti awọn oluka ni akoko kanna, ko ba pade mutex kan ni ọna wọn si data naa. Nitori eyi, iyara kika ni iwọn ilawọn pipe ti o da lori nọmba awọn CPUs. Ni LMDB, awọn iṣẹ atunṣe nikan ni a muṣiṣẹpọ. Onkọwe kan ṣoṣo le wa ni akoko kan.
  4. O kere ju ti caching ati ọgbọn imuṣiṣẹpọ n yọkuro iru awọn aṣiṣe ti o ni eka pupọ julọ ti o ni nkan ṣe pẹlu ṣiṣẹ ni agbegbe asapo pupọ. Awọn ijinlẹ data ti o nifẹ meji wa ni apejọ Usenix OSDI 2014: "Gbogbo Awọn ọna ṣiṣe Faili Ko Da Dọgba: Lori Ẹya ti Ṣiṣẹda jamba-Awọn ohun elo Iduroṣinṣin" и "Awọn aaye data ijiya fun igbadun ati ere". Lati ọdọ wọn o le ṣajọ alaye nipa mejeeji igbẹkẹle airotẹlẹ ti LMDB ati imuse ailabawọn ti awọn ohun-ini idunadura ACID, eyiti o ga ju ti SQLite lọ.
  5. Minimalism ti LMDB ngbanilaaye aṣoju ẹrọ ti koodu rẹ lati wa ni pipe ni kaṣe L1 ti ero isise pẹlu awọn abuda iyara ti o tẹle.

Laanu, ni iOS, pẹlu awọn faili ti o ya iranti, ohun gbogbo kii ṣe awọsanma bi a ṣe fẹ. Lati sọrọ nipa awọn ailagbara ti o ni nkan ṣe pẹlu wọn ni mimọ diẹ sii, o jẹ dandan lati ranti awọn ipilẹ gbogbogbo ti imuse ẹrọ yii ni awọn ọna ṣiṣe.

Alaye gbogbogbo nipa awọn faili ti o ya aworan iranti

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOSPẹlu gbogbo ohun elo ti o nṣiṣẹ, ẹrọ ṣiṣe n ṣepọ nkan kan ti a pe ni ilana kan. Ilana kọọkan jẹ ipin awọn adirẹsi ti o ni ibatan si eyiti o gbe ohun gbogbo ti o nilo lati ṣiṣẹ. Ni awọn adirẹsi ti o kere julọ awọn apakan wa pẹlu koodu ati data ti o ni koodu lile ati awọn orisun. Nigbamii ti bulọọki ti ndagba ti aaye adirẹsi ti o ni agbara, ti a mọ daradara si wa labẹ okiti orukọ. O ni awọn adirẹsi ti awọn nkan ti o han lakoko iṣẹ ti eto naa. Ni oke ni agbegbe iranti ti a lo nipasẹ akopọ ohun elo. O dagba tabi ṣe adehun; ni awọn ọrọ miiran, iwọn rẹ tun ni ẹda ti o ni agbara. Lati ṣe idiwọ akopọ ati okiti lati titari ati kikọ si ara wọn, wọn wa ni awọn opin oriṣiriṣi ti aaye adirẹsi. iho kan wa laarin awọn apakan agbara meji ni oke ati isalẹ. Ẹ̀rọ ìṣiṣẹ́ ń lo àwọn àdírẹ́sì ní abala àárín yìí láti so oríṣiríṣi àwọn nǹkan kan pọ̀ mọ́ ìlànà náà. Ni pataki, o le ṣepọ awọn adirẹsi lemọlemọfún kan pẹlu faili kan lori disiki naa. Iru faili bẹẹ ni a npe ni iranti-mapped

Aaye adirẹsi ti a pin si ilana naa tobi. Ni imọ-jinlẹ, nọmba awọn adirẹsi ti ni opin nikan nipasẹ iwọn itọka, eyiti o jẹ ipinnu nipasẹ agbara bit ti eto naa. Ti iranti ti ara ba ya aworan si 1-si-1, lẹhinna ilana akọkọ yoo gbe gbogbo Ramu soke, ati pe ko si ọrọ ti eyikeyi multitasking.

Sibẹsibẹ, lati iriri wa a mọ pe awọn ọna ṣiṣe ode oni le ṣiṣẹ nigbakanna ọpọlọpọ awọn ilana bi o ṣe fẹ. Eyi ṣee ṣe nitori otitọ pe wọn pin iranti pupọ si awọn ilana lori iwe, ṣugbọn ni otitọ wọn gbe sinu iranti ti ara akọkọ nikan apakan ti o wa ni ibeere nibi ati bayi. Nitorinaa, iranti ti o ni nkan ṣe pẹlu ilana ni a pe ni foju.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Eto iṣẹ ṣiṣe ṣeto foju ati iranti ti ara sinu awọn oju-iwe ti iwọn kan. Ni kete ti oju-iwe kan ti iranti foju ba wa ni ibeere, ẹrọ ṣiṣe gbe e sinu iranti ti ara ati baamu wọn ni tabili pataki kan. Ti ko ba si awọn iho ọfẹ, lẹhinna ọkan ninu awọn oju-iwe ti kojọpọ tẹlẹ ni a daakọ si disiki naa, ati pe eyi ti o beere gba aaye rẹ. Ilana yii, eyiti a yoo pada si laipẹ, ni a pe ni swapping. Nọmba ti o wa ni isalẹ ṣe apejuwe ilana ti a ṣalaye. Lori rẹ, oju-iwe A pẹlu adirẹsi 0 ti kojọpọ ati gbe sori oju-iwe iranti akọkọ pẹlu adirẹsi 4. Otitọ yii han ninu tabili ifọrọranṣẹ ni nọmba sẹẹli 0.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Itan naa jẹ kanna pẹlu awọn faili ti a ya aworan si iranti. Lọ́nà tí ó bọ́gbọ́n mu, wọ́n gbọ́dọ̀ máa bá a nìṣó ní gbogbo ìgbà tí wọ́n sì wà níbẹ̀ ní àyè àdírẹ́sì tí kò ṣeé fojú rí. Bibẹẹkọ, wọn tẹ oju-iwe iranti ti ara nipasẹ oju-iwe ati lori ibeere nikan. Iyipada iru awọn oju-iwe bẹ jẹ mimuuṣiṣẹpọ pẹlu faili lori disiki. Ni ọna yii, o le ṣe faili I/O nipa ṣiṣẹ nirọrun pẹlu awọn baiti ni iranti - gbogbo awọn ayipada yoo gbe lọ laifọwọyi nipasẹ ekuro ẹrọ si faili orisun.
Awọn
Aworan ti o wa ni isalẹ ṣe afihan bi LMDB ṣe muuṣiṣẹpọ ipo rẹ nigbati o n ṣiṣẹ pẹlu data data lati awọn ilana oriṣiriṣi. Nipa ṣiṣe aworan iranti foju ti awọn ilana oriṣiriṣi si faili kanna, a jẹ dandan fun ẹrọ ṣiṣe lati muuṣiṣẹpọ awọn ohun amorindun kan ti awọn aaye adirẹsi wọn pẹlu ara wọn, nibiti LMDB ti wo.
Awọn

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Nuance pataki kan ni pe LMDB, nipasẹ aiyipada, ṣe atunṣe faili data nipasẹ ẹrọ kikọ eto, ati ṣafihan faili funrararẹ ni ipo kika-nikan. Ọna yii ni awọn abajade pataki meji.

Abajade akọkọ jẹ wọpọ si gbogbo awọn ọna ṣiṣe. Ohun pataki rẹ ni lati ṣafikun aabo lodi si ibajẹ airotẹlẹ si ibi ipamọ data nipasẹ koodu ti ko tọ. Bi o ṣe mọ, awọn ilana ṣiṣe ti ilana kan ni ominira lati wọle si data lati ibikibi ni aaye adirẹsi rẹ. Ni akoko kanna, bi a ti ranti tẹlẹ, iṣafihan faili kan ni ipo kika-kikọ tumọ si pe eyikeyi ilana tun le yipada. Ti o ba ṣe eyi nipasẹ asise, igbiyanju, fun apẹẹrẹ, lati tun atunkọ ipin kan ni gangan ni atọka ti ko si, lẹhinna o le yi faili ti o ya aworan pada lairotẹlẹ si adirẹsi yii, eyiti yoo ja si ibajẹ ti database. Ti faili naa ba han ni ipo kika-nikan, lẹhinna igbiyanju lati yi aaye adirẹsi ti o baamu pada yoo ja si ifopinsi pajawiri ti eto naa pẹlu ifihan agbara kan. SIGSEGV, ati pe faili naa yoo wa ni mimule.

Abajade keji jẹ pato pato si iOS. Bẹni onkọwe tabi awọn orisun eyikeyi ti o sọ ni gbangba, ṣugbọn laisi rẹ LMDB ko ni dara fun ṣiṣe lori ẹrọ ṣiṣe alagbeka yii. Abala ti o tẹle jẹ iyasọtọ si ero rẹ.

Awọn pato ti awọn faili ti o ya iranti ni iOS

Ijabọ iyanu kan wa ni WWDC ni ọdun 2018 "iOS Memory Deep Dive". O sọ fun wa pe ni iOS, gbogbo awọn oju-iwe ti o wa ni iranti ti ara jẹ ọkan ninu awọn oriṣi 3: idọti, fisinuirindigbindigbin ati mimọ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Iranti mimọ jẹ akojọpọ awọn oju-iwe ti o le ṣe ṣiṣi silẹ laisi irora lati iranti ti ara. Awọn data ti wọn ni le jẹ tun gbejade bi o ṣe nilo lati awọn orisun atilẹba rẹ. Awọn faili ti a ṣe iranti kika-nikan ṣubu sinu ẹka yii. iOS ko bẹru lati gbejade awọn oju-iwe ti a ya aworan si faili kan lati iranti nigbakugba, nitori wọn ni iṣeduro lati muuṣiṣẹpọ pẹlu faili lori disk.
Awọn
Gbogbo awọn oju-iwe ti a tunṣe pari ni iranti idọti, laibikita ibiti wọn ti wa ni akọkọ. Ni pataki, awọn faili ti o ya aworan iranti ti a yipada nipasẹ kikọ si iranti foju ti o ni nkan ṣe pẹlu wọn yoo jẹ ipin ni ọna yii. Nsii LMDB pẹlu asia MDB_WRITEMAP, lẹhin ṣiṣe awọn ayipada si rẹ, o le jẹrisi eyi tikalararẹ

Ni kete ti ohun elo kan bẹrẹ lati gba iranti ti ara ti o pọ ju, iOS jẹ koko-ọrọ si idọti oju-iwe idọti. Lapapọ iranti ti o tẹdo nipasẹ idọti ati awọn oju-iwe fisinuirindigbindigbin jẹ ohun elo ohun elo ti a pe ni ifẹsẹtẹ iranti. Ni kete ti o de iye ala-ilẹ kan, daemon eto apaniyan OOM wa lẹhin ilana naa ati fi agbara mu u. Eyi jẹ iyasọtọ ti iOS ni akawe si awọn ọna ṣiṣe tabili tabili. Ni idakeji, idinku ifẹsẹtẹ iranti nipasẹ yiyipada awọn oju-iwe lati iranti ti ara si disk ko pese ni iOS. Awọn idi le jẹ kiye si ni. Boya ilana ti awọn oju-iwe ti o ni itara si disiki ati sẹhin jẹ agbara pupọ fun awọn ẹrọ alagbeka, tabi iOS ṣafipamọ awọn orisun ti awọn sẹẹli atunkọ lori awọn awakọ SSD, tabi boya awọn apẹẹrẹ ko ni itẹlọrun pẹlu iṣẹ gbogbogbo ti eto naa, nibiti ohun gbogbo wa. nigbagbogbo swapped. Bi o ti le jẹ pe, otitọ jẹ otitọ kan.

Irohin ti o dara, ti mẹnuba tẹlẹ, ni pe LMDB nipasẹ aiyipada ko lo ẹrọ mmap lati ṣe imudojuiwọn awọn faili. Eyi tumọ si pe data ti o han jẹ ipin nipasẹ iOS bi iranti mimọ ati pe ko ṣe alabapin si ifẹsẹtẹ iranti. O le mọ daju eyi nipa lilo ohun elo Xcode ti a pe ni VM Tracker. Sikirinifoto ti o wa ni isalẹ fihan ipo ti iranti foju foju iOS ti ohun elo awọsanma lakoko iṣẹ. Ni ibẹrẹ, awọn iṣẹlẹ LMDB 2 ti wa ni ipilẹṣẹ ninu rẹ. A gba akọkọ laaye lati ṣafihan faili rẹ lori 1GiB ti iranti foju, keji - 512MiB. Bíótilẹ o daju wipe awọn mejeeji storages kun kan awọn iye ti olugbe iranti, bẹni awọn ti wọn tiwon idọti iwọn.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ati nisisiyi o to akoko fun awọn iroyin buburu. Ṣeun si ẹrọ swap ni awọn ọna ṣiṣe tabili 64-bit, ilana kọọkan le gba bi aaye adirẹsi foju foju bi aaye disiki lile ọfẹ fun swap agbara rẹ gba laaye. Rirọpo swap pẹlu funmorawon ni iOS yatq din awọn tumq si o pọju. Bayi gbogbo awọn ilana igbesi aye gbọdọ dada sinu akọkọ (ka Ramu) iranti, ati gbogbo awọn ti ko baamu gbọdọ wa ni agbara mu lati fopin si. Eyi ni a sọ gẹgẹbi ninu awọn ti a mẹnuba loke ijabọati ninu osise iwe aṣẹ. Bi abajade, iOS ṣe opin ni opin iye iranti ti o wa fun ipin nipasẹ mmap. Nibi nibi O le wo awọn opin agbara ti iye iranti ti o le pin si awọn ẹrọ oriṣiriṣi nipa lilo ipe eto yii. Lori awọn awoṣe foonuiyara ti ode oni, iOS ti di oninurere nipasẹ 2 gigabytes, ati lori awọn ẹya oke ti iPad - nipasẹ 4. Ni iṣe, dajudaju, o ni lati dojukọ awọn awoṣe ẹrọ atilẹyin ti o kere julọ, nibiti ohun gbogbo ti dun pupọ. Paapaa buruju, nipa wiwo ipo iranti ohun elo ni VM Tracker, iwọ yoo rii pe LMDB jinna si ọkan kan ṣoṣo ti o sọ pe o jẹ maapu iranti. Awọn chunks ti o dara jẹ jẹun nipasẹ awọn olutọpa eto, awọn faili orisun, awọn ilana aworan, ati awọn aperanje kekere miiran.

Da lori awọn abajade ti awọn adanwo ninu Awọsanma, a wa si awọn iye aropin wọnyi fun iranti ti a pin nipasẹ LMDB: 384 megabyte fun awọn ẹrọ 32-bit ati 768 fun awọn ẹrọ 64-bit. Lẹhin ti iwọn didun yii ti lo soke, awọn iṣẹ iyipada eyikeyi bẹrẹ lati pari pẹlu koodu naa MDB_MAP_FULL. A ṣe akiyesi iru awọn aṣiṣe bẹ ninu ibojuwo wa, ṣugbọn wọn kere to pe ni ipele yii wọn le gbagbe.

Idi ti kii ṣe kedere fun agbara iranti ti o pọ julọ nipasẹ ibi ipamọ le jẹ awọn iṣowo gigun. Lati loye bii awọn iyalẹnu meji wọnyi ṣe sopọ, a yoo ṣe iranlọwọ nipa gbigbero awọn ọwọn meji to ku ti LMDB.

3.2. Whale #2. B + - igi

Lati ṣe apẹẹrẹ awọn tabili lori oke ibi ipamọ iye-bọtini, awọn iṣẹ ṣiṣe wọnyi gbọdọ wa ni API rẹ:

  1. Nfi eroja tuntun sii.
  2. Wa nkan kan pẹlu bọtini ti a fun.
  3. Yiyọ ohun ano.
  4. Tẹle lori awọn aaye arin ti awọn bọtini ni ọna ti wọn ti to lẹsẹsẹ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOSEto data ti o rọrun julọ ti o le ni irọrun mu gbogbo awọn iṣẹ ṣiṣe mẹrin jẹ igi wiwa alakomeji. Ọkọọkan awọn apa rẹ duro fun bọtini kan ti o pin gbogbo ipin ti awọn bọtini ọmọ si awọn igi abẹlẹ meji. Osi ni awọn ti o kere ju obi lọ, ati eyi ti ọtun ni awọn ti o tobi julọ. Gbigba ṣeto awọn bọtini ti a ti paṣẹ jẹ aṣeyọri nipasẹ ọkan ninu awọn irin-ajo igi Ayebaye

Awọn igi alakomeji ni awọn abawọn ipilẹ meji ti o ṣe idiwọ fun wọn lati munadoko bi eto data orisun disk. Ni akọkọ, iwọn iwọntunwọnsi wọn jẹ airotẹlẹ. Ewu nla wa ti gbigba awọn igi ninu eyiti awọn giga ti awọn ẹka oriṣiriṣi le yatọ si pupọ, eyiti o buru si idiju algorithmic ti wiwa ni akawe si ohun ti a nireti. Ni ẹẹkeji, opo ti awọn ọna asopọ agbelebu laarin awọn apa npa awọn igi alakomeji ti agbegbe ni iranti. Bi abajade, paapaa lilọ kiri ti o rọrun ti ọpọlọpọ awọn apa adugbo ninu igi le nilo abẹwo si nọmba awọn oju-iwe ti o jọra. Eyi jẹ iṣoro paapaa nigba ti a ba sọrọ nipa imunadoko ti awọn igi alakomeji bi eto data iranti-iranti, nitori awọn oju-iwe yiyi nigbagbogbo ninu kaṣe ero isise kii ṣe idunnu olowo poku. Nigba ti o ba de si gbigba awọn oju-iwe nigbagbogbo ti o ni nkan ṣe pẹlu awọn apa lati disk, ipo naa di patapata deplorable.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOSAwọn igi B, jẹ itankalẹ ti awọn igi alakomeji, yanju awọn iṣoro ti a damọ ni paragi ti tẹlẹ. Ni akọkọ, wọn jẹ iwọntunwọnsi ara ẹni. Ni ẹẹkeji, ọkọọkan awọn apa wọn pin ṣeto awọn bọtini ọmọ kii ṣe si 2, ṣugbọn sinu awọn ipinfunni aṣẹ M, ati pe nọmba M le jẹ nla, lori aṣẹ ti awọn ọgọọgọrun, tabi paapaa ẹgbẹẹgbẹrun.

Nitorina:

  1. Oju ipade kọọkan ni nọmba nla ti awọn bọtini ti a ti paṣẹ tẹlẹ ati awọn igi kukuru pupọ.
  2. Igi naa gba ohun-ini ti agbegbe ti ipo ni iranti, nitori awọn bọtini ti o sunmọ ni iye wa nipa ti ara wa lẹgbẹẹ ara wọn lori kanna tabi awọn apa adugbo.
  3. Nọmba awọn ọna gbigbe nigbati o ba sọkalẹ igi kan lakoko iṣẹ wiwa ti dinku.
  4. Nọmba awọn apa ibi-afẹde ti a ka lakoko awọn ibeere ibiti o ti dinku, nitori ọkọọkan wọn ti ni nọmba nla ti awọn bọtini ti a paṣẹ tẹlẹ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

LMDB nlo iyatọ ti igi B ti a npe ni igi B lati tọju data. Aworan ti o wa loke fihan awọn oriṣi mẹta ti apa ti o wa ninu rẹ:

  1. Ni oke ni root. Ko ṣe nkankan diẹ sii ju imọran ti data data inu ile-itaja kan. Laarin apẹẹrẹ LMDB kan, o le ṣẹda awọn apoti isura infomesonu pupọ ti o pin aaye adirẹsi foju ti a ya aworan. Ọkọọkan wọn bẹrẹ lati gbongbo tirẹ.
  2. Ni ipele ti o kere julọ ni awọn ewe. Wọn ati pe wọn nikan ni awọn orisii iye bọtini ti o fipamọ sinu aaye data. Nipa ọna, eyi jẹ iyasọtọ ti B + - awọn igi. Ti igi-B deede ba tọju awọn ẹya iye ni awọn apa ti gbogbo awọn ipele, lẹhinna iyatọ B + nikan ni o kere julọ. Lehin ti o ṣe atunṣe otitọ yii, a yoo tun pe iru igi ti a lo ninu LMDB ni nìkan ni igi B.
  3. Laarin gbongbo ati awọn leaves, awọn ipele imọ-ẹrọ 0 tabi diẹ sii wa pẹlu awọn apa lilọ kiri (ẹka). Iṣẹ-ṣiṣe wọn ni lati pin akojọpọ awọn bọtini laarin awọn leaves.

Ni ti ara, awọn apa jẹ awọn bulọọki ti iranti gigun ti a ti pinnu tẹlẹ. Iwọn wọn jẹ ọpọ ti iwọn awọn oju-iwe iranti ninu ẹrọ ṣiṣe, eyiti a sọrọ loke. Ilana ipade ti han ni isalẹ. Akọsori ni alaye meta, eyiti o han julọ eyiti eyiti fun apẹẹrẹ jẹ checksum. Nigbamii ti o wa alaye nipa awọn aiṣedeede ninu eyiti awọn sẹẹli pẹlu data wa. Data naa le jẹ boya awọn bọtini, ti a ba n sọrọ nipa awọn apa lilọ kiri, tabi gbogbo awọn orisii iye bọtini ni ọran ti awọn ewe. O le ka diẹ sii nipa eto awọn oju-iwe ninu iṣẹ naa "Iyẹwo ti Awọn ile-itaja Koko-Iye Iṣe Giga".

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Lehin ti a ba ṣe pẹlu akoonu inu ti awọn apa oju-iwe, a yoo ṣojuuṣe siwaju igi LMDB B-igi ni ọna irọrun ni fọọmu atẹle.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Awọn oju-iwe ti o ni awọn apa wa ni atẹlera lori disk. Awọn oju-iwe ti o ni nọmba ti o ga julọ wa ni ọna opin faili naa. Oju-iwe ti a pe ni meta ni alaye nipa awọn aiṣedeede nipasẹ eyiti a le rii awọn gbongbo gbogbo awọn igi. Nigbati o ba ṣii faili kan, LMDB ṣe ayẹwo oju-iwe faili nipasẹ oju-iwe lati opin si ibẹrẹ ni wiwa oju-iwe meta ti o wulo ati nipasẹ o rii awọn apoti isura data ti o wa tẹlẹ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ni bayi, nini imọran ti ọgbọn ati eto ti ara ti agbari data, a le tẹsiwaju lati gbero ọwọn kẹta ti LMDB. O jẹ pẹlu iranlọwọ rẹ pe gbogbo awọn iyipada ipamọ waye ni iṣowo ati ni iyasọtọ lati ara wọn, fifun data gẹgẹbi gbogbo ohun-ini ti isodipupo.

3.3. Whale #3. Daakọ-lori-kọ

Diẹ ninu awọn iṣẹ-igi B jẹ pẹlu ṣiṣe awọn iyipada lẹsẹsẹ si awọn apa rẹ. Apeere kan jẹ fifi bọtini titun kun si ipade ti o ti de agbara ti o pọju. Ni idi eyi, o jẹ dandan, akọkọ, lati pin awọn ipade si meji, ati keji, lati fi ọna asopọ kan si awọn titun budding ọmọ ipade ninu awọn oniwe-obi. Ilana yii lewu pupọ. Ti o ba jẹ fun idi kan (jamba, ijakadi agbara, bbl) apakan nikan ti awọn iyipada lati inu jara waye, lẹhinna igi naa yoo wa ni ipo ti ko ni ibamu.

Ojutu ibile kan fun ṣiṣe aibikita data data ni lati ṣafikun afikun igbekalẹ data lori disiki lẹgbẹẹ igi B-igi idunadura kan, ti a tun mọ ni iwe kikọ-iwaju (WAL). O jẹ faili ni ipari eyiti a ti kọ iṣẹ ti a pinnu ṣaaju ki o to yipada igi B funrararẹ. Nitorinaa, ti o ba rii ibajẹ data lakoko iwadii ara ẹni, ibi ipamọ data n ṣakiyesi log lati fi ararẹ le.

LMDB ti yan ọna ti o yatọ gẹgẹbi ẹrọ ifarada ẹbi, ti a npe ni ẹda-lori-kọ. Kokoro rẹ ni pe dipo mimu data dojuiwọn lori oju-iwe ti o wa tẹlẹ, o kọkọ daakọ rẹ patapata ati ṣe gbogbo awọn iyipada ninu ẹda naa.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Nigbamii ti, ni ibere fun data imudojuiwọn lati wa, o jẹ dandan lati yi ọna asopọ pada si ipade ti o ti di lọwọlọwọ ni ipade obi rẹ. Niwọn bi o tun nilo lati yipada fun eyi, o tun daakọ tẹlẹ. Awọn ilana tẹsiwaju recursively gbogbo ọna lati root. Ohun ikẹhin lati yipada ni data lori oju-iwe meta

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ti ilana naa ba ṣubu lojiji lakoko ilana imudojuiwọn, lẹhinna boya oju-iwe meta tuntun kii yoo ṣẹda, tabi kii yoo kọ si disk patapata, ati pe checksum yoo jẹ aṣiṣe. Ninu boya ninu awọn ọran meji wọnyi, awọn oju-iwe tuntun yoo jẹ eyiti a ko le de ọdọ, ṣugbọn awọn ti atijọ ko ni kan. Eyi yọkuro iwulo fun LMDB lati kọ akọọlẹ iwaju lati ṣetọju aitasera data. Ni otitọ, ilana ti ibi ipamọ data lori disiki ti a ṣalaye loke ni nigbakannaa gba iṣẹ rẹ. Awọn isansa ti akọọlẹ iṣowo ti o fojuhan jẹ ọkan ninu awọn ẹya ti LMDB ti o pese iyara kika data giga

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Apẹrẹ ti o yọrisi, ti a pe ni append-nikan B-igi, nipa ti ara pese ipinya idunadura ati ẹya pupọ. Ni LMDB, iṣowo ṣiṣi kọọkan ni nkan ṣe pẹlu gbongbo igi ti o wulo lọwọlọwọ. Titi di igba ti iṣowo naa yoo pari, awọn oju-iwe ti igi ti o ni nkan ṣe pẹlu rẹ kii yoo yipada tabi tun lo fun awọn ẹya tuntun ti data naa, nitorinaa, o le ṣiṣẹ niwọn igba ti o ba fẹ pẹlu ṣeto data deede ti o wulo ni akoko yẹn. idunadura naa ṣii, paapaa ti ibi ipamọ naa ba tẹsiwaju lati ni imudojuiwọn ni akoko yii. Eyi ni pataki ti isodipupo, ṣiṣe LMDB jẹ orisun data pipe fun olufẹ wa UICollectionView. Lẹhin ti ṣiṣi idunadura kan, ko si iwulo lati mu ifẹsẹtẹ iranti ti ohun elo naa pọ si nipa fifaju fifa data lọwọlọwọ sinu diẹ ninu eto iranti inu, nitori iberu ti a fi silẹ laisi nkankan. Ẹya yii ṣe iyatọ LMDB lati SQLite kanna, eyiti ko le ṣogo iru ipinya lapapọ. Lẹhin ti ṣiṣi awọn iṣowo meji ni igbehin ati paarẹ igbasilẹ kan laarin ọkan ninu wọn, kii yoo ṣee ṣe lati gba igbasilẹ kanna laarin ọkan ti o ku keji.

Apa isipade ti owo naa jẹ agbara agbara ti o ga julọ ti iranti foju. Ifaworanhan naa fihan kini eto data data yoo dabi ti o ba jẹ atunṣe nigbakanna pẹlu awọn iṣowo kika kika 3 ti n wo awọn ẹya oriṣiriṣi ti database. Niwọn bi LMDB ko le tun lo awọn apa arọwọto lati awọn gbongbo ti o ni nkan ṣe pẹlu awọn iṣowo lọwọlọwọ, ile itaja ko ni yiyan bikoṣe lati pin gbongbo kẹrin miiran ni iranti ati lẹẹkansii awọn oju-iwe ti a yipada labẹ rẹ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Nibi yoo jẹ iwulo lati ranti apakan lori awọn faili ti o ya aworan iranti. O dabi pe afikun agbara ti iranti foju ko yẹ ki o ṣe aibalẹ wa pupọ, nitori ko ṣe alabapin si ifẹsẹtẹ iranti ti ohun elo naa. Bibẹẹkọ, ni akoko kanna, o ṣe akiyesi pe iOS jẹ alara pupọ ni ipinpin rẹ, ati pe a ko le, bii lori olupin tabi tabili tabili kan, pese agbegbe LMDB kan ti terabyte 1 ati pe ko ronu nipa ẹya yii rara. Ti o ba ṣeeṣe, o yẹ ki o gbiyanju lati ṣe igbesi aye awọn iṣowo ni kukuru bi o ti ṣee.

4. Ṣiṣe eto eto data lori oke API iye-bọtini

Jẹ ki a bẹrẹ itupalẹ API wa nipa wiwo awọn abstractions ipilẹ ti a pese nipasẹ LMDB: agbegbe ati awọn apoti isura data, awọn bọtini ati awọn iye, awọn iṣowo ati awọn kọsọ.

Akọsilẹ kan nipa awọn atokọ koodu

Gbogbo awọn iṣẹ ni gbangba LMDB API da abajade iṣẹ wọn pada ni irisi koodu aṣiṣe, ṣugbọn ninu gbogbo awọn atokọ ti o tẹle, ijẹrisi rẹ ti yọkuro nitori kukuru. Ni iṣe, a paapaa lo tiwa lati ṣe ajọṣepọ pẹlu ibi ipamọ naa. orita C ++ wrappers lmdbxx, ninu eyiti awọn aṣiṣe ti wa ni materialized bi C ++ imukuro.

Gẹgẹbi ọna ti o yara ju lati sopọ LMDB si iṣẹ akanṣe fun iOS tabi macOS, Mo daba CocoaPod mi POSLMDB.

4.1. Awọn abstractions ipilẹ

Ayika

Ilana MDB_env jẹ ibi ipamọ ti ipo inu ti LMDB. Idile iṣẹ ti a ti sọ tẹlẹ mdb_env faye gba o lati tunto diẹ ninu awọn ti awọn oniwe-ini. Ni ọran ti o rọrun julọ, ibẹrẹ engine dabi eyi.

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

Ninu ohun elo awọsanma Mail.ru, a yipada awọn iye aiyipada ti awọn aye meji nikan.

Eyi akọkọ jẹ iwọn aaye adirẹsi foju ti faili ipamọ ti ya aworan si. Laanu, paapaa lori ẹrọ kanna, iye pato le yatọ si pataki lati ṣiṣe lati ṣiṣẹ. Lati ṣe akiyesi ẹya yii ti iOS, iwọn didun ipamọ ti o pọju ti yan ni agbara. Bibẹrẹ lati iye kan, o ti jẹ idaji idaji titi iṣẹ naa mdb_env_open yoo ko pada a esi ti o yatọ lati ENOMEM. Ni imọran, ọna idakeji tun wa - akọkọ pin iranti ti o kere julọ si ẹrọ, ati lẹhinna, nigbati awọn aṣiṣe ba gba, MDB_MAP_FULL, pọ si. Sibẹsibẹ, o jẹ ẹgún diẹ sii. Idi ni pe ilana fun tun-pin iranti iranti (atunṣe) nipa lilo iṣẹ naa mdb_env_set_map_size invalidates gbogbo awọn nkan (kọsọ, lẹkọ, awọn bọtini ati awọn iye) gba tẹlẹ lati awọn engine. Gbigba yiyi ti awọn iṣẹlẹ sinu akọọlẹ koodu yoo ja si ilolu pataki rẹ. Ti, sibẹsibẹ, iranti foju ṣe pataki pupọ si ọ, lẹhinna eyi le jẹ idi kan lati wo ni pẹkipẹki orita ti o ti lọ siwaju. MDBX, nibiti laarin awọn ẹya ti a kede ni “atunṣe iwọn data aifọwọyi lori-fly”.

Paramita keji, iye aiyipada eyiti ko baamu wa, ṣe ilana awọn ẹrọ ti ṣiṣe idaniloju aabo okun. Laanu, o kere ju iOS 10 ni awọn iṣoro pẹlu atilẹyin fun ibi ipamọ agbegbe o tẹle ara. Fun idi eyi, ninu apẹẹrẹ loke, ibi ipamọ ti ṣii pẹlu asia MDB_NOTLS. Ni afikun si eyi, o tun jẹ dandan orita C ++ murasilẹ lmdbxxlati ge awọn oniyipada pẹlu ẹda yii ati ninu rẹ.

Awọn apoti isura infomesonu

Ibi ipamọ data jẹ apẹẹrẹ B-igi lọtọ, eyiti a sọrọ ni oke. Ṣiṣii rẹ waye laarin idunadura kan, eyiti o le dabi ajeji diẹ ni akọkọ.

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);

Nitootọ, idunadura kan ni LMDB jẹ ibi ipamọ, kii ṣe aaye data kan pato. Agbekale yii gba ọ laaye lati ṣe awọn iṣẹ atomiki lori awọn nkan ti o wa ni awọn apoti isura data oriṣiriṣi. Ni imọran, eyi ṣii iṣeeṣe ti awọn tabili awoṣe ni irisi awọn apoti isura infomesonu oriṣiriṣi, ṣugbọn ni akoko kan Mo gba ọna ti o yatọ, ti a ṣalaye ni alaye ni isalẹ.

Awọn bọtini ati awọn iye

Ilana MDB_val awoṣe awọn Erongba ti awọn mejeeji bọtini ati ki o iye. Ibi ipamọ ko ni imọran nipa imọ-ọrọ wọn. Fun u, nkan miiran jẹ titobi ti awọn baiti ti iwọn ti a fun. Iwọn bọtini ti o pọju jẹ 512 baiti.

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

Lilo olufiwera, ile-itaja naa to awọn bọtini ni ọna ti o ga. Ti o ko ba paarọ rẹ pẹlu ti ara rẹ, lẹhinna aiyipada yoo ṣee lo, eyiti o to wọn baiti-byte ni aṣẹ lexicographic.

Awọn iṣowo

Ilana iṣowo naa jẹ apejuwe ni apejuwe ninu ti tẹlẹ ipin, nitorinaa Emi yoo tun ṣe awọn ohun-ini akọkọ wọn ni ṣoki:

  1. Ṣe atilẹyin fun gbogbo awọn ohun-ini ipilẹ ACID: atomity, aitasera, ipinya ati dede. Emi ko le ṣe iranlọwọ ṣugbọn ṣe akiyesi pe kokoro kan wa ni awọn ofin ti agbara lori macOS ati iOS ti o wa titi ni MDBX. O le ka diẹ sii ninu wọn README.
  2. Ọna si multithreading jẹ apejuwe nipasẹ ero “onkqwe kan / awọn oluka pupọ”. Awọn onkqwe dènà ara wọn, ṣugbọn ko ṣe idiwọ awọn onkawe. Awọn oluka ko ṣe dina awọn onkọwe tabi ara wọn.
  3. Support fun iteeye lẹkọ.
  4. Multiversion support.

Ilọpo pupọ ni LMDB dara pupọ pe Mo fẹ lati ṣafihan rẹ ni iṣe. Lati koodu ti o wa ni isalẹ o le rii pe idunadura kọọkan n ṣiṣẹ pẹlu ẹya gangan ti data data ti o wa lọwọlọwọ ni akoko ti o ṣii, ti ya sọtọ patapata lati gbogbo awọn ayipada atẹle. Bibẹrẹ ibi ipamọ ati fifi igbasilẹ idanwo kan si ko ṣe aṣoju ohunkohun ti o nifẹ, nitorinaa awọn irubo wọnyi ni a fi silẹ labẹ apanirun.

Fifi titẹ sii idanwo kan

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);

Mo ṣeduro pe ki o gbiyanju ẹtan kanna pẹlu SQLite ki o wo ohun ti o ṣẹlẹ.

Multiversion mu awọn anfani to wuyi pupọ wa si igbesi aye ti olupilẹṣẹ iOS kan. Lilo ohun-ini yii, o le ni irọrun ati nipa ti ara ṣatunṣe oṣuwọn imudojuiwọn ti orisun data fun awọn fọọmu iboju, da lori awọn ero iriri olumulo. Fun apẹẹrẹ, jẹ ki a mu ẹya kan ti ohun elo awọsanma Mail.ru gẹgẹbi ikojọpọ akoonu lati ibi iṣafihan eto eto. Pẹlu asopọ to dara, alabara ni anfani lati ṣafikun ọpọlọpọ awọn fọto fun iṣẹju keji si olupin naa. Ti o ba ṣe imudojuiwọn lẹhin igbasilẹ kọọkan UICollectionView pẹlu akoonu media ninu awọsanma olumulo, o le gbagbe nipa 60 fps ati yiyi dan lakoko ilana yii. Lati ṣe idiwọ awọn imudojuiwọn iboju loorekoore, o nilo lati ṣe idinwo bakan oṣuwọn eyiti data n yipada ni abẹlẹ UICollectionViewDataSource.

Ti aaye data ko ba ṣe atilẹyin isodipupo ati gba ọ laaye lati ṣiṣẹ nikan pẹlu ipo lọwọlọwọ lọwọlọwọ, lẹhinna lati ṣẹda fọtoyiya data akoko-iduroṣinṣin o nilo lati daakọ boya si diẹ ninu eto data inu-iranti tabi si tabili igba diẹ. Eyikeyi awọn ọna wọnyi jẹ gbowolori pupọ. Ninu ọran ti ibi-ipamọ iranti, a gba awọn idiyele mejeeji ni iranti, ti o ṣẹlẹ nipasẹ titoju awọn nkan ti a ṣe, ati ni akoko, ni nkan ṣe pẹlu awọn iyipada ORM laiṣe. Bi fun tabili igba diẹ, eyi jẹ idunnu paapaa gbowolori diẹ sii, ti o ni oye nikan ni awọn ọran ti kii ṣe bintin.

Ojutu isodipupo LMDB yanju iṣoro ti mimu orisun data iduroṣinṣin ni ọna didara pupọ. O to lati ṣii idunadura kan ati voila - titi ti a fi pari rẹ, eto data jẹ iṣeduro lati wa titi. Imọye fun iyara imudojuiwọn rẹ ti wa ni kikun ni ọwọ ti Layer igbejade, laisi ori ti awọn orisun pataki.

Awọn kọsọ

Awọn kọsọ n pese ẹrọ kan fun aṣetunṣe lẹsẹsẹ lori awọn orisii iye-bọtini nipasẹ lilọ kiri igi-B. Laisi wọn, kii yoo ṣee ṣe lati ni imunadoko awọn tabili ti o wa ninu ibi ipamọ data, eyiti a yipada si bayi.

4.2. Table Modelling

Ohun-ini ti pipaṣẹ bọtini gba ọ laaye lati kọ abstraction ipele giga gẹgẹbi tabili lori oke awọn abstractions ipilẹ. Jẹ ki a gbero ilana yii nipa lilo apẹẹrẹ tabili akọkọ ti alabara awọsanma, eyiti o ṣafipamọ alaye nipa gbogbo awọn faili ati awọn folda olumulo.

Eto tabili

Ọkan ninu awọn oju iṣẹlẹ ti o wọpọ fun eyiti eto tabili pẹlu igi folda yẹ ki o ṣe deede ni yiyan gbogbo awọn eroja ti o wa laarin itọsọna ti a fun. Akojọ adjacency. Lati ṣe imuse rẹ lori oke ibi ipamọ iye-bọtini, o jẹ dandan lati to awọn bọtini ti awọn faili ati awọn folda ni iru ọna ti a ṣe akojọpọ wọn da lori awọn ọmọ ẹgbẹ wọn ninu itọsọna obi. Ni afikun, lati le ṣafihan awọn akoonu ti itọsọna naa ni fọọmu ti o faramọ si olumulo Windows kan (awọn folda akọkọ, lẹhinna awọn faili, lẹsẹsẹ lẹsẹsẹ), o jẹ dandan lati ṣafikun awọn aaye afikun ti o baamu ninu bọtini.

Aworan ti o wa ni isalẹ fihan bi, da lori iṣẹ-ṣiṣe ti o wa ni ọwọ, aṣoju awọn bọtini ni irisi titobi baiti le dabi. Awọn baiti pẹlu idamo ti itọsọna obi (pupa) ni a gbe ni akọkọ, lẹhinna pẹlu iru (alawọ ewe) ati ni iru pẹlu orukọ (buluu) Ti a ṣe lẹsẹsẹ nipasẹ olufiwewe LMDB aiyipada ni ilana lexicographical, wọn ti paṣẹ ni ọna kika ọna ti a beere. Awọn bọtini lilọ kiri lẹsẹsẹ pẹlu ìpele pupa kanna fun wa ni awọn iye ti o somọ ni aṣẹ ti wọn yẹ ki o ṣafihan ni wiwo olumulo (ni apa ọtun), laisi nilo eyikeyi iṣẹ ṣiṣe lẹhin afikun.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Serializing Keys ati iye

Ọpọlọpọ awọn ọna fun serializing ohun ti a ti se ni agbaye. Niwọn igba ti a ko ni ibeere miiran yatọ si iyara, a yan iyara ti o ṣeeṣe fun ara wa - idalẹnu iranti ti o wa nipasẹ apẹẹrẹ ti eto ede C. Nitorinaa, bọtini ti nkan ilana le jẹ apẹrẹ pẹlu eto atẹle yii. NodeKey.

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

Lati fipamọ NodeKey ni ibi ipamọ ti o nilo ni nkan MDB_val ipo ijuboluwole data si adirẹsi ti ibẹrẹ ti eto naa, ati ṣe iṣiro iwọn wọn pẹlu iṣẹ naa sizeof.

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

Ni ori akọkọ lori awọn ibeere yiyan data data, Mo mẹnuba idinku awọn ipin agbara agbara laarin awọn iṣẹ CRUD gẹgẹbi ipin yiyan pataki. koodu iṣẹ serialize fihan bi ninu ọran ti LMDB wọn le yago fun patapata nigbati o ba nfi awọn igbasilẹ titun sii sinu ibi ipamọ data. Eto baiti ti nwọle lati ọdọ olupin ni a kọkọ yipada si awọn ẹya akopọ, ati lẹhinna a da wọn silẹ lainidi sinu ibi ipamọ. Ṣiyesi pe ko si awọn ipin agbara tun wa laarin LMDB, o le gba ipo ikọja nipasẹ awọn iṣedede iOS - lo iranti akopọ nikan lati ṣiṣẹ pẹlu data ni gbogbo ọna lati nẹtiwọọki si disiki naa!

Awọn bọtini ibere pẹlu alakomeji comparator

Ibasepo ibere bọtini jẹ pato nipasẹ iṣẹ pataki kan ti a npe ni comparator. Níwọ̀n bí ẹ́ńjìnnì náà kò ti mọ nǹkan kan nípa ìtumọ̀ ìtumọ̀ ti àwọn báiti tí wọ́n ní, olùfiwéra àìtọ́ náà kò ní yíyàn kankan bí kò ṣe láti ṣètò àwọn kọ́kọ́rọ́ náà ní ìtòlẹ́sẹẹsẹ ọ̀rọ̀ ìtumọ̀ ọ̀rọ̀-ìsọ̀rọ̀, yíyí sí ìfiwéra byte-by-byte. Lilo rẹ lati ṣeto awọn ẹya jẹ iru si irun pẹlu ãke gige kan. Sibẹsibẹ, ni awọn ọran ti o rọrun Mo rii pe ọna yii jẹ itẹwọgba. Yiyan ti wa ni apejuwe ni isalẹ, ṣugbọn nibi Emi yoo ṣe akiyesi awọn rake meji ti o tuka ni ọna yii.

Ohun akọkọ lati ranti ni aṣoju iranti ti awọn iru data akọkọ. Nitorinaa, lori gbogbo awọn ẹrọ Apple, awọn oniyipada odidi ti wa ni ipamọ ni ọna kika Eniyan kekere. Eyi tumọ si pe baiti pataki ti o kere julọ yoo wa ni apa osi, ati pe kii yoo ṣee ṣe lati to awọn nọmba odidi nipa lilo afiwe baiti-nipasẹ-baiti. Fun apẹẹrẹ, igbiyanju lati ṣe eyi pẹlu ṣeto awọn nọmba lati 0 si 511 yoo ṣe abajade atẹle naa.

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

Lati yanju iṣoro yii, awọn odidi gbọdọ wa ni ipamọ sinu bọtini ni ọna kika ti o dara fun olutọpa baiti-baiti. Awọn iṣẹ lati inu ẹbi yoo ṣe iranlọwọ fun ọ lati ṣe iyipada to wulo hton* (gegebi bi htons fun ni ilopo-baiti awọn nọmba lati apẹẹrẹ).

Ọna kika fun aṣoju awọn okun ni siseto jẹ, bi o ṣe mọ, odidi kan itan. Ti awọn atunmọ ti awọn gbolohun ọrọ, bakanna bi fifi koodu ti a lo lati ṣe aṣoju wọn ni iranti, daba pe o le jẹ diẹ sii ju baiti kan fun ihuwasi kan, lẹhinna o dara lati fi erongba ti lilo olufiwe aiyipada silẹ lẹsẹkẹsẹ.

Ohun keji lati tọju ni lokan ni titete agbekale alakojo aaye be. Nitori wọn, awọn baiti pẹlu awọn iye idoti le ṣe agbekalẹ ni iranti laarin awọn aaye, eyiti, nitorinaa, fọ yiyan baiti-baiti. Lati yọ idoti kuro, o nilo lati sọ awọn aaye ni ilana asọye ti o muna, titọju awọn ofin titete ni ọkan, tabi lo abuda ninu ikede igbekalẹ. packed.

Awọn bọtini ibere pẹlu ohun ita comparator

Ilana lafiwe bọtini le jẹ idiju pupọ fun alakomeji alakomeji. Ọkan ninu awọn idi pupọ ni wiwa awọn aaye imọ-ẹrọ laarin awọn ẹya. Emi yoo ṣapejuwe iṣẹlẹ wọn nipa lilo apẹẹrẹ bọtini kan fun apakan ilana ti o ti mọ tẹlẹ si wa.

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

Pelu ayedero rẹ, ninu ọpọlọpọ awọn ọran o nlo iranti pupọ. Ifipamọ fun orukọ gba soke 256 awọn baiti, botilẹjẹpe ni apapọ faili ati awọn orukọ folda ṣọwọn kọja awọn ohun kikọ 20-30.

Ọkan ninu awọn imọ-ẹrọ boṣewa fun iṣapeye iwọn igbasilẹ kan ni lati “ge” si iwọn gangan. Koko-ọrọ rẹ ni pe awọn akoonu ti gbogbo awọn aaye gigun-iyipada ti wa ni ipamọ sinu ifipamọ ni opin eto naa, ati pe gigun wọn wa ni ipamọ ni awọn oniyipada lọtọ. Ni ibamu si ọna yii, bọtini naa NodeKey ti wa ni yipada bi wọnyi.

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

Siwaju si, nigba serializing, awọn data iwọn ti wa ni ko pato sizeof gbogbo be, ati awọn iwọn ti gbogbo awọn aaye ti wa ni a ti o wa titi ipari plus awọn iwọn ti awọn kosi lo apa ti awọn saarin.

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

Bi abajade ti atunṣe, a gba awọn ifowopamọ pataki ni aaye ti o gba nipasẹ awọn bọtini. Sibẹsibẹ, nitori aaye imọ-ẹrọ nameLength, olupilẹṣẹ alakomeji aiyipada ko dara fun lafiwe bọtini. Ti a ko ba paarọ rẹ pẹlu tiwa, lẹhinna ipari ti orukọ yoo jẹ ipin pataki ti o ga julọ ni tito lẹsẹsẹ ju orukọ funrararẹ lọ.

LMDB gba aaye data kọọkan laaye lati ni iṣẹ lafiwe bọtini tirẹ. Eyi ni a ṣe nipa lilo iṣẹ naa mdb_set_compare muna ṣaaju ṣiṣi. Fun awọn idi ti o han gbangba, ko le yipada ni gbogbo igbesi aye data data. Olufiwera gba awọn bọtini meji ni ọna kika alakomeji bi titẹ sii, ati ni iṣejade o da abajade lafiwe pada: kere ju (-1), tobi ju (1) tabi dogba si (0). Pseudocode fun NodeKey o dabi iyẹn.

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

Niwọn igba ti gbogbo awọn bọtini inu data jẹ iru kanna, sisọ aṣoju baiti wọn lainidi si iru eto bọtini ohun elo jẹ ofin. Nuance kan wa nibi, ṣugbọn yoo jiroro ni isalẹ ni apakan “Awọn igbasilẹ kika”.

Serializing iye

LMDB n ṣiṣẹ ni iyara pupọ pẹlu awọn bọtini ti awọn igbasilẹ ti o fipamọ. Ifiwewe wọn pẹlu ara wọn waye laarin ilana ti eyikeyi iṣẹ ti a lo, ati iṣẹ ti gbogbo ojutu da lori iyara ti comparator. Ni agbaye pipe, olufiwewe alakomeji aiyipada yẹ ki o to lati ṣe afiwe awọn bọtini, ṣugbọn ti o ba ni lati lo tirẹ, lẹhinna ilana fun awọn bọtini deserializing ninu rẹ yẹ ki o yara bi o ti ṣee.

Ibi ipamọ data ko nifẹ paapaa ni apakan iye ti igbasilẹ (iye). Iyipada rẹ lati aṣoju baiti si ohun kan waye nikan nigbati koodu ohun elo ti nilo tẹlẹ, fun apẹẹrẹ, lati ṣafihan loju iboju. Niwọn igba ti eyi n ṣẹlẹ diẹ ṣọwọn, awọn ibeere iyara fun ilana yii ko ṣe pataki pupọ, ati ninu imuse rẹ a ni ominira pupọ diẹ sii lati dojukọ wewewe Fun apẹẹrẹ, lati serialize metadata nipa awọn faili ti ko tii ṣe igbasilẹ, a lo. NSKeyedArchiver.

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

Sibẹsibẹ, awọn igba wa nigbati iṣẹ ṣiṣe tun ṣe pataki. Fun apẹẹrẹ, nigba fifipamọ alaye metain nipa ọna kika faili ti awọsanma olumulo, a lo idalẹnu iranti kanna ti awọn nkan. Ifojusi ti iṣẹ-ṣiṣe ti ipilẹṣẹ oniduro serialized ti wọn ni otitọ pe awọn eroja ti itọsọna kan jẹ apẹrẹ nipasẹ awọn ipo-iṣẹ ti awọn kilasi.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Lati ṣe imuse rẹ ni ede C, awọn aaye kan pato ti awọn ajogun ni a gbe sinu awọn ẹya lọtọ, ati pe asopọ wọn pẹlu ipilẹ kan jẹ pato nipasẹ aaye iru iṣọkan. Awọn akoonu gangan ti iṣọkan naa jẹ pato nipasẹ iru abuda imọ-ẹrọ.

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

Fifi ati mimu awọn igbasilẹ

Awọn serialized bọtini ati iye le wa ni afikun si awọn itaja. Lati ṣe eyi, lo iṣẹ naa mdb_put.

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

Ni ipele iṣeto, ibi ipamọ le gba laaye tabi ni idinamọ lati tọju ọpọlọpọ awọn igbasilẹ pẹlu bọtini kanna Ti o ba jẹ idinamọ ti awọn bọtini itẹwe, lẹhinna nigba fifi igbasilẹ sii, o le pinnu boya mimu imudojuiwọn igbasilẹ ti o wa tẹlẹ gba laaye tabi rara. Ti o ba jẹ pe fraying le waye nikan bi abajade aṣiṣe ninu koodu, lẹhinna o le daabobo ararẹ lọwọ rẹ nipa sisọ asia naa. NOOVERWRITE.

Awọn titẹ sii kika

Lati ka awọn igbasilẹ ni LMDB, lo iṣẹ naa mdb_get. Ti bata-iye bọtini jẹ aṣoju nipasẹ awọn ẹya ti a da silẹ tẹlẹ, lẹhinna ilana yii dabi eyi.

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

Atokọ ti a gbekalẹ fihan bi serialization nipasẹ idalenu eto ngbanilaaye lati yọkuro kuro ninu awọn ipin agbara kii ṣe nigba kikọ nikan, ṣugbọn nigba kika data. Ti a gba lati iṣẹ mdb_get ijuboluwole wo gangan ni foju iranti adirẹsi ibi ti awọn database tọjú awọn baiti oniduro ti awọn ohun. Ni otitọ, a gba iru ORM kan ti o pese iyara kika data ti o ga pupọ ti o fẹrẹ jẹ ọfẹ. Pelu gbogbo ẹwa ti ọna, o jẹ dandan lati ranti awọn ẹya pupọ ti o ni nkan ṣe pẹlu rẹ.

  1. Fun idunadura kika nikan, itọka si ọna iye jẹ iṣeduro lati wa wulo nikan titi ti idunadura naa yoo ti pa. Gẹgẹbi a ti ṣe akiyesi tẹlẹ, awọn oju-iwe B-igi lori eyiti ohun kan wa, o ṣeun si ipilẹ ẹda-lori-kikọ, ko yipada niwọn igba ti wọn ba tọka nipasẹ o kere ju idunadura kan. Ni akoko kanna, ni kete ti iṣowo ti o kẹhin ti o ni nkan ṣe pẹlu wọn pari, awọn oju-iwe naa le tun lo fun data tuntun. Ti o ba jẹ dandan fun awọn nkan lati ye idunadura ti o ṣẹda wọn, lẹhinna wọn tun ni lati daakọ.
  2. Fun idunadura kika kika, itọkasi si eto iye abajade yoo wulo nikan titi di ilana iyipada akọkọ (kikọ tabi piparẹ data).
  3. Biotilejepe awọn be NodeValue kii ṣe ni kikun, ṣugbọn gige (wo apakan apakan “Bibere awọn bọtini lilo olutọpa ita”), o le wọle si awọn aaye rẹ lailewu nipasẹ itọka. Ohun akọkọ kii ṣe lati kọ ọ silẹ!
  4. Labẹ ọran kankan o yẹ ki eto naa yipada nipasẹ itọka ti o gba. Gbogbo awọn ayipada gbọdọ wa ni ṣe nikan nipasẹ ọna mdb_put. Sibẹsibẹ, laibikita bi o ṣe le ṣe eyi, kii yoo ṣee ṣe, nitori agbegbe iranti nibiti eto yii wa ti ya aworan ni ipo kika nikan.
  5. Ṣe atunṣe faili kan si aaye adirẹsi ilana fun idi ti, fun apẹẹrẹ, jijẹ iwọn ipamọ ti o pọju nipa lilo iṣẹ naa mdb_env_set_map_size patapata sọ gbogbo awọn iṣowo ati awọn nkan ti o jọmọ ni gbogbogbo ati awọn itọka si awọn nkan kan ni pataki.

Nikẹhin, ẹya miiran jẹ arekereke pupọ pe ṣiṣafihan itumọ rẹ ko baamu si paragirafi miiran kan. Ninu ori nipa igi B, Mo fun ni aworan kan ti bii awọn oju-iwe rẹ ṣe ṣeto ni iranti. O tẹle lati eyi pe adirẹsi ti ibẹrẹ ti ifipamọ pẹlu data serialized le jẹ lainidii lainidii. Nitori eyi, awọn ijuboluwole si wọn gba ninu awọn be MDB_val ati pe o dinku si itọka si ọna kan, o wa ni aiṣedeede ni ọran gbogbogbo. Ni akoko kanna, awọn ayaworan ti diẹ ninu awọn eerun (ninu ọran ti iOS eyi jẹ armv7) nilo pe adirẹsi ti eyikeyi data jẹ ọpọ ti iwọn ti ọrọ ẹrọ tabi, ni awọn ọrọ miiran, iwọn bit ti eto naa ( fun armv7 o jẹ 32 die-die). Ni gbolohun miran, isẹ kan bi *(int *foo)0x800002 lori wọn jẹ deede lati sa fun ati ki o nyorisi si ipaniyan pẹlu kan idajo EXC_ARM_DA_ALIGN. Awọn ọna meji lo wa lati yago fun iru ayanmọ ibanujẹ bẹ.

Ni igba akọkọ ti hó si isalẹ lati daakọ alakoko ti data sinu kan ti o han ni deedee eto. Fun apẹẹrẹ, lori olufiwewe aṣa eyi yoo ṣe afihan bi atẹle.

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

Ọna miiran ni lati sọ fun olupilẹṣẹ ni ilosiwaju pe awọn ẹya iye-bọtini le ma wa ni isunmọ. aligned(1). Lori ARM o le ni ipa kanna se aseyori ati lilo awọn aba ti abuda. Ṣiyesi pe o tun ṣe iranlọwọ lati mu aaye ti o gba nipasẹ eto naa, ọna yii dabi ẹni pe o dara julọ fun mi, botilẹjẹpe awọn itọsọna si ilosoke ninu iye owo ti awọn iṣẹ wiwọle data.

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

Awọn ibeere ibiti

Lati ṣe atunṣe lori ẹgbẹ kan ti awọn igbasilẹ, LMDB n pese abstraction ikọsọ kan. Jẹ ki a wo bii o ṣe le ṣiṣẹ pẹlu rẹ nipa lilo apẹẹrẹ tabili kan pẹlu olumulo awọsanma metadata ti faramọ tẹlẹ si wa.

Gẹgẹbi apakan ti iṣafihan atokọ ti awọn faili ninu itọsọna kan, o jẹ dandan lati wa gbogbo awọn bọtini pẹlu eyiti awọn faili ọmọ ati awọn folda ni nkan ṣe. Ni awọn abala ti tẹlẹ ti a ṣeto awọn bọtini NodeKey iru awọn ti won ti wa ni nipataki paṣẹ nipasẹ awọn ID ti awọn obi liana. Nitorinaa, ni imọ-ẹrọ, iṣẹ-ṣiṣe ti gbigba awọn akoonu ti folda kan wa si isalẹ lati gbe kọsọ si aala oke ti ẹgbẹ awọn bọtini pẹlu ami-iṣaaju ti a fun ati lẹhinna aṣetunṣe si aala isalẹ.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ipin oke le ṣee ri taara nipasẹ wiwa lẹsẹsẹ. Lati ṣe eyi, a gbe kọsọ si ibẹrẹ ti gbogbo atokọ ti awọn bọtini ni ibi ipamọ data ati siwaju sii titi bọtini kan pẹlu idanimọ ti itọsọna obi yoo han ni isalẹ rẹ. Ọna yii ni awọn alailanfani 2 ti o han gbangba:

  1. Idiju wiwa laini, botilẹjẹpe, bi a ti mọ, ni awọn igi ni gbogbogbo ati ni igi B ni pataki o le ṣee ṣe ni akoko logarithmic.
  2. Ni asan, gbogbo awọn oju-iwe ti o ṣaju eyi ti a n wa ni a gbe soke lati faili si iranti akọkọ, eyiti o jẹ gbowolori pupọ.

Ni Oriire, LMDB API n pese ọna ti o munadoko lati gbe kọsọ naa ni ibẹrẹ. Lati ṣe eyi, o nilo lati ṣe ina bọtini kan ti iye rẹ kere ju tabi dọgba si bọtini ti o wa ni aala oke ti aarin. Fun apẹẹrẹ, ni ibatan si atokọ ni nọmba loke, a le ṣe bọtini kan ninu eyiti aaye naa parentId yoo dogba si 2, ati gbogbo awọn iyokù ti wa ni kún pẹlu odo. Iru bọtini ti o kun ni apakan ti wa ni ipese si titẹ sii iṣẹ mdb_cursor_get afihan isẹ 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);

Ti a ba rii agbegbe oke ti ẹgbẹ awọn bọtini, lẹhinna a ṣe atunbere lori rẹ titi boya a pade tabi bọtini naa pade miiran. parentId, tabi awọn bọtini kii yoo pari rara

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

Ohun ti o dara ni pe gẹgẹbi apakan ti aṣetunṣe nipa lilo mdb_cursor_get, a gba kii ṣe bọtini nikan, ṣugbọn tun iye naa. Ti, lati le mu awọn ipo iṣapẹẹrẹ ṣẹ, o nilo lati ṣayẹwo, laarin awọn ohun miiran, awọn aaye lati apakan iye ti igbasilẹ, lẹhinna wọn wa ni wiwọle si laisi awọn idari afikun.

4.3. Awoṣe ibasepo laarin awọn tabili

Ni bayi, a ti ṣakoso lati gbero gbogbo awọn ẹya ti ṣiṣe apẹrẹ ati ṣiṣẹ pẹlu data data tabili kan. A le sọ pe tabili jẹ ṣeto awọn igbasilẹ lẹsẹsẹ ti o ni iru awọn orisii iye-bọtini kanna. Ti o ba ṣe afihan bọtini kan bi onigun mẹrin ati iye to somọ bi parallelepiped, o gba aworan wiwo ti aaye data.

Awọn

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Bibẹẹkọ, ni igbesi aye gidi o ṣọwọn ṣee ṣe lati gba nipasẹ pẹlu ẹjẹ kekere. Nigbagbogbo ninu aaye data o nilo, ni akọkọ, lati ni awọn tabili pupọ, ati keji, lati ṣe awọn yiyan ninu wọn ni aṣẹ ti o yatọ si bọtini akọkọ. Abala ikẹhin yii jẹ iyasọtọ si awọn ọran ti ẹda ati isọpọ wọn.

Awọn tabili atọka

Ohun elo awọsanma naa ni apakan "Gallery". O ṣe afihan akoonu media lati gbogbo awọsanma, lẹsẹsẹ nipasẹ ọjọ. Lati mu iru yiyan ṣiṣẹ ni aipe, lẹgbẹẹ tabili akọkọ o nilo lati ṣẹda ọkan miiran pẹlu iru awọn bọtini tuntun. Wọn yoo ni aaye kan pẹlu ọjọ ti a ṣẹda faili naa, eyiti yoo ṣiṣẹ bi ami iyasọtọ akọkọ. Nitoripe awọn bọtini titun tọka data kanna gẹgẹbi awọn bọtini ti o wa ninu tabili akọkọ, wọn pe wọn ni awọn bọtini atọka. Ni aworan ni isalẹ wọn ṣe afihan ni osan.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Lati le ya awọn bọtini ti awọn tabili oriṣiriṣi lọtọ si ara wọn laarin ibi ipamọ data kanna, tabiliId aaye imọ-ẹrọ ni afikun si gbogbo wọn. Nipa ṣiṣe ni pataki ti o ga julọ fun yiyan, a yoo ṣaṣeyọri akojọpọ awọn bọtini ni akọkọ nipasẹ awọn tabili, ati laarin awọn tabili - ni ibamu si awọn ofin tiwa.

Bọtini atọka tọka data kanna gẹgẹbi bọtini akọkọ. Imuse taara ti ohun-ini yii nipasẹ sisọpọ pẹlu ẹda kan ti apakan iye ti bọtini akọkọ ko dara julọ lati awọn aaye wiwo pupọ:

  1. Ni awọn ofin ti aaye ti o gba soke, metadata le jẹ ọlọrọ pupọ.
  2. Lati oju wiwo iṣẹ, niwọn igba ti o ba n ṣe imudojuiwọn metadata ti oju ipade kan, iwọ yoo ni lati tun kọ ni lilo awọn bọtini meji.
  3. Lati oju wiwo ti atilẹyin koodu, ti a ba gbagbe lati ṣe imudojuiwọn data fun ọkan ninu awọn bọtini, a yoo gba kokoro ti ko niye ti aiṣedeede data ninu ibi ipamọ.

Lẹ́yìn náà, a máa jíròrò bí a ṣe lè mú àwọn kùdìẹ̀-kudiẹ wọ̀nyí kúrò.

Ṣiṣeto awọn ibatan laarin awọn tabili

Apẹrẹ naa dara daradara fun sisopọ tabili atọka pẹlu tabili akọkọ "bọtini bi iye". Gẹgẹbi orukọ rẹ ṣe daba, apakan iye ti igbasilẹ atọka jẹ ẹda ti iye bọtini akọkọ. Ọna yii yọkuro gbogbo awọn alailanfani ti a mẹnuba loke ti o ni nkan ṣe pẹlu titoju ẹda ti apakan iye ti igbasilẹ akọkọ. Iye owo nikan ni pe lati gba iye nipasẹ bọtini itọka, o nilo lati ṣe awọn ibeere 2 si ibi ipamọ data dipo ọkan. Sikematiki, igbekalẹ data data abajade dabi eyi.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Ilana miiran fun siseto awọn ibatan laarin awọn tabili jẹ "bọtini laiṣe". Koko-ọrọ rẹ ni lati ṣafikun awọn abuda afikun si bọtini, eyiti kii ṣe fun yiyan, ṣugbọn fun atunda bọtini ti o somọ. Ninu ohun elo awọsanma Mail.ru awọn apẹẹrẹ gidi wa ti lilo rẹ, sibẹsibẹ, lati yago fun besomi jinlẹ sinu ọrọ ti awọn ilana iOS kan pato, Emi yoo fun arosọ kan, ṣugbọn apẹẹrẹ ti o han gedegbe

Awọn alabara alagbeka awọsanma ni oju-iwe kan ti o ṣafihan gbogbo awọn faili ati folda ti olumulo ti pin pẹlu awọn eniyan miiran. Niwọn igba ti iru awọn faili bẹẹ ni o wa diẹ, ati pe ọpọlọpọ awọn oriṣiriṣi oriṣiriṣi ti alaye kan pato wa nipa ikede ti o ni nkan ṣe pẹlu wọn (ẹniti o funni ni iwọle, pẹlu awọn ẹtọ wo, ati bẹbẹ lọ), kii yoo jẹ onipin lati ṣe ẹru apakan iye ti igbasilẹ ninu tabili akọkọ pẹlu rẹ. Sibẹsibẹ, ti o ba fẹ ṣe afihan iru awọn faili ni offline, o tun nilo lati fipamọ si ibikan. Ojutu adayeba ni lati ṣẹda tabili lọtọ fun rẹ. Ninu aworan atọka ti o wa ni isalẹ, bọtini rẹ ti wa ni iṣaju pẹlu “P”, ati pe “orukọ propname” ti o ni aaye le paarọ rẹ pẹlu iye kan pato diẹ sii “alaye ti gbogbo eniyan”.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Gbogbo awọn metadata alailẹgbẹ, nitori fifipamọ eyiti tabili tuntun ti ṣẹda, ni a gbe sinu apakan iye ti igbasilẹ naa. Ni akoko kanna, iwọ ko fẹ lati ṣe ẹda data nipa awọn faili ati awọn folda ti o ti fipamọ tẹlẹ ninu tabili akọkọ. Dipo, data laiṣe ti wa ni afikun si bọtini “P” ni irisi “ID node” ati awọn aaye “timestamp”. Ṣeun si wọn, o le kọ bọtini atọka kan, lati eyiti o le gba bọtini akọkọ kan, lati eyiti, nikẹhin, o le gba metadata ipade.

Ipari

A ṣe ayẹwo awọn abajade ti imuse ti LMDB daadaa. Lẹhin rẹ, nọmba awọn didi ohun elo dinku nipasẹ 30%.

Imọlẹ ati osi ti bọtini-iye data LMDB ni awọn ohun elo iOS

Awọn esi ti awọn iṣẹ ṣe resonated kọja awọn iOS egbe. Lọwọlọwọ, ọkan ninu awọn apakan "Awọn faili" akọkọ ninu ohun elo Android tun ti yipada si lilo LMDB, ati awọn ẹya miiran wa ni ọna. Ede C naa, ninu eyiti ile itaja iye-bọtini ti wa ni imuse, jẹ iranlọwọ ti o dara lati kọkọ ṣẹda ilana ohun elo ni ayika rẹ agbelebu-Syeed ni C++. A ti lo olupilẹṣẹ koodu kan lati so ibi ikawe C ++ ti o yọrisi pọ pẹlu koodu pẹpẹ ni Objective-C ati Kotlin. Djinni lati Dropbox, ṣugbọn iyẹn jẹ itan ti o yatọ patapata.

orisun: www.habr.com

Fi ọrọìwòye kun