Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kumapeto kwa 2019, chochitika chomwe chikuyembekezeka kwa nthawi yayitali chidachitika mu gulu la Mail.ru Cloud iOS. Nawonsobe yayikulu yosungira kosalekeza kwa boma la pulogalamu yakhala yachilendo kwambiri kudziko lamafoni Memory Memory-Mapped Database (LMDB). Pansi pa odulidwawo timakupatsirani tsatanetsatane wa izo mu magawo anayi. Choyamba, tiyeni tikambirane zifukwa zimene zinachititsa kuti kusankha kusakhale kochepa komanso kovuta. Kenako tiwonanso zipilala zitatu zomwe zili pakatikati pa zomangamanga za LMDB: mafayilo okumbukira kukumbukira, B +-tree, njira yolembera-pa-kulemba pakukhazikitsa kusinthana ndi kusinthika. Pomaliza, mchere - gawo lothandiza. M'menemo tiwona momwe tingapangire ndi kukhazikitsa schema ya database yokhala ndi matebulo angapo, kuphatikizapo index imodzi, pamwamba pa API yamtengo wapatali wamtengo wapatali.

Zamkatimu

  1. Kulimbikitsa kukhazikitsa
  2. LMDB Positioning
  3. Zipilala zitatu za LMDB
    3.1. Nangumi #1. Mafayilo ojambulidwa ndi ma Memory
    3.2. Nangumi #2. B + -mtengo
    3.3. Nangumi #3. Koperani-palemba
  4. Kupanga schema ya data pamwamba pa key-value API
    4.1. Basic abstractions
    4.2. Table Modelling
    4.3. Kufananiza maubale pakati pa matebulo

1. Kulimbikitsa kukhazikitsa

Chaka chimodzi mu 2015, tinachita zovuta kuyeza kangati mawonekedwe a ntchito yathu akuchedwa. Tidachita izi pazifukwa. Talandira madandaulo pafupipafupi kuti nthawi zina pulogalamuyo imasiya kuyankha zochita za ogwiritsa ntchito: mabatani sangasindikizidwe, mindandanda siyikuyenda, ndi zina. Za makaniko a miyeso anauza pa AvitoTech, kotero apa ndimangopereka dongosolo la manambala.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Zotsatira zoyezera zidakhala shawa yozizira kwa ife. Zinapezeka kuti pali mavuto ambiri obwera chifukwa cha kuzizira kuposa ena aliwonse. Ngati tisanazindikire izi, chizindikiro chachikulu chaumisiri chaumisiri chinali chosawonongeka, ndiye pambuyo poyang'ana sintha pa kuzizira kwaulere.

Atamanga dashboard yokhala ndi zoziziritsa kukhosi ndipo pambuyo powononga kuchuluka и khalidwe Kuwunika kwa zifukwa zawo, mdani wamkulu adawonekera bwino - malingaliro olemera abizinesi omwe amachitidwa mu ulusi waukulu wa ntchito. Chikhalidwe chachibadwa ku manyazi amenewa chinali chikhumbo choyaka moto chochikankhira m’mitsinje ya ntchito. Kuti tithetse vutoli mwadongosolo, tidagwiritsa ntchito zomanga zamitundu yambiri kutengera ochita masewera opepuka. Ndinapatulira ku kusintha kwake kwa dziko la iOS ulusi ziwiri pa gulu la Twitter ndi Nkhani ya Habre. Monga gawo la nkhani yamakono, ndikufuna kutsindika mbali za chisankho chomwe chinakhudza kusankha kwa database.

The actor model of system organization amaganiza kuti multithreading imakhala chinsinsi chake chachiwiri. Chitsanzo cha zinthu zomwe zili mmenemo zimakonda kudutsa malire a mtsinje. Ndipo amachita izi osati nthawi zina komanso apa ndi apo, koma pafupifupi nthawi zonse komanso kulikonse

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Database ndi imodzi mwamagawo apangodya pazithunzi zomwe zawonetsedwa. Ntchito yake yayikulu ndikukhazikitsa macropattern Shared Database. Ngati m'dziko labizinesi amagwiritsidwa ntchito kukonza kulumikizana kwa data pakati pa mautumiki, ndiye pankhani ya zomangamanga - data pakati pa ulusi. Chifukwa chake, tidafunikira nkhokwe yomwe sizingabweretse zovuta zochepa pogwira nayo ntchito m'malo okhala ndi ulusi wambiri. Makamaka, izi zikutanthauza kuti zinthu zomwe zatengedwa kuchokera pamenepo ziyenera kukhala zotetezedwa ndi ulusi, komanso zosasinthika. Monga mukudziwira, zotsirizirazi zingagwiritsidwe ntchito nthawi imodzi kuchokera ku ulusi wambiri popanda kugwiritsa ntchito kutseka kulikonse, zomwe zimakhala ndi phindu pa ntchito.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOSChinthu chachiwiri chofunikira chomwe chinakhudza kusankha kwa database chinali mtambo wathu wa API. Idadzozedwa ndi njira yolumikizirana yotengedwa ndi git. Monga iye, tinkafuna API ya offline-first, zomwe zimawoneka bwino kwambiri kuposa makasitomala amtambo. Zinkaganiziridwa kuti angotulutsa mtambo wathunthu kamodzi, ndiyeno kulunzanitsa muzochitika zambiri kudzachitika posintha kusintha. Tsoka, mwayi uwu udakali m'dera lazongopeka, ndipo makasitomala sanaphunzire momwe angagwiritsire ntchito zigamba pochita. Pali zifukwa zingapo zochitira izi, zomwe, kuti tisachedwetse mawu oyamba, tidzasiya m'mabulaketi. Tsopano, chomwe chili chosangalatsa kwambiri ndi mfundo zomaliza za phunzirolo pazomwe zimachitika pamene API imati "A" ndipo ogula sakunena "B".

Chifukwa chake, ngati mukuganiza git, yomwe, pochita kukoka, m'malo mogwiritsa ntchito zigamba pazithunzi zakumaloko, ikufanizira mawonekedwe ake onse ndi seva yonse, ndiye kuti mudzakhala ndi lingaliro lolondola la momwe kulunzanitsa kumachitika mumtambo. makasitomala. Ndizosavuta kuganiza kuti kuti mugwiritse ntchito, muyenera kuyika mitengo iwiri ya DOM kukumbukira ndi chidziwitso cha seva ndi mafayilo am'deralo. Zikuoneka kuti ngati wosuta amasunga 500 zikwi owona mu mtambo, ndiye kulunzanitsa izo m'pofunika kukonzanso ndi kuwononga mitengo iwiri ndi 1 miliyoni mfundo. Koma node iliyonse ndi gulu lomwe lili ndi ma graph a zinthu. Mwa ichi, zotsatira za mbiriyakale zinkayembekezeredwa. Zinapezeka kuti ngakhale osaganizira za kuphatikiza ma aligorivimu, njira yopangira ndikuwononga zinthu zingapo zing'onozing'ono zimawononga ndalama zambiri. za zolemba za ogwiritsa ntchito. Zotsatira zake, timakonza gawo lachiwiri lofunikira posankha nkhokwe - kuthekera kogwiritsa ntchito ntchito za CRUD popanda kugawa zinthu mwachangu.

Zofunikira zina ndi zachikhalidwe ndipo mndandanda wawo wonse uli motere.

  1. Chitetezo cha ulusi.
  2. Multiprocessing. Wotsogozedwa ndi chikhumbo chogwiritsa ntchito nkhokwe yomweyo kuti agwirizanitse boma osati pakati pa ulusi, komanso pakati pa pulogalamu yayikulu ndi zowonjezera za iOS.
  3. Kutha kuyimira zinthu zosungidwa ngati zinthu zosasinthika ...
  4. Palibe magawo osinthika mkati mwa ntchito za CRUD.
  5. Thandizo lochita zinthu zoyambira ACID: atomiki, kusasinthasintha, kudzipatula ndi kudalirika.
  6. Kuthamanga pamilandu yotchuka kwambiri.

Ndi zofunikira izi, SQLite inali ndipo imakhalabe chisankho chabwino. Komabe, monga gawo la maphunziro a njira zina, ndinapeza buku "Kuyamba ndi LevelDB". Pansi pa utsogoleri wake, benchmark idalembedwa kuyerekeza kuthamanga kwa ntchito ndi ma database osiyanasiyana pamawonekedwe enieni amtambo. Zotsatira zake zidaposa zomwe tinkayembekezera. Pazochitika zodziwika kwambiri - kupeza cholozera pamndandanda wosanjidwa wa mafayilo onse ndi mndandanda wamafayilo onse omwe adapatsidwa - LMDB idakhala nthawi 10 mwachangu kuposa SQLite. Chosankhacho chinakhala chodziwikiratu.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

2. LMDB Positioning

LMDB ndi laibulale yaying'ono kwambiri (mizere 10K yokha) yomwe imagwiritsa ntchito malo otsika kwambiri - yosungirako.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Chithunzi pamwambapa chikuwonetsa kuti kufananiza LMDB ndi SQLite, yomwe imagwiritsanso ntchito magawo apamwamba, nthawi zambiri sizolondola kuposa SQLite yokhala ndi Core Data. Zingakhale zabwino kwambiri kutchula injini zosungiramo zomwezo monga opikisana nawo - BerkeleyDB, LevelDB, Sophia, RocksDB, ndi zina zotero. Kuyesera koyamba kotereku kunali mu 2012 kuwononga pa LMDB Howard Chu. Zotsatira zidakhala zochititsa chidwi kwambiri kotero kuti zomwe adachitazo zidatengedwa ndi okonda OSS, ndipo adapeza kupitiliza kwa munthuyo. LumoSQL. Mu Januware 2020, wolemba ntchitoyi anali Den Shearer zoperekedwa ndi LinuxConfAu.

LMDB imagwiritsidwa ntchito makamaka ngati injini yosungiramo ntchito. Laibulaleyi ikuwoneka chifukwa cha omanga OpenLDAP, omwe sanakhutitsidwe kwambiri ndi BerkeleyDB monga maziko a polojekiti yawo. Kuyambira ku laibulale yocheperako btre, Howard Chu adatha kupanga imodzi mwa njira zodziwika kwambiri za nthawi yathu. Adapereka lipoti lake labwino kwambiri ku nkhaniyi, komanso kumayendedwe amkati a LMDB. "The Lightning Memory-mapped Database". Chitsanzo chabwino chogonjetsa malo osungiramo zinthu chinagawidwa ndi Leonid Yuryev (aka uyo) kuchokera ku Positive Technologies mu lipoti lake ku Highload 2015 "Injini ya LMDB ndi ngwazi yapadera". M'menemo, amalankhula za LMDB pokhudzana ndi ntchito yofananira yokhazikitsa ReOpenLDAP, ndipo LevelDB yakhala ikutsutsidwa kale. Chifukwa cha kukhazikitsidwa, Positive Technologies ngakhale anali ndi foloko yomwe ikukula mwachangu Mtengo wa MDBX yokhala ndi mawonekedwe okoma kwambiri, kukhathamiritsa komanso kukonza zolakwika.

LMDB nthawi zambiri imagwiritsidwa ntchito ngati yosungirako. Mwachitsanzo, msakatuli wa Mozilla Firefox anasankha izo pazosowa zingapo, ndipo, kuyambira pa 9, Xcode okondedwa SQLite yake yosungira ma index.

Injiniyi yapanganso chizindikiro chake padziko lapansi lachitukuko cha mafoni. Zotsatira zake zitha kukhala kupeza mu kasitomala wa iOS wa Telegraph. LinkedIn idapita patsogolo kwambiri ndikusankha LMDB ngati malo osungira osungiramo data yake yakunyumba Rocket Data, yomwe anauza m'nkhani yake mu 2016.

LMDB ikumenyera bwino malo padzuwa mu niche yosiyidwa ndi BerkeleyDB itakhala pansi pa ulamuliro wa Oracle. Laibulaleyi imakondedwa chifukwa cha liwiro lake komanso kudalirika kwake, ngakhale poyerekeza ndi anzawo. Monga mukudziwa, palibe nkhomaliro zaulere, ndipo ndikufuna kutsindika zamalonda zomwe muyenera kukumana nazo posankha pakati pa LMDB ndi SQLite. Chithunzi pamwambapa chikuwonetsa momveka bwino momwe kuchuluka kwa liwiro kumakwaniritsidwira. Choyamba, sitilipira zigawo zina zowonjezera pamwamba pa disk yosungirako. Zikuwonekeratu kuti zomanga zabwino sizingachite popanda iwo, ndipo zidzawonekera mosakayikira pamakina ogwiritsira ntchito, koma zidzakhala zochenjera kwambiri. Sizikhala ndi zinthu zomwe sizikufunidwa ndi pulogalamu inayake, mwachitsanzo, thandizo la mafunso muchilankhulo cha SQL. Kachiwiri, zimakhala zotheka kugwiritsa ntchito bwino mapu ogwiritsira ntchito pofunsira kusungirako disk. Ngati SQLite mu ntchito yanga zimatengera kuchuluka kwa ziwerengero za pulogalamu yapakati, ndiye kuti inu, monga wopanga mapulogalamu, mumadziwa bwino zochitika zazikuluzikulu zantchito. Kuti mupeze yankho labwino kwambiri, muyenera kulipira mtengo wowonjezereka popanga yankho loyambirira komanso chithandizo chake chotsatira.

3. Mizati itatu ya LMDB

Nditayang'ana LMDB m'maso mwa mbalame, inali nthawi yoti tipite mozama. Magawo atatu otsatirawa adzaperekedwa pakuwunika zipilala zazikulu zomwe zosungirako zimakhazikika:

  1. Mafayilo ojambulidwa ndi memory ngati njira yogwirira ntchito ndi diski ndi kulunzanitsa ma data amkati.
  2. B + -mtengo monga bungwe la dongosolo la deta yosungidwa.
  3. Copy-on-write ngati njira yoperekera katundu wa ACID ndi kusinthasintha.

3.1. Nangumi #1. Mafayilo ojambulidwa ndi ma Memory

Mafayilo ojambulidwa ndi memory ndi chinthu chofunikira kwambiri chomanga moti amawonekeranso m'dzina la malo osungira. Nkhani za caching ndi kulunzanitsa mwayi wopeza zidziwitso zosungidwa zimasiyidwa ku opareshoni. LMDB ilibe zosungira mkati mwazokha. Ichi ndi chisankho chodziwika ndi wolemba, popeza kuwerenga deta mwachindunji kuchokera pamafayilo ojambulidwa kumakupatsani mwayi wodula ngodya zambiri pakukhazikitsa injini. M'munsimu muli kutali ndi mndandanda wathunthu wa ena a iwo.

  1. Kusunga kusasinthasintha kwa deta mu yosungirako pamene mukugwira ntchito ndi njira zingapo kumakhala udindo wa opaleshoni. M'chigawo chotsatira, makinawa akukambidwa mwatsatanetsatane komanso ndi zithunzi.
  2. Kusapezeka kwa ma cache kumachotseratu LMDB pamutu wokhudzana ndi magawo osinthika. Kuwerenga deta muzochita kumatanthauza kukhazikitsa cholozera ku adilesi yolondola muzokumbukira zenizeni ndipo palibenso china. Zikumveka ngati zopeka za sayansi, koma mu code yosungirako zosungira mafoni onse ku calloc amakhazikika mu ntchito yosungirako yosungirako.
  3. Kusapezeka kwa ma cache kumatanthauzanso kusakhalapo kwa maloko omwe amalumikizidwa ndi kulumikizana kwawo. Owerenga, omwe pangakhale owerenga owerengeka nthawi imodzi, samakumana ndi mutex imodzi panjira yopita ku deta. Chifukwa cha izi, liwiro lowerenga lili ndi scalability yabwino yotengera kuchuluka kwa ma CPU. Mu LMDB, ntchito zosintha zokha zimalumikizidwa. Patha kukhala wolemba m'modzi panthawi imodzi.
  4. Kuchepa kwa caching ndi synchronization logic kumachotsa zolakwa zovuta kwambiri zomwe zimagwirizanitsidwa ndi kugwira ntchito m'malo okhala ndi ulusi wambiri. Panali maphunziro awiri osangalatsa a database pamsonkhano wa Usenix OSDI 2014: "Mafayilo Onse Sanapangidwe Ofanana: Pakuvuta Kwa Kupanga Mapulogalamu Osagwirizana" и "Kuzunza Zosungirako Zosangalatsa ndi Zopindulitsa". Kuchokera kwa iwo mutha kudziwa zambiri za kudalirika komwe sikunachitikepo kwa LMDB komanso kukhazikitsidwa kopanda cholakwika kwa katundu wa ACID, womwe ndi wapamwamba kuposa wa SQLite.
  5. Minimalism ya LMDB imalola kuyimira makina kwa code yake kukhala kwathunthu mu L1 cache ya purosesa ndi mawonekedwe othamanga.

Tsoka ilo, mu iOS, yokhala ndi mafayilo okumbukira kukumbukira, zonse sizikhala zopanda mitambo monga momwe timafunira. Kuti tilankhule za zolakwika zomwe zimagwirizanitsidwa nawo mozindikira, m'pofunika kukumbukira mfundo zambiri zogwiritsira ntchito njirayi mu machitidwe opangira.

Zambiri zamafayilo ojambulidwa ndi memory

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOSNdi pulogalamu iliyonse yomwe ikugwira ntchito, makina ogwiritsira ntchito amagwirizanitsa chinthu chotchedwa ndondomeko. Njira iliyonse imapatsidwa ma adilesi osiyanasiyana momwe imayika chilichonse chomwe chikufunika kuti igwire ntchito. Pamaadiresi otsika kwambiri pali magawo omwe ali ndi code ndi deta yolimba komanso zothandizira. Kenako pamabwera malo osinthika a ma adilesi, odziwika bwino kwa ife pansi pa dzina la mulu. Lili ndi maadiresi a mabungwe omwe amawonekera panthawi ya ntchito. Pamwambapa pali malo okumbukira omwe amagwiritsidwa ntchito ndi stack application. Imakula kapena kupanga mgwirizano; mwa kuyankhula kwina, kukula kwake kumakhalanso ndi chikhalidwe champhamvu. Pofuna kuteteza stack ndi mulu kuti zisasunthike ndi kusokonezana, zimakhala kumapeto kosiyana kwa malo a adiresi.​ Pali bowo pakati pa zigawo ziwiri zosunthika pamwamba ndi pansi. Makina ogwiritsira ntchito amagwiritsa ntchito maadiresi omwe ali m'chigawo chapakati ichi kuti agwirizane ndi mabungwe osiyanasiyana ndi ndondomekoyi. Makamaka, imatha kugwirizanitsa ma adilesi ena osalekeza ndi fayilo pa disk. Fayilo yotereyi imatchedwa memory-mapped

Malo a adiresi omwe aperekedwa ku ndondomekoyi ndi aakulu. Mwachidziwitso, chiwerengero cha maadiresi chimachepa kokha ndi kukula kwa cholozera, chomwe chimatsimikiziridwa ndi mphamvu pang'ono ya dongosolo. Zikadakhala kuti kukumbukira kwakuthupi kumapangidwira 1-to-1, ndiye kuti njira yoyamba ikanakweza RAM yonse, ndipo sipakanakhala zokamba zambiri.

Komabe, malinga ndi zomwe takumana nazo, tikudziwa kuti makina ogwiritsira ntchito amakono amatha kuchita nthawi imodzi monga momwe akufunira. Izi ndizotheka chifukwa chakuti amangopereka zokumbukira zambiri pamapepala, koma kwenikweni amalowetsa mu kukumbukira kwakukulu kwa thupi kokha gawo lomwe likufunika pano ndi pano. Choncho, kukumbukira kugwirizana ndi ndondomeko amatchedwa pafupifupi.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Makina ogwiritsira ntchito amakonza zokumbukira zenizeni komanso zakuthupi kukhala masamba amtundu wina. Mwamsanga tsamba lina la kukumbukira pafupifupi likufunika, makina ogwiritsira ntchito amawalowetsa mu kukumbukira thupi ndikuwagwirizanitsa patebulo lapadera. Ngati palibe mipata yaulere, ndiye kuti imodzi mwamasamba omwe adanyamulidwa kale imakopera ku diski, ndipo yomwe ikufunika imatenga malo ake. Njirayi, yomwe tibwereranso posachedwa, imatchedwa swapping. Chithunzi chili m'munsichi chikuwonetsa ndondomeko yomwe yafotokozedwa. Pa ilo, tsamba A lokhala ndi adiresi 0 linapakidwa ndi kuikidwa pa tsamba lalikulu la kukumbukira ndi adiresi 4. Mfundo imeneyi inasonyezedwa patebulo la makalata la nambala 0.​

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Nkhaniyi ndi yofanana ndi mafayilo ojambulidwa pamtima. Zomveka, iwo amayenera kukhala mosalekeza ndi kwathunthu mu malo enieni adilesi. Komabe, amalowetsa tsamba lokumbukira zakuthupi ndi tsamba komanso pokhapokha atapempha. Kusintha kwamasamba otere kumalumikizidwa ndi fayilo pa disk. Mwanjira imeneyi, mutha kupanga fayilo I/O mwa kungogwira ntchito ndi ma byte mu kukumbukira - zosintha zonse zimasamutsidwa ndi makina opangira opaleshoni kupita ku fayilo yoyambira.

Chithunzi chomwe chili pansipa chikuwonetsa momwe LMDB imagwirizanitsira dziko lake pogwira ntchito ndi nkhokwe kuchokera kumachitidwe osiyanasiyana. Popanga makumbukidwe amitundu yosiyanasiyana ku fayilo yomweyi, timakakamiza makina ogwiritsira ntchito kuti agwirizanitse midadada ina ya maadiresi awo, pomwe LMDB imawoneka.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Chofunikira ndichakuti LMDB, mwachisawawa, imasintha fayilo ya data kudzera pamakina oyitanitsa, ndikuwonetsa fayiloyo yokhayokha. Njirayi ili ndi zotsatira ziwiri zofunika.

Zotsatira zoyamba ndizofanana ndi machitidwe onse opangira. Chofunikira chake ndikuwonjezera chitetezo pakuwonongeka mwangozi kwa database ndi code yolakwika. Monga mukudziwira, malangizo otheka a ndondomekoyi ndi omasuka kupeza deta kuchokera kulikonse mu malo ake adiresi. Nthawi yomweyo, monga takumbukira, kuwonetsa fayilo munjira yowerengera kumatanthauza kuti malangizo aliwonse amathanso kusintha. Ngati achita izi molakwitsa, kuyesa, mwachitsanzo, kuti alembenso mndandanda wazinthu pazomwe palibe, ndiye kuti akhoza kusintha mwangozi fayilo yomwe ili pa adiresi iyi, zomwe zingayambitse kuwonongeka kwa database. Ngati fayilo ikuwonetsedwa mumayendedwe owerengera okha, ndiye kuyesa kusintha malo adilesi yofananirako kumabweretsa kutha kwadzidzidzi kwa pulogalamuyo ndi chizindikiro. SIGSEGV, ndipo fayiloyo ikhalabe.

Chotsatira chachiwiri ndichachindunji cha iOS. Ngakhale wolemba kapena magwero ena onse sanatchule mwatsatanetsatane, koma popanda LMDB singakhale yoyenera kuyendetsa pa foni yam'manja iyi. Gawo lotsatira likuperekedwa ku kulingalira kwake.

Zodziwika bwino zamafayilo ojambulidwa mu iOS

Panali lipoti labwino kwambiri ku WWDC mu 2018 "iOS Memory Deep Dive". Imatiuza kuti mu iOS, masamba onse omwe ali m'makumbukidwe amthupi ndi amodzi mwa mitundu itatu: yakuda, yoponderezedwa komanso yoyera.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Memory yoyera ndi mndandanda wamasamba omwe amatha kumasulidwa mosavutikira kuchokera pamtima. Deta yomwe ili nayo imatha kutsitsidwanso ngati ikufunika kuchokera komwe idachokera. Mafayilo amamapu owerengera okha ali mgululi. iOS sikuwopa kutsitsa masamba omwe adajambulidwa ku fayilo kuchokera pamtima nthawi iliyonse, chifukwa amatsimikizika kuti alumikizidwa ndi fayilo pa diski.

Masamba onse osinthidwa amatha kukumbukira zauve, mosasamala kanthu komwe anali komweko. Makamaka, mafayilo amamapu okumbukira omwe adasinthidwa polemba kumakumbukidwe omwe amalumikizidwa nawo adzagawidwa motere. Kutsegula LMDB ndi mbendera MDB_WRITEMAP, mutatha kusintha, mutha kutsimikizira izi panokha

Pulogalamuyo ikangoyamba kukumbukira kwambiri, iOS imapangitsa kuti tsambalo likhale lodetsedwa. The okwana kukumbukira wotanganidwa masamba zauve ndi wothinikizidwa zimapanga ntchito otchedwa kukumbukira footprint. Ikafika pamtengo wina, daemon ya OOM killer system imabwera pambuyo pa njirayi ndikuyithetsa mokakamiza. Izi ndizopadera za iOS poyerekeza ndi machitidwe apakompyuta. Mosiyana ndi izi, kuchepetsa kukumbukira kukumbukira posinthana masamba kuchokera pamtima kupita ku disk sikuperekedwa mu iOS. Mwina njira yosinthira masamba kupita ku disk ndi kumbuyo ndikugwiritsa ntchito mphamvu zambiri pazida zam'manja, kapena iOS imasunga zida zolemberanso ma cell pama drive a SSD, kapena mwina opanga sanakhutire ndi magwiridwe antchito onse adongosolo, pomwe chilichonse chili. kusinthidwa mosalekeza. Ngakhale zili choncho, zoona zake n’zakuti ndi zoona.

Nkhani yabwino, yomwe tatchula kale, ndikuti LMDB mwachisawawa sigwiritsa ntchito mmap kuti isinthe mafayilo. Izi zikutanthauza kuti zomwe zikuwonetsedwa zimayikidwa ndi iOS ngati zokumbukira zoyera ndipo sizithandizira kukumbukira kukumbukira. Mutha kutsimikizira izi pogwiritsa ntchito chida cha Xcode chotchedwa VM Tracker. Chithunzi chomwe chili pansipa chikuwonetsa momwe kukumbukira kwa iOS kwa pulogalamu ya Cloud ikugwira ntchito. Poyambirira, zochitika za 2 LMDB zidakhazikitsidwa mmenemo. Woyamba adaloledwa kuwonetsa fayilo yake pa 1GiB ya kukumbukira kwenikweni, yachiwiri - 512MiB. Ngakhale kuti storages onse amakhala ndi kuchuluka kwa kukumbukira komwe amakhala, palibe yemwe amathandizira kukula konyansa.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Ndipo tsopano ndi nthawi ya nkhani zoipa. Chifukwa cha makina osinthira pamakina ogwiritsira ntchito pakompyuta ya 64-bit, njira iliyonse imatha kutenga malo ambiri adilesi monga momwe malo a hard disk aulere amaloleza. Kusintha kusinthana ndi kuponderezana mu iOS kumachepetsa kwambiri theoretical. Tsopano njira zonse zamoyo ziyenera kulowa mu kukumbukira kwakukulu (kuwerenga RAM), ndipo zonse zomwe sizikukwanira ziyenera kukakamizidwa kuzithetsa. Izi zanenedwa monga momwe tafotokozera pamwambapa lipoti, ndi zolemba zovomerezeka. Zotsatira zake, iOS imachepetsa kwambiri kuchuluka kwa kukumbukira komwe kulipo kuti agawidwe kudzera mmap. Pano apa Mutha kuyang'ana malire ampiritsi a kuchuluka kwa kukumbukira komwe kungaperekedwe pazida zosiyanasiyana pogwiritsa ntchito foni iyi. Pazithunzi zamakono zamakono zamakono, iOS yakhala yowolowa manja ndi 2 gigabytes, ndi pamwamba pa iPad - ndi 4. Mwachizoloŵezi, ndithudi, muyenera kuyang'ana pa zipangizo zotsika kwambiri zothandizira, zomwe ziri zomvetsa chisoni kwambiri. Choyipa kwambiri, poyang'ana momwe amakumbukira pulogalamuyo ku VM Tracker, mupeza kuti LMDB ili kutali ndi yokhayo yomwe imadzinenera kuti imakumbukiridwa. Ma chunks abwino amadyedwa ndi ogawa makina, mafayilo azothandizira, mawonekedwe azithunzi, ndi zilombo zina zazing'ono.

Kutengera zotsatira za kuyesa mumtambo, tidafika pamiyezo yotsatirayi pakukumbukira komwe LMDB idaperekedwa: 384 megabytes pazida 32-bit ndi 768 pazida za 64-bit. Voliyumu iyi ikagwiritsidwa ntchito, zosintha zilizonse zimayamba kutha ndi code MDB_MAP_FULL. Timawona zolakwika zotere pakuwunika kwathu, koma ndizochepa kwambiri moti pakadali pano zitha kunyalanyazidwa.

Chifukwa chosadziwikiratu chakugwiritsa ntchito kukumbukira mopitirira muyeso ndi zosungirako zitha kukhala zochitika zanthawi yayitali. Kuti timvetse momwe zochitika ziwirizi zimagwirizanirana, tidzathandizidwa poganizira zipilala ziwiri zotsalira za LMDB.

3.2. Nangumi #2. B + -mtengo

Kuti mutengere matebulo pamwamba pa malo osungira mtengo, zotsatirazi ziyenera kupezeka mu API yake:

  1. Kuyika chinthu chatsopano.
  2. Sakani chinthu chokhala ndi kiyi yoperekedwa.
  3. Kuchotsa chinthu.
  4. Bwerezani modutsa mipata ya makiyi mu dongosolo lomwe akusanjidwa.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOSDongosolo losavuta kwambiri la data lomwe lingathe kuchita ntchito zonse zinayi mosavuta ndi mtengo wofufuzira wa binary. Iliyonse ya node yake imayimira fungulo lomwe limagawaniza gawo lonse la makiyi amwana m'magulu awiri. Kumanzere kuli zocheperapo kuposa kholo, ndipo kumanja kumakhala zazikulu. Kupeza makiyi osankhidwa kumatheka kudzera mu imodzi mwamitengo yapamwamba kwambiri

Mitengo ya Binary ili ndi zolakwika ziwiri zomwe zimawalepheretsa kukhala ogwira mtima ngati ma disk-based data structure. Choyamba, kuchuluka kwa kuchuluka kwawo sikudziwika. Pali chiwopsezo chachikulu chopeza mitengo momwe kutalika kwa nthambi zosiyanasiyana kumatha kusiyana kwambiri, zomwe zimayipitsa kwambiri zovuta zakusaka poyerekeza ndi zomwe zikuyembekezeka. Kachiwiri, kuchuluka kwa maulalo olumikizana pakati pa ma node kumalepheretsa mitengo yamabinayi kuti isakumbukike. Zotsatira zake, ngakhale kudutsa pang'ono kwa ma node angapo oyandikana nawo mumtengo kungafunike kuyendera masamba angapo ofanana. Ili ndi vuto ngakhale tikamanena za mphamvu ya mitengo ya binary monga dongosolo la data mu-memory, popeza masamba ozungulira nthawi zonse mu cache ya purosesa sizosangalatsa zotsika mtengo. Zikafika pakubweza masamba omwe amalumikizidwa ndi node kuchokera pa diski, zinthu zimakhala kwathunthu zomvetsa chisoni.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOSMitengo ya B, pokhala kusinthika kwa mitengo ya binary, imathetsa mavuto omwe atchulidwa m'ndime yapitayi. Choyamba, iwo amadzilinganiza okha. Kachiwiri, node iliyonse imagawaniza makiyi a ana osati 2, koma m'magulu ang'onoang'ono olamulidwa ndi M, ndipo chiwerengero cha M chikhoza kukhala chachikulu, mwadongosolo la mazana angapo, kapena masauzande.

Potero:

  1. Node iliyonse ili ndi makiyi ambiri omwe adalamulidwa kale ndipo mitengo ndi yaifupi kwambiri.
  2. Mtengowo umakhala ndi malo okumbukira malo, popeza makiyi omwe ali pafupi ndi mtengo amakhala mwachilengedwe pafupi ndi wina ndi mnzake pamanode omwewo kapena oyandikana nawo.
  3. Chiwerengero cha ma transit node potsika mtengo panthawi yofufuza chimachepetsedwa.
  4. Chiwerengero cha ma node omwe amawerengedwa panthawi yamafunso amachepetsedwa, chifukwa chilichonse chimakhala ndi makiyi ambiri omwe adalamulidwa.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

LMDB imagwiritsa ntchito kusiyanasiyana kwa mtengo wa B wotchedwa B+ mtengo kusunga deta. Chithunzi pamwambapa chikuwonetsa mitundu itatu ya node yomwe ilipo mmenemo:

  1. Pamwamba pake pali muzu. Sichinthu china chilichonse kuposa lingaliro la database mkati mwa nyumba yosungiramo zinthu. Munthawi imodzi ya LMDB, mutha kupanga nkhokwe zingapo zomwe zimagawana malo omwe ali ndi mapu. Aliyense wa iwo amayambira muzu wake.
  2. Pansi kwambiri ndi masamba. Iwo ndi iwo okha omwe ali ndi mafungulo amtengo wapatali omwe amasungidwa mu database. Mwa njira, izi ndizopadera za B + -mitengo. Ngati masitolo okhazikika a B-tree amaika magawo m'magulu onse, ndiye kuti kusiyana kwa B + kumakhala kotsika kwambiri. Titakonza izi, tidzatchulanso mtundu wa mtengo womwe umagwiritsidwa ntchito mu LMDB chabe mtengo wa B.
  3. Pakati pa muzu ndi masamba pali 0 kapena zambiri luso milingo ndi navigational (nthambi) mfundo. Ntchito yawo ndikugawa makiyi osanjidwa pakati pa masamba.

Mwakuthupi, ma node ndi midadada ya kukumbukira kutalika kodziwikiratu. Kukula kwawo ndi kuchuluka kwa masamba okumbukira mumayendedwe, omwe tidakambirana pamwambapa. Mapangidwe a node akuwonetsedwa pansipa. Mutuwu uli ndi chidziwitso cha meta, chodziwika kwambiri chomwe mwachitsanzo ndi checksum. Kenako pamabwera zambiri zokhudzana ndi zomwe ma cell omwe ali ndi data amakhala. Detayo ikhoza kukhala makiyi, ngati tikukamba za ma navigation node, kapena mafungulo onse amtengo wapatali pamasamba.​ Mutha kuwerenga zambiri za kapangidwe ka masamba muntchitoyi. "Kuwunika kwa Masitolo Ofunika Kwambiri Ogwira Ntchito Kwambiri".

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Titathana ndi zomwe zili mkati mwamasamba, tiyimiliranso mtengo wa LMDB B m'njira yosavuta mwanjira iyi.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Masamba okhala ndi node amapezeka motsatizana pa disk. Masamba okhala ndi manambala apamwamba ali kumapeto kwa fayilo. Tsamba lotchedwa meta tsamba lili ndi chidziwitso chokhudza kuchotsera komwe mizu ya mitengo yonse ingapezeke. Mukatsegula fayilo, LMDB imayang'ana fayiloyo tsamba ndi tsamba kuchokera kumapeto mpaka koyambirira pofufuza tsamba lovomerezeka la meta ndipo kudzera momwemo imapeza zosungira zomwe zilipo kale.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Tsopano, pokhala ndi lingaliro la kapangidwe kake ka data, titha kupitiliza kulingalira mzati wachitatu wa LMDB. Ndi chithandizo chake kuti zosintha zonse zosungirako zichitike mwapang'onopang'ono komanso modzipatula kwa wina ndi mnzake, kupatsa database yonseyo kukhala ndi zinthu zambiri.

3.3. Nangumi #3. Koperani-palemba

Ntchito zina za B-tree zimaphatikizapo kupanga masinthidwe angapo pamfundo zake. Chitsanzo chimodzi ndikuwonjezera kiyi yatsopano ku node yomwe yafika kale pakutha kwake. Pankhaniyi, m'pofunika, choyamba, kugawa mfundo ziwiri, ndipo kachiwiri, kuwonjezera ulalo watsopano budding mwana mfundo mu kholo lake. Njira imeneyi ndi yoopsa kwambiri. Ngati pazifukwa zina (kuwonongeka, kuwonongeka kwa magetsi, etc.) mbali imodzi yokha ya zosintha kuchokera pamndandandawu zimachitika, ndiye kuti mtengowo udzakhalabe wosagwirizana.

Njira imodzi yachikhalidwe yopangira nkhokwe ya database ndikuwonjezera zina pa disk data pafupi ndi mtengo wa B - chipika chogulitsira, chomwe chimadziwikanso kuti kulemba-patsogolo (WAL). Ndi fayilo yomwe pamapeto pake ntchito yomwe ikufunidwa imalembedwa mosamalitsa musanasinthe mtengo wa B wokha. Chifukwa chake, ngati chiwonongeko cha data chizindikirika pakudzizindikiritsa nokha, nkhokweyo imalumikizana ndi chipikacho kuti izidzikonzekeretsa.

LMDB yasankha njira yosiyana ngati njira yololera zolakwika, yotchedwa copy-on-write. Chofunikira chake ndi chakuti m'malo mosintha zomwe zili patsamba lomwe lilipo, imakopera kwathunthu ndikupanga zosintha zonse.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Chotsatira, kuti deta yosinthidwayo ipezeke, m'pofunika kusintha ulalo wa node yomwe yakhala yaposachedwa mu node ya makolo ake. Popeza ikufunikanso kusinthidwa pa izi, imakopedwanso kale. Njirayi ikupitirira mobwerezabwereza mpaka ku mizu. Chomaliza kusintha ndi zomwe zili patsamba la meta

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Ngati mwadzidzidzi panthawi yokonzanso ndondomekoyo ikuphwanyidwa, ndiye kuti tsamba latsopano la meta silingapangidwe, kapena silingalembedwe ku disk kwathunthu, ndipo checksum yake idzakhala yolakwika. Pazochitika ziwirizi, masamba atsopano sadzakhala ofikirika, koma akale sangakhudzidwe. Izi zimathetsa kufunikira kwa LMDB kulemba chipika chamtsogolo kuti chisunge kusasinthika kwa data. De facto, dongosolo la kusungirako deta pa disk lomwe tafotokoza pamwambapa limagwira ntchito yake. Kusowa kwa chipika chodziwika bwino ndi chimodzi mwazinthu za LMDB zomwe zimapereka liwiro lalikulu lowerengera.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Mapangidwe ake, otchedwa append-only B-tree, mwachilengedwe amapereka kudzipatula komanso kusinthika kosiyanasiyana. Mu LMDB, kutsegulidwa kulikonse kumalumikizidwa ndi muzu wamtengo womwe ulipo. Mpaka ntchitoyo itamalizidwa, masamba amtengo wolumikizidwa nawo sangasinthidwe kapena kugwiritsidwanso ntchito pamitundu yatsopano ya data. Chifukwa chake, mutha kugwira ntchito nthawi yonse yomwe mukufuna ndi seti yeniyeni ya data yomwe inali yofunika panthawiyo. ntchitoyo idatsegulidwa, ngakhale zosungirako zikupitilizabe kusinthidwa panthawiyi. Ichi ndiye gwero la kusinthika, kupangitsa LMDB kukhala gwero labwino kwambiri la okondedwa athu UICollectionView. Pambuyo potsegula malonda, palibe chifukwa choonjezera kukumbukira kwazomwe mukugwiritsira ntchito popopera mwachangu deta yamakono mumpangidwe wina wa kukumbukira, kuopa kutsala opanda kanthu. Izi zimasiyanitsa LMDB ndi SQLite yomweyo, yomwe singadzitamandire kudzipatula kotheratu. Popeza tatsegula zochitika ziwiri pomaliza ndikuchotsa mbiri inayake mkati mwa imodzi mwazo, sikungathekenso kupeza zolemba zomwezo mkati mwachiwiri chotsalira.

Mbali yakutsogolo ya ndalamayo ndiyomwe imagwiritsa ntchito kwambiri kukumbukira. Chithunzichi chikuwonetsa momwe mawonekedwe a database angawonekere ngati atasinthidwa nthawi imodzi ndi 3 otsegula owerengera akuyang'ana mitundu yosiyanasiyana ya database. Popeza LMDB sichitha kugwiritsanso ntchito ma node omwe angapezeke kuchokera ku mizu yokhudzana ndi zochitika zamakono, sitolo ilibe chochita koma kugawa muzu wina wachinayi m'makumbukiro ndikugwirizanitsanso masamba osinthidwa pansi pake.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Apa zingakhale zothandiza kukumbukira gawo la mafayilo ojambulidwa ndi kukumbukira. Zikuwoneka kuti kugwiritsa ntchito kowonjezera kwa kukumbukira sikuyenera kutidetsa nkhawa kwambiri, chifukwa sikumathandizira kukumbukira komwe kumagwiritsidwa ntchito. Komabe, panthawi imodzimodziyo, zidadziwika kuti iOS ndi yovuta kwambiri pogawa, ndipo sitingathe, monga pa seva kapena pakompyuta, kupereka dera la LMDB la 1 terabyte ndipo osaganizira za izi nkomwe. Ngati n'kotheka, muyenera kuyesa kupanga moyo wonse wamalonda kukhala waufupi momwe mungathere.

4. Kupanga schema ya data pamwamba pa API yamtengo wapatali

Tiyeni tiyambe kusanthula kwa API poyang'ana zoyambira zoperekedwa ndi LMDB: chilengedwe ndi nkhokwe, makiyi ndi mayendedwe, zochitika ndi zolozera.

Chidziwitso chokhudza ma code

Ntchito zonse pagulu la LMDB API zimabweretsa zotsatira za ntchito yawo ngati nambala yolakwika, koma m'mindandanda yonse yotsatira kutsimikizira kwake sikunasinthidwe chifukwa cha kufupika. foloko C ++ zojambula lmdbxx, momwe zolakwika zimapangidwira ngati C++ kupatulapo.

Monga njira yachangu kwambiri yolumikizira LMDB ku projekiti ya iOS kapena macOS, ndikupangira CocoaPod yanga Chithunzi cha POSLMDB.

4.1. Basic abstractions

Chilengedwe

kapangidwe MDB_env ndi malo osungiramo mkati mwa LMDB. Ntchito yokhazikika banja mdb_env limakupatsani mwayi wokonza zina mwazinthu zake. Munthawi yosavuta, kuyambitsa kwa injini kumawoneka chonchi.

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

Mu pulogalamu ya Mail.ru Cloud, tidasintha zosintha zamagawo awiri okha.

Yoyamba ndi kukula kwa malo adiresi omwe fayilo yosungira imapangidwira. Tsoka ilo, ngakhale pa chipangizo chomwecho, mtengo weniweniwo ukhoza kusiyana kwambiri kuchokera pa kuthamanga mpaka kuthamanga. Kutengera gawo ili la iOS, voliyumu yosungira kwambiri imasankhidwa mwamphamvu. Kuyambira pamtengo wina, imadulidwa motsatana ndi theka mpaka ntchitoyo mdb_env_open sichingabweretse zotsatira zosiyana ndi ENOMEM. Mwachidziwitso, palinso njira yosiyana - choyamba perekani kukumbukira pang'ono kwa injini, ndiyeno, pamene zolakwika zalandiridwa, MDB_MAP_FULL, onjezerani. Komabe, ndi minga kwambiri. Chifukwa chake ndikuti njira yogawanso kukumbukira (kubwereza) pogwiritsa ntchito ntchitoyi mdb_env_set_map_size imalepheretsa mabungwe onse (zolozera, zochitika, makiyi ndi makonda) zomwe zidalandilidwa kale kuchokera ku injini. Kutengera kusinthika kwa zochitika mu code kumabweretsa zovuta zake. Ngati, komabe, kukumbukira kwenikweni ndikofunikira kwambiri kwa inu, ndiye kuti ichi chingakhale chifukwa choyang'anitsitsa foloko yomwe yapita patsogolo. Mtengo wa MDBX, pomwe pakati pa zomwe zalengezedwa pali "kusintha kwa database komwe kumangochitika".

Gawo lachiwiri, mtengo wosasinthika womwe sunagwirizane ndi ife, umayendetsa makina owonetsetsa kuti ulusi utetezeka. Tsoka ilo, osachepera iOS 10 ili ndi vuto ndi chithandizo chosungirako ulusi. Pachifukwa ichi, mu chitsanzo pamwambapa, chosungira chimatsegulidwa ndi mbendera MDB_NOTLS. Kuphatikiza pa izi, zinali zofunikanso foloko C ++ cholembera lmdbxxkudula zosinthika ndi chikhalidwe ichi ndi momwemo.

Mazenera

Nawonso database ndi chitsanzo chosiyana cha mtengo wa B, chomwe tidakambirana pamwambapa. Kutsegula kwake kumachitika mkati mwa malonda, zomwe zingawoneke zachilendo poyamba.

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

Zowonadi, kugulitsa mu LMDB ndi malo osungira, osati gulu linalake la database. Lingaliro ili limakupatsani mwayi wochita ma atomiki pazinthu zomwe zili m'malo osiyanasiyana. Mwachidziwitso, izi zimatsegula mwayi wopanga matebulo mu mawonekedwe azinthu zosiyanasiyana, koma nthawi ina ndinatenga njira yosiyana, yofotokozedwa mwatsatanetsatane pansipa.

Makiyi ndi mfundo zofunika

kapangidwe MDB_val amawonetsa lingaliro la zonse fungulo ndi mtengo. Malo osungira alibe chidziwitso cha semantics yawo. Kwa iye, china chake chimangokhala mndandanda wa ma byte a kukula kwake. Kukula kwakukulu kofunikira ndi 512 byte.

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

Pogwiritsa ntchito chofananira, sitolo imasankha makiyiwo mokwera. Ngati simusintha ndi yanu, ndiye kuti yokhazikika idzagwiritsidwa ntchito, yomwe imawasankha mwadongosolo la lexicographic.

Zochitika

Kapangidwe kake kakufotokozedwa mwatsatanetsatane mu mutu wapita, kotero apa ndibwereza mwachidule katundu wawo wamkulu:

  1. Imathandizira zonse zoyambira ACID: atomiki, kusasinthasintha, kudzipatula ndi kudalirika. Sindingachitire mwina koma kuzindikira kuti pali cholakwika pakukhazikika pa macOS ndi iOS chomwe chidakhazikitsidwa mu MDBX. Mutha kuwerenga zambiri m'mabuku awo YERENGANI.
  2. Njira yowerengera zambiri imafotokozedwa ndi dongosolo la "wolemba m'modzi / owerenga angapo". Olemba amaletsana, koma osatsekereza owerenga. Owerenga samatsekereza olemba kapena wina ndi mnzake.
  3. Thandizo pazochita zomwe zaperekedwa.
  4. Thandizo la Multiversion.

Multiversion mu LMDB ndiyabwino kwambiri kotero kuti ndikufuna kuwonetsa ndikuchitapo kanthu. Kuchokera pamndandanda womwe uli pansipa mutha kuwona kuti kugulitsa kulikonse kumagwira ntchito chimodzimodzi ndi mtundu wa database womwe unalipo panthawi yomwe idatsegulidwa, kukhala otalikirana ndi zosintha zonse. Kuyambitsa kusungirako ndikuwonjezera zolemba zoyeserera sikuyimira chilichonse chosangalatsa, kotero miyambo iyi imasiyidwa pansi pa wowononga.

Powonjezera mayeso

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

Ndikupangira kuti muyese chinyengo chomwecho ndi SQLite ndikuwona zomwe zimachitika.

Multiversion imabweretsa zabwino kwambiri pa moyo wa wopanga iOS. Pogwiritsa ntchito malowa, mutha kusintha mosavuta komanso mwachilengedwe kuchuluka kwazomwe zachokera pamawonekedwe azithunzi, kutengera zomwe wogwiritsa ntchito akukumana nazo. Mwachitsanzo, tiyeni titengepo gawo la pulogalamu ya Mail.ru Cloud monga kutsitsa zomwe zili pagulu la media media. Ndi kulumikizana kwabwino, kasitomala amatha kuwonjezera zithunzi zingapo pamphindi pa seva. Ngati inu kusintha pambuyo aliyense download UICollectionView ndi zomwe zili mumtambo wa wogwiritsa ntchito, mutha kuyiwala za 60 fps ndikupukuta kosalala panthawiyi. Kuti mupewe zosintha pafupipafupi, muyenera kuchepetsa kuchuluka kwa zomwe data ikusintha m'munsimu UICollectionViewDataSource.

Ngati Nawonso achichepere sichirikiza multiversion ndipo amakulolani ntchito ndi mmene panopa, ndiye kuti pangani nthawi khola chithunzithunzi cha deta muyenera kukopera izo mwina mu-memory deta dongosolo kapena kwa tebulo osakhalitsa. Iliyonse mwa njirazi ndi yokwera mtengo kwambiri. Pankhani yosungira mu-memory, timapeza ndalama zonse pokumbukira, zomwe zimayambitsidwa ndi kusunga zinthu zomangidwa, ndipo m'kupita kwa nthawi, zogwirizana ndi kusintha kwa ORM. Ponena za tebulo losakhalitsa, ichi ndi chisangalalo chokwera mtengo kwambiri, chomveka pokhapokha pazochitika zopanda pake.

LMDB's multiversion solution imathetsa vuto losunga gwero lokhazikika la data m'njira yokongola kwambiri. Ndikokwanira kuti mutsegule malonda ndi voila - mpaka titamaliza, zosungirako zatsimikiziridwa kuti zidzakonzedwa. Lingaliro la liwiro lake losinthika tsopano lili m'manja mwa gawo lowonetsera, popanda kupitilira kwazinthu zofunikira.

Zotemberera

Zolozera zimapereka njira yosinthira mwadongosolo pamagulu amtengo wapatali kudzera pamadutsa amtengo wa B. Popanda iwo, sikungakhale kotheka kutsanzira bwino matebulo omwe ali mu database, yomwe tsopano tikutembenukirako.

4.2. Table Modelling

Katundu wa kuyitanitsa makiyi amakulolani kuti mumange chowonjezera chapamwamba monga tebulo pamwamba pa zoyambira. Tiyeni tiganizire izi pogwiritsa ntchito chitsanzo cha tebulo lalikulu la kasitomala wamtambo, lomwe limasunga zambiri za mafayilo ndi zikwatu za ogwiritsa ntchito.

Table schema

Chimodzi mwa zochitika zodziwika bwino zomwe dongosolo la tebulo lokhala ndi foda liyenera kupangidwira ndikusankha zinthu zonse zomwe zili mkati mwa bukhu loperekedwa. Mndandanda Wosintha. Kuti muyigwiritse ntchito pamwamba pa zosungira zamtengo wapatali, m'pofunika kusanja makiyi a mafayilo ndi zikwatu m'njira yoti agawidwe malinga ndi umembala wawo mu bukhu la makolo. Kuphatikiza apo, kuti muwonetse zomwe zili mu bukhuli mu mawonekedwe odziwika bwino kwa wogwiritsa ntchito Windows (zoyamba zikwatu, kenako mafayilo, onse osankhidwa motsatira zilembo), ndikofunikira kuphatikiza magawo ena owonjezera pakiyi.

Chithunzi chili m'munsichi chikuwonetsa momwe, kutengera ntchito yomwe ilipo, mawonekedwe a makiyi amtundu wa byte angawonekere. Ma byte okhala ndi chizindikiritso cha bukhu la makolo (ofiira) amayikidwa poyamba, kenako ndi mtundu (wobiriwira) ndi mchira wokhala ndi dzina (buluu). njira yofunika. Makiyi odutsa motsatizana okhala ndi mawu ofiira omwewo amatipatsa zomwe zimayenderana ndi dongosolo lomwe liyenera kuwonetsedwa pamawonekedwe a ogwiritsa ntchito (kumanja), osafunikira kukonzanso kwina kulikonse.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kusanja Makiyi ndi Makhalidwe

Njira zambiri zopangira zinthu zosawerengeka zapangidwa padziko lapansi. Popeza tinalibe chofunikira china koma kuthamanga, tinasankha zofulumira kwambiri - kutaya kukumbukira komwe kumagwiritsidwa ntchito ndi chikhalidwe cha chinenero cha C. Choncho, fungulo lachilolezo likhoza kutsatiridwa ndi ndondomeko yotsatirayi. NodeKey.

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

Kupulumutsa NodeKey posungira zofunika mu chinthu MDB_val ikani cholozera cha data ku adilesi ya chiyambi cha kapangidwe kake, ndikuwerengera kukula kwake ndi ntchitoyo sizeof.

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

M'mutu woyamba wokhudza kusankha kwa database, ndidatchulapo kuchepetsa kugawika kwamphamvu mkati mwa ntchito za CRUD ngati chinthu chofunikira chosankha. Kodi ntchito serialize ikuwonetsa momwe pankhani ya LMDB ingapewedweretu pakuyika zolemba zatsopano mu database. Gulu la byte lomwe likubwera kuchokera pa seva limasinthidwa koyamba kukhala ma stack, kenako amatayidwa mosungirako. Poganizira kuti palibenso magawo amphamvu mkati mwa LMDB, mutha kupeza zinthu zabwino kwambiri ndi miyezo ya iOS - gwiritsani ntchito kukumbukira kwa stack kuti mugwire ntchito ndi data panjira yonse kuchokera pa netiweki kupita ku disk!

Kuyitanitsa makiyi ndi wofananira wa binary

Ubale wofunikira kwambiri umatchulidwa ndi ntchito yapadera yotchedwa comparator. Popeza injiniyo sadziwa kalikonse za semantics ya ma byte omwe ali nawo, wofananizira wokhazikika alibe chochita koma kukonza makiyi mu dongosolo la lexicographic, pogwiritsa ntchito kufananitsa kwa byte-byte. Kuigwiritsa ntchito polinganiza zomangira kuli ngati kumeta ndi nkhwangwa yodula. Komabe, muzochitika zosavuta ndimapeza njira iyi yovomerezeka. Njira ina ikufotokozedwa pansipa, koma apa ndiwona ma rakes angapo amwazikana m'njira iyi.

Chinthu choyamba kukumbukira ndikuyimira kukumbukira kwa mitundu yakale ya data. Chifukwa chake, pazida zonse za Apple, zosintha zingapo zimasungidwa mumtundu Wamng'ono wa Endian. Izi zikutanthauza kuti baiti yocheperako idzakhala kumanzere, ndipo sikutheka kusanja manambala pogwiritsa ntchito kufananitsa kwa byte-byte. Mwachitsanzo, kuyesa kuchita izi ndi manambala kuyambira 0 mpaka 511 kutulutsa zotsatirazi.

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

Kuti muthane ndi vutoli, manambala onse ayenera kusungidwa mu kiyi mumtundu woyenera wofananira wa byte-byte. Ntchito zochokera m'banja zidzakuthandizani kuchita kusintha kofunikira hton* (makamaka htons kwa manambala awiri-byte kuchokera ku chitsanzo).

Mawonekedwe oyimira zingwe pamapulogalamu ndi, monga mukudziwa, yonse mbiri. Ngati semantics ya zingwe, komanso ma encoding omwe amagwiritsidwa ntchito kuwayimira pamtima, akuwonetsa kuti pakhoza kukhala ma byte opitilira imodzi pamunthu, ndiye kuti ndibwino kusiya nthawi yomweyo lingaliro lakugwiritsa ntchito comparator yosasinthika.

Chinthu chachiwiri kukumbukira ndi mfundo za kulinganiza structure field compiler. Chifukwa cha iwo, ma byte okhala ndi zinyalala amatha kupangidwa m'makumbukiro pakati pa minda, yomwe, ndithudi, imaphwanya kusanja kwa byte-byte. Kuti muchotse zinyalala, muyenera kulengeza minda mwadongosolo lokhazikika, kusunga malamulo oyendetsera malingaliro, kapena kugwiritsa ntchito mawonekedwe omwe ali pachidziwitso. packed.

Kuyitanitsa makiyi ndi wofananira wakunja

Lingaliro lofanizira lofunikira litha kukhala lovuta kwambiri kufananitsa wachiphamaso. Chimodzi mwa zifukwa zambiri ndi kukhalapo kwa magawo aukadaulo mkati mwazomangamanga. Ndikuwonetsa kupezeka kwawo pogwiritsa ntchito chitsanzo cha kiyi ya chikwatu chomwe timachidziwa kale.

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

Ngakhale kuphweka kwake, nthawi zambiri kumawononga kukumbukira kwambiri. Chosungira cha dzinali chimatenga ma byte 256, ngakhale pafupifupi mafayilo ndi zikwatu mayina saposa zilembo 20-30.

Imodzi mwa njira zodziwika bwino zokwaniritsira kukula kwa cholembera ndi "kuchepetsa" kukula kwake. Chofunikira chake ndikuti zomwe zili m'magawo onse akutali amasungidwa mu buffer kumapeto kwa kapangidwe kake, ndipo kutalika kwake kumasungidwa m'mitundu yosiyanasiyana. NodeKey imasinthidwa motere.

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

Kupitilira apo, pakusanja, kukula kwa data sikunatchulidwe sizeof dongosolo lonse, ndi kukula kwa minda yonse ndi utali wokhazikika kuphatikiza kukula kwa gawo lomwe lagwiritsidwa ntchito la nkhokwe.

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

Chifukwa cha refactoring, tinalandira ndalama zambiri mu danga lokhala ndi makiyi. Komabe, chifukwa cha luso luso nameLength, chofananira chosasinthika cha binary sichiyeneranso kufananitsa fungulo. Ngati sitisintha ndi yathu, ndiye kuti kutalika kwa dzina kudzakhala chinthu chofunikira kwambiri pakusanja kuposa dzinalo.

LMDB imalola database iliyonse kukhala ndi ntchito yake yofananira. Izi zimachitika pogwiritsira ntchito mdb_set_compare mosamalitsa musanatsegule. Pazifukwa zodziwikiratu, sizingasinthidwe m'moyo wonse wa database. Wofananitsa amalandira makiyi awiri mumtundu wa binary monga cholowera, ndipo pazotulutsa amabweretsa zotsatira zofananira: zosakwana (-1), zazikulu kuposa (1) kapena zofanana ndi (0). Pseudocode za NodeKey zikuwoneka choncho.

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

Malingana ngati makiyi onse omwe ali mu database ali amtundu womwewo, kuyika mopanda malire kuyimira kwawo kwamtundu wa makiyi ogwiritsira ntchito ndikovomerezeka. Pali lingaliro limodzi pano, koma lidzakambidwa pansipa mugawo la "Reading Records".

Kusunga Makhalidwe

LMDB imagwira ntchito mwamphamvu kwambiri ndi makiyi a zosungidwa zosungidwa. Kuyerekezera kwawo ndi wina ndi mzake kumachitika mkati mwa ndondomeko ya ntchito iliyonse yogwiritsidwa ntchito, ndipo ntchito ya yankho lonse imadalira kuthamanga kwa wofananitsa. M'dziko labwino, wofananira wa binary ayenera kukhala wokwanira kufananiza makiyi, koma ngati mutagwiritsa ntchito yanu, ndiye kuti njira yochotsera makiyi momwemo iyenera kukhala yachangu momwe mungathere.

Dongosolo silimakhudzidwa makamaka ndi gawo lamtengo wapatali la mbiriyo (mtengo). Kutembenuka kwake kuchokera ku mawonekedwe a byte kupita ku chinthu kumachitika pokhapokha pakufunika kale ndi code yogwiritsira ntchito, mwachitsanzo, kuti awonetse pazenera. Popeza izi zimachitika kawirikawiri, kuthamanga kwa njirayi sikofunikira kwambiri, ndipo pakukhazikitsa kwake timakhala omasuka kwambiri kuti tiyang'ane pa kuphweka. NSKeyedArchiver.

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

Komabe, pali nthawi zina pomwe magwiridwe antchito amafunikirabe. Mwachitsanzo, posunga ma metainformation pamafayilo amtambo wa ogwiritsa ntchito, timagwiritsa ntchito kukumbukira komweko kwa zinthu. Chochititsa chidwi kwambiri pa ntchito yopangira mawonekedwe otsatizana awo ndi chakuti zinthu za bukhuli zimatsatiridwa ndi magulu a magulu.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kuti agwiritse ntchito m'chinenero cha C, madera enieni a olowa nyumba amaikidwa m'magulu osiyana, ndipo kugwirizana kwawo ndi maziko kumatchulidwa kupyolera mu gawo la mgwirizano wamtundu. Zomwe zili mumgwirizanowu zimatchulidwa kudzera mumtundu wa luso.

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

Kuwonjezera ndi kukonzanso zolemba

Chinsinsi cha serialized ndi mtengo ukhoza kuwonjezeredwa ku sitolo. Kuti muchite izi, gwiritsani ntchito mdb_put.

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

Pakasinthidwe, kusungirako kumatha kuloledwa kapena kuletsedwa kusunga zolemba zambiri ndi kiyi yomweyo.Ngati kubwereza makiyi ndikoletsedwa, ndiye pakuyika zolemba, mutha kudziwa ngati kukonzanso mbiri yomwe ilipo ikuloledwa kapena ayi. Ngati kuwonongeka kungangochitika chifukwa cha cholakwika mu code, ndiye kuti mutha kudziteteza ku icho pofotokoza mbendera. NOOVERWRITE.

Kuwerenga zolemba

Kuti muwerenge zolemba mu LMDB, gwiritsani ntchito ntchitoyi mdb_get. Ngati makiyi amtengo wapatali akuimiridwa ndi zida zomwe zidatayidwa kale, ndiye kuti njirayi ikuwoneka motere.

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

Mindandanda yomwe yawonetsedwa ikuwonetsa momwe kutsatiridwa kudzera pakutaya kwadongosolo kumakupatsani mwayi wochotsa magawo osinthika osati polemba, komanso powerenga zambiri. Zochokera ku ntchito mdb_get pointer imayang'ana ndendende pa adilesi yakukumbukira komwe database imasunga mawonekedwe a chinthucho. M'malo mwake, timapeza mtundu wa ORM womwe umapereka liwiro lalikulu kwambiri lowerengera pafupifupi kwaulere. Ngakhale kukongola konse kwa njirayo, m'pofunika kukumbukira zinthu zingapo zogwirizana nazo.

  1. Pakuwerengera kokha, cholozera ku kapangidwe ka mtengo chimatsimikiziridwa kukhalabe chovomerezeka mpaka ntchitoyo itatsekedwa. Monga tanenera kale, masamba a mtengo wa B omwe chinthu chilipo, chifukwa cha mfundo yolemba-pa-kulemba, amakhalabe osasintha malinga ngati akutchulidwa ndi chinthu chimodzi. Nthawi yomweyo, ntchito yomaliza yolumikizidwa nawo ikatha, masamba atha kugwiritsidwanso ntchito pazatsopano. Ngati kuli kofunikira kuti zinthu zipulumuke zomwe zidapanga, ndiye kuti ziyenera kukopera.
  2. Pakugulitsa kowerengera, cholozera pamapangidwe amtengowo chikhala chovomerezeka mpaka njira yoyamba yosinthira (kulemba kapena kufufuta deta).
  3. Ngakhale kapangidwe NodeValue osati zonse, koma zokonzedwa (onani ndime "Kuyitanitsa makiyi pogwiritsa ntchito wofananira wakunja"), mutha kulowa m'magawo ake motetezeka kudzera pa cholozera. Chachikulu ndichakuti musakhumudwe!
  4. Mulimonse momwe zingakhalire, dongosololi liyenera kusinthidwa kudzera pa pointer yolandilidwa. Zosintha zonse ziyenera kupangidwa kudzera munjira mdb_put. Komabe, ziribe kanthu momwe mungafunire kuchita izi, sizingatheke, popeza malo okumbukira kumene dongosololi lili ndi mapu owerengeka okha.
  5. Bwezeretsani fayilo ku malo adiresi ya ndondomeko ndi cholinga cha, mwachitsanzo, kuwonjezera kukula kwakukulu kosungirako pogwiritsa ntchito ntchitoyi mdb_env_set_map_size imalepheretsa zochitika zonse ndi mabungwe okhudzana nawo komanso zolozera kuzinthu zina.

Pomaliza, mbali ina ndi yobisika kwambiri kotero kuti kuwulula tanthauzo lake sikugwirizana ndi ndime ina. Mumutu wonena za mtengo wa B, ndidapereka chithunzi cha momwe masamba ake amasanjidwira pamtima. Izi zimachokera ku izi kuti adilesi yoyambira ya buffer yokhala ndi data yotsatiridwa ikhoza kukhala yosasinthika. Chifukwa cha ichi, cholozera kwa iwo analandira mu kapangidwe MDB_val ndi kuchepetsedwa kukhala cholozera ku kapangidwe kake, kumakhala kosagwirizana nthawi zambiri. Nthawi yomweyo, zomanga za tchipisi zina (pankhani ya iOS iyi ndi armv7) zimafuna kuti adilesi ya data iliyonse ikhale yochulukirapo kukula kwa mawu amakina kapena, mwa kuyankhula kwina, kukula pang'ono kwa dongosolo ( pa armv7 ndi 32 bits). M'mawu ena, ntchito ngati *(int *foo)0x800002 Pa iwo (pazimenezo) ndikofanana ndi kuthawa, ndipo Kumatsogolera ku imfa ndi chigamulo EXC_ARM_DA_ALIGN. Pali njira ziwiri zopewera tsoka lomvetsa chisoni ngati limeneli.

Choyamba ndi kukopera koyambirira kwa deta m'njira yowonekera bwino. Mwachitsanzo, pa chofananira chachizolowezi izi ziwoneka motere.

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

Njira ina ndikudziwitsira wophatikiza pasadakhale kuti zida zamtengo wapatali sizingakhale zogwirizana aligned(1). Pa ARM mutha kukhala ndi zotsatira zomwezo kukwaniritsa ndi kugwiritsa ntchito mawonekedwe odzaza. Poganizira kuti zimathandizanso kukhathamiritsa malo okhala ndi kapangidwe kake, njira iyi ikuwoneka ngati yabwino kwa ine, ngakhale приводит kuonjezera mtengo wa ntchito zopezera deta.

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

Mafunso osiyanasiyana

Kuti mubwerezenso pagulu la zojambulira, LMDB imapereka chithunzithunzi cha cholozera. Tiyeni tiwone momwe tingagwiritsire ntchito pogwiritsa ntchito chitsanzo cha tebulo lomwe lili ndi metadata yamtambo yomwe timaidziwa kale.

Monga gawo la kuwonetsa mndandanda wa mafayilo mu bukhu, ndikofunikira kupeza makiyi onse omwe mafayilo ake amwana ndi zikwatu zimagwirizanitsidwa. M'zigawo zam'mbuyo tinasanja makiyi NodeKey kotero kuti amalamulidwa ndi ID ya chikwatu cha makolo. Chifukwa chake, mwaukadaulo, ntchito yobwezeretsanso zomwe zili mufoda imatsikira pakuyika cholozera pamalire apamwamba a gulu la makiyi okhala ndi prefix yoperekedwa kenako ndikubwereza mpaka kumalire apansi.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kumtunda kungapezeke mwachindunji ndi kufufuza motsatizana. Kuti muchite izi, cholozeracho chimayikidwa kumayambiriro kwa mndandanda wonse wa makiyi mu nkhokwe ndikuwonjezeranso mpaka fungulo lokhala ndi chizindikiritso cha bukhu la makolo likuwonekera pansipa. Njira iyi ili ndi zovuta ziwiri zoonekeratu:

  1. Kusaka kosavuta kwa mzere, ngakhale, monga kumadziwika, mumitengo yonse komanso mumtengo wa B makamaka kumatha kuchitika mu nthawi ya logarithmic.
  2. Mwachabe, masamba onse omwe akutsatiridwa omwe akufunidwa amachotsedwa pafayilo kupita ku kukumbukira kwakukulu, komwe ndi kokwera mtengo kwambiri.

Mwamwayi, LMDB API imapereka njira yabwino yokhazikitsira cholozera poyambira.Kuti muchite izi, muyenera kupanga kiyi yomwe mtengo wake ndi wocheperako kapena wofanana ndi kiyi yomwe ili pamalire akumtunda kwa nthawiyo. Mwachitsanzo, pokhudzana ndi mndandanda womwe uli pamwambapa, titha kupanga kiyi yomwe gawolo parentId adzakhala wofanana ndi 2, ndipo ena onse adzazidwa ndi ziro. Kiyi yodzaza pang'ono yotere imaperekedwa kuzinthu zolowetsamo mdb_cursor_get kusonyeza ntchito 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);

Ngati malire akumtunda a gulu la makiyi apezeka, ndiye kuti timabwereza mpaka titakumana kapena fungulo likumana ndi lina. parentId, kapena makiyi sadzatha konse.

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

Chomwe chili chabwino ndichakuti monga gawo la kubwereza pogwiritsa ntchito mdb_cursor_get, sitipeza makiyi okha, komanso mtengo wake. Ngati, kuti mukwaniritse ziwerengero zachitsanzo, muyenera kuyang'ana, mwa zina, minda kuchokera ku gawo lamtengo wapatali la mbiriyo, ndiye kuti imapezeka popanda manja owonjezera.

4.3. Kutengera maubwenzi pakati pa matebulo

Pakalipano, takwanitsa kulingalira mbali zonse za kupanga ndi kugwira ntchito ndi database ya tebulo limodzi. Titha kunena kuti tebulo ndi seti ya zolemba zosanjidwa zomwe zimakhala ndi mitundu yofanana yamagulu amtengo wapatali. Ngati muwonetsa fungulo ngati rectangle ndi mtengo wogwirizana ngati parallelepiped, mumapeza chithunzithunzi cha database.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Komabe, m’moyo weniweni n’kovuta kwambiri kupirira ndi kukhetsa mwazi kochepa. Nthawi zambiri mu database imafunika, choyamba, kukhala ndi matebulo angapo, ndipo kachiwiri, kusankha mwadongosolo losiyana ndi kiyi yoyamba. Gawo lomalizali limaperekedwa ku nkhani za kulengedwa kwawo ndi kulumikizana.

Matebulo a index

Pulogalamu yamtambo ili ndi gawo la "Gallery". Imawonetsa zomwe zili mumtambo wonse, zosankhidwa ndi tsiku. Kuti mugwiritse ntchito bwino kusankha kotere, pafupi ndi tebulo lalikulu muyenera kupanga lina ndi makiyi amtundu watsopano. Adzakhala ndi gawo lokhala ndi tsiku lomwe fayilo idapangidwa, yomwe idzakhala ngati njira yoyambira yosankhira. Chifukwa makiyi atsopano amatchulanso data yofanana ndi makiyi omwe ali patebulo lalikulu, amatchedwa mafungulo a index. Mu chithunzi chomwe chili m'munsimu iwo akuwunikira mu lalanje.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Kuti mulekanitse makiyi a matebulo osiyanasiyana wina ndi mnzake mkati mwa nkhokwe yomweyo, tabu laukadaulo laukadaulo linawonjezedwa kwa onsewo. Pakupanga kukhala kofunikira kwambiri pakusanja, tidzakwanitsa kupanga makiyi poyamba ndi matebulo, komanso mkati mwamatebulo - molingana ndi malamulo athu.

Kiyi ya index imatchulanso data yofanana ndi kiyi yoyamba. Kukhazikitsa molunjika kwa malowa pophatikiza nawo gawo la mtengo wa kiyi yayikulu sikuli koyenera kuchokera pamawonedwe angapo:

  1. Pankhani ya danga lomwe latengedwa, metadata ikhoza kukhala yolemera kwambiri.
  2. Kuchokera pamawonekedwe a magwiridwe antchito, popeza pokonzanso metadata ya node, muyenera kuyilembanso pogwiritsa ntchito makiyi awiri.
  3. Kuchokera pamawonedwe a chithandizo cha ma code, ngati tiiwala kusinthira deta pa imodzi mwa makiyi, tidzapeza cholakwika cha kusagwirizana kwa deta posungirako.

Kenako, tikambirana mmene tingathetsere zofooka zimenezi.

Kukonzekera maubwenzi pakati pa matebulo

Chitsanzocho ndi choyenera kugwirizanitsa tebulo la ndondomeko ndi tebulo lalikulu "kiyi ngati mtengo". Monga momwe dzina lake likusonyezera, gawo lamtengo wapatali la zolemba za index ndi kopi yamtengo wapatali wamtengo wapatali. Njirayi imathetsa zovuta zonse zomwe tazitchula pamwambapa zomwe zimagwirizanitsidwa ndi kusunga kopi ya gawo lamtengo wapatali la zolemba zoyambirira. Mtengo wokhawo ndikuti kuti mupeze mtengo ndi kiyi ya index, muyenera kufunsa mafunso awiri ku database m'malo mwa imodzi. Mwadongosolo, schema ya database yomwe imachokera imawoneka chonchi.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Chitsanzo china chokonzekera maubwenzi pakati pa matebulo ndi "makiyi osafunikira". Chofunikira chake ndikuwonjezera zina zowonjezera pa kiyiyo, zomwe zimafunikira osati pakusankha, koma kukonzanso fungulo lomwe likugwirizana nalo. Pankhani ya machitidwe ena a iOS, ndipereka zopeka, koma chitsanzo chomveka bwino

Makasitomala amtundu wamtambo ali ndi tsamba lomwe limawonetsa mafayilo onse ndi zikwatu zomwe wogwiritsa ntchito adagawana ndi anthu ena. Popeza pali ochepa mafayilo oterowo, ndipo pali mitundu yambiri yosiyanasiyana yazidziwitso zodziwika bwino zomwe zimalumikizidwa ndi iwo (omwe amapatsidwa mwayi, ndi maufulu ati, ndi zina), sizingakhale zomveka kulemetsa gawo lamtengo wapatali la lembani nawo mu tebulo lalikulu. Komabe, ngati mukufuna kuwonetsa mafayilo oterowo pa intaneti, muyenera kuwasungabe kwinakwake. Njira yachilengedwe ndiyo kupanga tebulo losiyana kwa izo. Pachithunzi chomwe chili m'munsimu, fungulo lake lalembedwa ndi "P", ndipo choyimira "propname" chitha kusinthidwa ndi mtengo wake "zambiri za anthu".

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Metadata yonse yapadera, pofuna kusunga zomwe tebulo latsopano linapangidwa, imayikidwa mu gawo lamtengo wapatali la mbiriyo. Panthawi imodzimodziyo, simukufuna kubwereza deta ya mafayilo ndi zikwatu zomwe zasungidwa kale patebulo lalikulu. M'malo mwake, deta yowonjezereka imawonjezedwa ku kiyi ya "P" mu mawonekedwe a "node ID" ndi "timestamp". Chifukwa cha iwo, mutha kupanga kiyi ya index, momwe mungapezere kiyi yoyambira, yomwe, pomaliza, mutha kupeza metadata ya node.

Pomaliza

Timawunika zotsatira za kukhazikitsidwa kwa LMDB bwino. Pambuyo pake, kuchuluka kwa ntchito kumaundana kunatsika ndi 30%.

Kuwala ndi umphawi wa database yamtengo wapatali LMDB mu mapulogalamu a iOS

Zotsatira za ntchito yomwe idachitika zidawoneka kuposa gulu la iOS. Pakadali pano, gawo limodzi la "Mafayilo" mu pulogalamu ya Android yasinthanso kugwiritsa ntchito LMDB, ndipo magawo ena ali m'njira. Chilankhulo cha C, chomwe sitolo yamtengo wapatali imayendetsedwa, chinali chithandizo chabwino poyambitsa ndondomeko yogwiritsira ntchito kuzungulira nsanja mu C ++. Jenereta yamakhodi idagwiritsidwa ntchito kulumikiza mosadukiza laibulale ya C++ yokhala ndi code ya nsanja mu Objective-C ndi Kotlin. Djinni kuchokera ku Dropbox, koma ndi nkhani yosiyana kwambiri.

Source: www.habr.com

Kuwonjezera ndemanga