Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Mukudonha kwa2019, chiitiko chakamirirwa kwenguva refu chakaitika muMail.ru Cloud iOS timu. Iyo huru dhatabhesi yekuenderera mberi yekuchengetedza yenyika yekushandisa yave yakasarudzika kune mobile world Mheni Memory-Mapped Database (LMDB). Pazasi pekucheka tinokupa iwe ongororo yakadzama yayo muzvikamu zvina. Kutanga, ngatitaure pamusoro pezvikonzero zvechisarudzo chakadaro chisiri chiduku uye chakaoma. Ipapo isu tichaenderera mberi nekutarisa mbiru nhatu dziri pamwoyo weiyo LMDB architecture: ndangariro-mamepu mafaera, B+-muti, kopi-pa-kunyora maitiro ekushandisa transactional uye multiversion. Pakupedzisira, ye dessert - iyo inoshanda chikamu. Mariri isu tichatarisa maitiro ekugadzira uye kuita dhatabhesi schema ine akati wandei matafura, kusanganisira indekisi imwe, pamusoro peyakaderera-level kiyi-value API.

Zviri mukati

  1. Kukurudzira kuita
  2. LMDB Positioning
  3. Mbiru nhatu dzeLMDB
    3.1. Whale #1. Memory-mapped mafaira
    3.2. Whale #2. B+-muti
    3.3. Whale #3. Kopa-pa-kunyora
  4. Kugadzira data schema pamusoro pekiyi-kukosha API
    4.1. Basic abstractions
    4.2. Tafura Modelling
    4.3. Kuenzanisira hukama pakati pematafura

1. Kukurudzira kuita

Rimwe gore muna 2015, takatora dambudziko kuyera kuti kangani iyo interface yeapp yedu inononoka. Takaita izvi nechikonzero. Isu takagamuchira zvichemo zvakajairika kuti dzimwe nguva application inomira kupindura kune zviito zvemushandisi: mabhatani haagone kudzvanywa, rondedzero haapure, nezvimwe. Nezve mechanics ezviyero akaudza paAvitoTech, saka pano ini ndinopa chete kurongeka kwenhamba.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Mibairo yekuyera yakava mvura inotonhora kwatiri. Zvakazoitika kuti kune mamwe matambudziko akawanda anokonzerwa nechando kupfuura mamwe. Kana usati waona chokwadi ichi chikuru tekinoroji chiratidzo chemhando chaive chisina kuparara, saka mushure mekutarisa kusuduruka pafreeze free.

Kuvaka dashboard ine chando uye mushure mekushandisa quantitative и mhando kuongororwa kwezvikonzero zvavo, muvengi mukuru akave akajeka - inorema bhizinesi logic yakaitwa mushinda huru yechishandiso. Kuita kwomuzvarirwo kuuku kunyadziswa kwakanga kuri chishuvo chinopisa chokukusundira muhova dzebasa. Kuti tigadzirise dambudziko iri zvine hungwaru, takatendeukira kune akawanda-ane tambo yekuvaka yakavakirwa pane vakareruka vatambi. Ndakazvitsaurira kune kuchinjika kwayo kune iOS world shinda mbiri pamubatanidzwa Twitter uye nyaya yaHabré. Sechikamu cherondedzero yazvino, ndinoda kusimbisa izvo zvikamu zvesarudzo zvakakonzera kusarudzwa kwedatabase.

Iyo mutambi modhi yehurongwa hwesangano inofunga kuti multithreading inova chinhu chechipiri. Enzanisa zvinhu zviri mairi sekuda kuyambuka miganhu yehova. Uye havaite izvi dzimwe nguva uye pano nepapo, asi kanenge nguva dzose uye kwese kwese

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Iyo dhatabhesi ndechimwe chezvikamu zvekona mudhayagiramu yakaratidzwa. Basa rayo guru nderekushandisa macropattern Shared Database. Kana munyika yebhizinesi inoshandiswa kuronga kuwiriranisa data pakati pemasevhisi, saka mune yeactor architecture - data pakati petambo. Nekudaro, isu taida dhatabhesi yaisazokonzeresa kuoma kudiki kana tichishanda nayo munzvimbo ine tambo dzakawanda. Kunyanya, izvi zvinoreva kuti zvinhu zvakatorwa kubva mairi zvinofanirwa kunge zvakachengetedzeka, uye zvisingaite zvachose. Sezvaunoziva, iyo yekupedzisira inogona kushandiswa panguva imwe chete kubva kune akati wandei tambo pasina kushandisa chero kukiya, iyo ine mhedzisiro inobatsira pakuita.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplicationChechipiri chakakosha chinhu chakapesvedzera kusarudzwa kwedatabase yaive yedu gore API. Yakafemerwa nenzira yekuwiriranisa yakatorwa negit. Saiye, takavavarira offline-yekutanga API, iyo inotaridzika kupfuura yakakodzera kune vatengi vefu. Zvaifungidzirwa kuti vaizongopomba iyo yakazara mamiriro egore kamwe chete, uye ipapo kuyananidza muhuwandu hwakawanda hwezviitiko kwaizoitika kuburikidza nekuburitsa shanduko. Maiwe, mukana uyu uchiri munharaunda yedzidziso, uye vatengi havana kudzidza maitiro ekushanda nezvigamba mukuita. Pane zvikonzero zvakawanda zvechinangwa cheizvi, izvo, kuitira kuti tisanonoke kusuma, tichasiya mabhuraketi. Zvino, chii chinonyanya kufarirwa mhedziso dzechidzidzo nezve zvinoitika kana API ichiti "A" uye mutengi wayo asingatauri "B".

Saka, kana iwe uchifungidzira git, iyo, kana ichiita yekudhonza kuraira, pachinzvimbo chekushandisa zvigamba kune yemuno snapshot, inofananidza iyo yakazara mamiriro neiyo yakazara server state, ipapo iwe uchave neruzivo rwakakwana rwekuti kuwiriranisa kunoitika sei mugore. vatengi. Zviri nyore kufungidzira kuti kuzviita, unofanirwa kugovera miti miviri yeDOM mundangariro ine meta-ruzivo nezvese server uye mafaera emunharaunda. Zvinoitika kuti kana mushandisi akachengeta 500 zviuru mafaera mugore, zvino kuti aenderane iyo inofanirwa kudzokorora uye kuparadza miti miviri ine 1 miriyoni node. Asi node imwe neimwe ihomwe ine girafu yezvinyorwa. Muchiedza ichi, mibairo yeprofile yaitarisirwa. Zvakazoitika kuti kunyangwe pasina kufunga nezve kubatanidza algorithm, iyo nzira yekugadzira uye nekuzoparadza nhamba huru yezvinhu zvidiki inodhura peni yakanaka. yezvinyorwa zvevashandisi. Nekuda kweizvozvo, isu tinogadzirisa chechipiri chakakosha chiyero pakusarudza dhatabhesi - kugona kuita CRUD mashandiro pasina simba rekugovanisa zvinhu.

Zvimwe zvinodiwa ndezvakawanda zvechinyakare uye runyorwa rwavo rwese rwunotevera.

  1. Thread safety.
  2. Multiprocessing. Inotungamirwa nechishuwo chekushandisa iyo yakafanana dhatabhesi muenzaniso kuwiriranisa nyika kwete chete pakati petambo, asiwo pakati peiyo huru application uye iOS edzedzero.
  3. Iko kugona kumiririra masangano akachengetwa sezvinhu zvisingachinjike
  4. Hapana kugoverwa kwesimba mukati meCRUD mashandiro.
  5. Transaction tsigiro yezvinhu zvakakosha ACID: atomicity, kuwirirana, kuzviparadzanisa uye kuvimbika.
  6. Speed ​​​​pamakesi anozivikanwa zvikuru.

Neiyi seti yezvinodiwa, SQLite yaive uye inoramba iri sarudzo yakanaka. Zvisinei, sechikamu chefundo yedzimwe nzira, ndakawana bhuku "Kutanga neLevelDB". Pasi pehutungamiriri hwake, mucherechedzo wakanyorwa uchienzanisa kumhanya kwebasa nemadhatabhesi akasiyana mune chaiwo makore ezviitiko. Mhedzisiro yacho yakapfuura zvataitarisira zvakanyanya. Muzviitiko zvinonyanya kufarirwa - kuwana cursor pane yakarongwa runyorwa rweese mafaera uye yakarongwa runyorwa rweese mafaera edhairekitori rakapihwa - LMDB yakave nekukurumidza kagumi kupfuura SQLite. Sarudzo yakava pachena.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

2. LMDB Positioning

LMDB iraibhurari diki kwazvo (chete gumi mitsara) inoshandisa iyo yakaderera yakakosha dhatabhesi - kuchengetedza.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Dhiagiramu iri pamusoro inoratidza kuti kuenzanisa LMDB neSQLite, iyo inoshandisawo mazinga epamusoro, kazhinji haina kururama kupfuura SQLite neCore Data. Zvingave zvakanaka kutaura injini dzakafanana dzekuchengetera sevakwikwidzi vakaenzana - BerkeleyDB, LevelDB, Sophia, RocksDB, etc. Pane kunyange budiriro apo LMDB inoshanda sechikamu cheinjini yekuchengetedza cheSQLite. Yekutanga kuedza kwakadaro kwaiva muna 2012 kupedza neLMDB Howard Chu. Mhinduro zvakazonakidza zvekuti danho rake rakatorwa nevaifarira OSS, ndokuona kuenderera kwaro mumunhu. LumoSQL. Muna Ndira 2020, munyori wechirongwa ichi aive Den Shearer present iyo paLinuxConfAu.

LMDB inonyanya kushandiswa seinjini yemashandisirwo edhatabhesi. Raibhurari inokwereta kutaridzika kwayo kune vanogadzira OpenLDAP, vakanga vasina kugutsikana zvakanyanya neBerkeleyDB sehwaro hwepurojekiti yavo. Kutanga kubva kuraibhurari ine mwero btree, Howard Chu akakwanisa kugadzira imwe yenzira dzakakurumbira dzenguva yedu. Akatsaurira rondedzero yake inotonhorera kune iyi nyaya, pamwe nemukati mechimiro cheLMDB. "The Lightning Memory-mapped Database". Muenzaniso wakanaka wekukunda nzvimbo yekuchengetera wakagovaniswa naLeonid Yuryev (aka yleo) kubva kuPositive Technologies mumushumo wake paHighload 2015 "Injini yeLMDB ishasha yakakosha". Mariri, anotaura nezve LMDB mumamiriro ezvinhu ebasa rakafanana rekuita ReOpenLDAP, uye LevelDB yakatove pasi pekutsoropodzwa kwekuenzanisa. Nekuda kwekuita, Positive Technologies yakatova neforogo inoshingaira MDBX ine zvinonaka kwazvo maficha, optimizations uye bugfixes.

LMDB inowanzo shandiswa senge-iri kuchengetedza. Somuenzaniso, Mozilla Firefox browser akasarudza iyo kune akati wandei ezvido, uye, kutanga kubva mushanduro 9, Xcode preferred yayo SQLite yekuchengetedza indexes.

Injini yakaitawo mucherechedzo wayo munyika yekusimudzira nhare. Tsanangudzo yekushandiswa kwayo inogona kuva kuwana mune iOS mutengi weTeregiramu. LinkedIn yakatoenda kumberi uye yakasarudza LMDB seyakagadzika chengetedzo yayo yemusha data caching framework Rocket Data, nezve akaudza muchinyorwa chake muna 2016.

LMDB iri kubudirira kurwira nzvimbo muzuva mune niche yakasiiwa neBerkeleyDB mushure mekunge yave pasi pekutonga kweOracle. Raibhurari inodiwa nekukurumidza uye kuvimbika, kunyangwe ichienzaniswa nevezera rayo. Sezvaunoziva, hapana mabiko emahara, uye ndinoda kusimbisa iyo kutengeserana-iyo yauchafanirwa kutarisana nayo pakusarudza pakati peLMDB neSQLite. Dhiagiramu iri pamusoro inoratidza zvakajeka kuti kuwedzera kwekukurumidza kunowanikwa sei. Chekutanga, isu hatibhadhare mamwe matinji ekubvisa pamusoro pekuchengetera dhisiki. Zviripachena kuti chivakwa chakanaka hachisati chakwanisa kuita pasina ivo, uye ivo vanozoonekwa mukodhi yekushandisa, asi ivo vanozonyanya kupusa. Izvo hazvizove nezvimiro zvisingadiwe neimwe application, semuenzaniso, tsigiro yemibvunzo mumutauro weSQL. Chechipiri, zvinogoneka kunyatso shandisa mepu yemashandisirwo ekushandisa pane zvikumbiro zvekuchengetedza dhisiki. Kana SQLite mubasa rangu yakavakirwa paavhareji yezviverengero zvinodiwa zveavhareji application, saka iwe, semugadziri weapplication, unonyatsoziva mamiriro makuru ebasa. Kuti uwane mhinduro inobudirira, iwe uchafanirwa kubhadhara yakawedzera mutengo tag zvese zvekuvandudza kwekutanga mhinduro uye nerutsigiro runotevera.

3. Mbiru nhatu dzeLMDB

Takatarisa LMDB kubva paziso reshiri, yakanga yave nguva yekupinda mukati. Zvikamu zvitatu zvinotevera zvichave zvakapihwa kuongororwa kwembiru huru iyo yekuchengetera zvivakwa:

  1. Memory-mapped mafaira senzira yekushanda ne diski uye kuwiriranisa zvemukati data zvimiro.
  2. B + -muti sesangano rechimiro che data rakachengetwa.
  3. Copy-on-write senzira yekupa ACID transaction zvivakwa uye multiversion.

3.1. Whale #1. Memory-mapped mafaira

Memory-mamepu mafaera chinhu chakakosha chekuvaka zvekuti anotooneka muzita renzvimbo. Nyaya dze caching uye kuwiriranisa kwekuwana ruzivo rwakachengetwa dzakasiiwa zvachose kune inoshanda sisitimu. LMDB haina chero cache mukati mayo. Ichi chisarudzo chemunyori, sezvo kuverenga data zvakananga kubva kumafaira akamepurwa kunokubvumira kutema makona akawanda mukuita injini. Pazasi pane kure kubva kuzere runyorwa rwevamwe vavo.

  1. Kuchengetedza kuenderana kwedata mukuchengetedza kana uchishanda nayo kubva kune akati wandei maitiro inova mutoro weiyo inoshanda sisitimu. Muchikamu chinotevera, makanika aya anokurukurwa zvakadzama uye nemifananidzo.
  2. Kusavapo kwema cache kunobvisa zvachose LMDB kubva kumusoro kwakabatana neane simba kugoverwa. Kuverenga data mukuita kunoreva kuseta chinongedzo kukero chaiyo mundangariro chaiyo uye hapana chimwe. Zvinonzwika senge ngano yesainzi, asi mudura rekodhi kodhi mafoni ese kune calloc anonamirwa mukuchengetedza dhizaini.
  3. Kusavapo kwema cache kunorevawo kusavapo kwekiyi dzine chekuita nekuwiriranisa kwekuwana kwavo. Vaverengi, avo vanogona kuve nehuwandu hwekuverengera hwevaverengi panguva imwe chete, havasangane nechinhu chimwe chete mutex munzira yavo kuenda kune data. Nekuda kweizvi, kumhanya kwekuverenga kune kwakaringana mutsara scalability zvichienderana nehuwandu hweCPUs. MuLMDB, maitiro ekugadzirisa chete anowiriraniswa. Panogona kuve nemunyori mumwe chete panguva.
  4. Hushoma hwe caching uye synchronization logic inobvisa iyo yakanyanya kuomarara mhando yezvikanganiso zvine chekuita nekushanda munzvimbo ine tambo dzakawanda. Paive nezvidzidzo zviviri zvinonakidza zve database kumusangano we Usenix OSDI 2014: "Ese Mafaira Sisitimu Haana Kusikwa Akaenzana: Pakuomerwa kweKugadzira Crash-Inoenderana Zvikumbiro" и "Kutambudza Databases Kunakidzwa uye Kubatsira". Kubva kwavari iwe unogona kunhonga ruzivo nezve kuvimbika kusati kwamboitika kweLMDB uye kuita kunenge kusina chikanganiso kweACID transaction zvivakwa, iri pamusoro peiyo yeSQLite.
  5. Iyo minimalism yeLMDB inobvumira iyo muchina unomiririra kodhi yayo kuti iwanikwe zvizere muL1 cache ye processor ine inotevera kumhanya maitiro.

Nehurombo, muIOS, ine ndangariro-mamepu mafaera, zvese hazvisi zvisina makore sezvatinoda. Kuti utaure pamusoro pezvikanganiso zvakabatana navo zvakanyanya kuziva, zvinodikanwa kuyeuka misimboti yakajairika yekushandisa iyi michina mumasisitimu anoshanda.

Ruzivo rwakakwana nezvemafaira akamepurwa ndangariro

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplicationNeyese application inomhanya, iyo inoshanda sisitimu inosanganisa chinhu chinonzi process. Maitiro ega ega anopihwa dhizaini yekero umo inoisa zvese zvainoda kushanda. Pamakero akaderera pane zvikamu zvine kodhi uye yakaoma-coded data uye zviwanikwa. Inotevera inouya bhuroka rinokura renzvimbo yekero, inozivikanwa kwatiri pasi pezita remurwi. Iine kero dzemasangano anooneka panguva yekushanda kwechirongwa. Pamusoro inzvimbo yekurangarira inoshandiswa nestack yekushandisa. Iyo inokura kana makondirakiti; mune mamwe mazwi, saizi yayo zvakare ine hunhu hunochinja. Kudzivirira murwi uye murwi kubva kusundidzirana uye kukanganisa kune mumwe nemumwe, iwo anowanikwa kune akasiyana magumo enzvimbo yekero. Pane buri pakati pezvikamu zviviri zvine simba kumusoro nepasi. Iyo inoshanda sisitimu inoshandisa kero muchikamu chepakati ichi kubatanidza akasiyana masangano nemaitiro. Kunyanya, inogona kubatanidza imwe inoenderera seti yemakero nefaira pane dhisiki. Iro faira rakadaro rinonzi memory-mapped

Nzvimbo yekero yakagoverwa kugadziriro yacho yakakura. Tichifunga, nhamba yemakero inogumira chete nehukuru hweinongedza, iyo inotarwa neiyo bit kugona kweiyo system. Kana ndangariro dzemuviri dzainge dzakamepu kwairi 1-kusvika-1, saka yekutanga maitiro aikwidza RAM yese, uye hapazove nekutaura kwekuita zvakawanda.

Nekudaro, kubva muruzivo rwedu tinoziva kuti masisitimu emazuva ano anoshanda panguva imwe chete anogona kuita akawanda maitiro sezvaanoda. Izvi zvinogoneka nekuda kwekuti ivo vanongogovera yakawanda ndangariro kune maitiro pabepa, asi muchokwadi ivo vanoisa muhukuru hwemuviri ndangariro chete icho chikamu chiri kudiwa pano uye ikozvino. Nokudaro, chiyeuchidzo chinobatanidzwa nemaitiro chinonzi virtual.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Iyo inoshanda sisitimu inoronga chaiyo uye yemuviri ndangariro mumapeji eimwe saizi. Pangosvika imwe peji yevirtual memory iri kudiwa, iyo inoshanda sisitimu inoiisa mundangariro yemuviri uye inovafananidza mune yakakosha tafura. Kana pasina mahara slots, ipapo imwe yemapeji akaremerwa akateedzerwa kudhisiki, uye iyo iri kudiwa inotora nzvimbo yayo. Iyi nzira, yatichadzokera kwairi munguva pfupi, inonzi swapping. Mufananidzo uri pasi apa unoratidza maitiro anotsanangurwa. Pairi, peji A ine kero 0 yakarongedzerwa ndokuiswa papeji huru yendangariro ine kero 4. Idi iri rakaratidzirwa mutafura yetsamba musero nhamba 0.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Nyaya yacho yakafanana nemafaira akaiswa mundangariro. Zvine musoro, ivo vanofanirwa kuenderera uye zvachose vari munzvimbo chaiyo yekero. Nekudaro, ivo vanopinda yemuviri ndangariro peji nepeji uye chete pakukumbira. Kugadziriswa kwemapeji akadaro kunopindirana nefaira pa diski. Nenzira iyi, unogona kuita faira I/O nekungoshanda nemabheti mundangariro - shanduko dzese dzinozoendeswa otomatiki neiyo inoshanda system kernel kune iyo faira faira.

Mufananidzo uri pazasi unoratidza kuti LMDB inowiriranisa sei mamiriro ayo kana ichishanda nedhatabhesi kubva kune akasiyana maitiro. Nekugadzira mepu chaiyo yekurangarira maitiro akasiyana kune imwechete faira, isu tinosungirwa iyo inoshanda sisitimu kuti iwiriranise neshanduko mamwe mabhuraki enzvimbo dzekero yavo neimwe, uko LMDB inotarisa.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Chinhu chakakosha nuance ndechekuti LMDB, nekukasira, inoshandura iyo data faira kuburikidza nekunyora system yekufona michina, uye inoratidza iyo faira pachayo mukuverenga-chete modhi. Iyi nzira ine migumisiro miviri inokosha.

Mhedzisiro yekutanga yakajairika kune ese anoshanda masisitimu. Chinhu chayo ndechekuwedzera dziviriro kubva mukukuvadza kusingatarisirwi kune dhatabhesi nekodhi isiriyo. Sezvaunoziva, mirairo inogoneka yemaitiro yakasununguka kuwana data kubva chero kupi munzvimbo yayo yekero. Panguva imwecheteyo, sezvatakangoyeuka, kuratidza faira mukuverenga-kunyora mode kunoreva kuti chero murairo unogonawo kuushandura. Kana akaita izvi nekukanganisa, achiedza, semuenzaniso, kunyora pamusoro pechimwe chinhu pane isiripo index, ipapo anogona netsaona kushandura faira rakamisikidzwa kukero iyi, izvo zvinozotungamira kuhuori hwedhatabhesi. Kana iyo faira ichitaridzwa mukuverenga-chete modhi, saka kuedza kushandura inoenderana kero nzvimbo kunotungamira kumisa kwekukurumidzira kwechirongwa nechiratidzo. SIGSEGV, uye iyo faira icharamba yakasimba.

Chechipiri mhedzisiro yatove yakananga kune iOS. Kana munyori kana chero mamwe masosi anozvitaura zvakajeka, asi pasina iyo LMDB haingakodzeri kumhanya pane ino mbozha nhare. Chikamu chinotevera chakazvipira kutarisisa kwayo.

Zvakananga zvendangariro-mamepu mafaera muiOS

Paive nemushumo unoshamisa paWWDC muna 2018 "iOS Memory Deep Dive". Inotiudza kuti muIOS, mapeji ese ari mundangariro yemuviri ndeimwe yemhando 3: yakasviba, yakamanikidzwa uye yakachena.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Yakachena ndangariro muunganidzwa wemapeji anogona kuburitswa zvisina kurwadza kubva mundangariro dzemuviri. Iyo data yavanayo inogona kurodha zvakare sezvinodiwa kubva kune yayo yekutanga masosi. Mafaira ekuverenga-chete akaiswa mundangariro anowira muchikamu ichi. iOS haitye kuburitsa mapeji akamepurwa kune faira kubva mundangariro chero nguva, sezvo iwo akavimbiswa kuwiriraniswa nefaira pa diski.

Mapeji ese akagadziridzwa anopedzisira ave mundangariro dzakasviba, zvisinei kuti aivepi pekutanga. Kunyanya, ndangariro-mamepu mafaera akagadziridzwa nekunyora kune chaiyo ndangariro yakabatana nawo anozoiswa nenzira iyi. Kuvhura LMDB nemureza MDB_WRITEMAP, mushure mekuita shanduko pazviri, unogona kuzvisimbisa iwe pachako.

Kana application ichangotanga kutora yakawandisa ndangariro yemuviri, iOS inozviisa kune yakasviba peji compression. Iyo yakazara ndangariro inogarwa netsvina uye yakamanikidzwa mapeji inoumba iyo application inonzi inonzi memory footprint. Kana yangosvika pane imwe chikumbaridzo kukosha, iyo OOM killer system daemon inouya mushure mekuita uye nekuimisa nechisimba. Uku ndiko kusarudzika kweiOS kana ichienzaniswa nedesktop inoshanda masisitimu. Mukupesana, kudzikisira ndangariro tsoka nekuchinjanisa mapeji kubva kundangariro yemuviri kuenda kudhisiki hakuna kupihwa muiOS. Zvikonzero zvinongo fungirwa. Zvichida maitiro ekufambisa zvakanyanya mapeji kudhisiki uye kumashure anonyanya kushandisa simba kune nharembozha, kana iOS inochengetedza sosi yekunyora patsva maseru paSSD madhiraivha, kana pamwe vagadziri havana kugutsikana nekuita kwese kwehurongwa, uko zvese zviri. nguva dzose kuchinjana. Ngazvive zvakadaro, chokwadi chinoramba chiri chokwadi.

Nhau dzakanaka, dzakambotaurwa, ndedzekuti LMDB nekukasira haishandise mmap mashandiro ekugadzirisa mafaera. Izvi zvinoreva kuti iyo data yakaratidzwa inorongedzerwa neIOS seyakachena ndangariro uye haibatsire mundangariro tsoka. Unogona kuona izvi uchishandisa Xcode chishandiso chinonzi VM Tracker. Iyo skrini pazasi inoratidza mamiriro eiyo iOS virtual memory ye Cloud application panguva yekushanda. Pakutanga, 2 LMDB zviitiko zvakatangwa mairi. Wekutanga akabvumidzwa kuratidza faira rake pa1GiB yevirtual memory, yechipiri - 512MiB. Kunyangwe chokwadi chekuti ese ari maviri storages anotora imwe huwandu hwekugara ndangariro, hapana kana yadzo inopa saizi yakasviba.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Uye zvino yave nguva yenhau dzakaipa. Nekuda kweiyo shanduko yekuchinjana mu64-bit desktop inoshanda masisitimu, yega yega maitiro anogona kutora yakawanda chaiyo kero nzvimbo seyemahara hard disk nzvimbo yekugona kwayo shanduko inobvumira. Kutsiva shanduko nekumanikidza muIOS zvakanyanya kudzikisa iyo theoretical maximum. Iye zvino maitiro ese ehupenyu anofanirwa kukwana mune huru (verenga RAM) ndangariro, uye ese asingakwane anofanira kumanikidzwa kugumisa. Izvi zvakataurwa sezvataurwa pamusoro apa Chirevouye mukati zvinyorwa zvepamutemo. Nekuda kweizvozvo, iOS inodzika zvakanyanya huwandu hwekuyeuka huripo hwekugoverwa kuburikidza nemmap. Here pano Iwe unogona kutarisa empirical miganhu yehuwandu hwekuyeuka hunogona kugoverwa pamidziyo yakasiyana uchishandisa iyi system call. Pamhando dzemazuva ano dze smartphone, iOS yave ine rupo ne 2 gigabytes, uye pamusoro peiyo iPad - ne 4. Mukuita, chokwadi, iwe unofanirwa kutarisa kune yakaderera yakatsigirwa michina michina, uko zvese zvinosuruvarisa. Zvakatonyanya kuipa, nekutarisa mamiriro ekurangarira kwechishandiso muVM Tracker, uchaona kuti LMDB iri kure neyo yega inodaidzira memory-mapped memory. Machunks akanaka anodyiwa neanogovera masystem, mafaira ezvekushandisa, maficha emifananidzo, uye zvimwe zvikara zvidiki.

Zvichienderana nemhedzisiro yezviyedzo muGore, takasvika kune anotevera akanganisa kukosha kweyeuko yakagoverwa neLMDB: 384 megabytes ye32-bit zvishandiso uye 768 ye64-bit zvishandiso. Mushure mekunge vhoriyamu iyi yashandiswa kumusoro, chero maitiro ekugadzirisa anotanga kupera nekodhi MDB_MAP_FULL. Isu tinocherekedza zvikanganiso zvakadaro mukutarisisa kwedu, asi idiki zvekuti panguva ino inogona kuregeredzwa.

Chikonzero chisiri pachena chekunyanya kushandiswa kwekuyeuka nekuchengetedza kunogona kuve kwekugara kwenguva refu kutengeserana. Kuti tinzwisise kuti zvinhu zviviri izvi zvakabatanidzwa sei, isu tichabatsirwa nekutarisa mbiru mbiri dzasara dzeLMDB.

3.2. Whale #2. B+-muti

Kutevedzera matafura pamusoro pekiyi-yakakosha kuchengetedza, zvinotevera mashandiro anofanira kunge aripo muAPI yayo:

  1. Kupinza chinhu chitsva.
  2. Tsvaga chinhu chine kiyi yakapihwa.
  3. Kubvisa chinhu.
  4. Dzokorora pamusoro pekufamba kwemakiyi muhurongwa hwaanorongwa.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplicationIyo yakapfava dhata dhizaini inogona kuita nyore kuita ese mana mashandiro ibhinari yekutsvaga muti. Imwe neimwe yemanode ayo inomiririra kiyi inokamura iyo yese subset yemakiyi emwana kuita maviri madiki. Reruboshwe rine zvidiki pane mubereki, uye rerudyi rine zvihombe. Kuwana seti yakarongedzerwa yemakiyi kunowanikwa kuburikidza neimwe yemhando yepamusoro miti inotenderera

Miti yemabhinari ine zvikanganiso zviviri zvakakosha zvinovadzivirira kuti vasashande sedhisiki-yakavakirwa data chimiro. Chekutanga, chiyero chechiyero chavo hachitarisike. Kune njodzi yakakura yekuwana miti umo kureba kwemapazi akasiyana-siyana kunogona kusiyana zvakanyanya, izvo zvinonyanya kuipa algorithmic kuoma kwekutsvaga kuenzaniswa nezvinotarisirwa. Chechipiri, kuwanda kwe-cross-links pakati pemanodhi kunonyima mabhinari miti yenzvimbo mundangariro.Vhara nodes (maererano nekubatana pakati pawo) inogona kuwanikwa pamapeji akasiyana zvachose mundangariro chaiyo. Nekuda kweizvozvo, kunyangwe kutenderera kuri nyore kwemanode akati wandei mumuti kungangoda kushanyira nhamba inofananidzwa yemapeji. Iri idambudziko kunyangwe isu tichitaura nezve mashandiro emiti yemabhinari senge in-memory data dhizaini, sezvo anogara achitenderera mapeji mu processor cache haisi mafaro akachipa. Kana zvasvika pakuwanzo tora mapeji ane chekuita nenode kubva kudhisiki, mamiriro acho anova zvachose zvinosiririsa.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplicationB-miti, kuve shanduko yemiti yemabhinari, kugadzirisa matambudziko akaonekwa mundima yapfuura. Chekutanga, vari kuzvienzanisa. Chechipiri, imwe neimwe yenodhi yavo inotsemura seti yemakiyi evana kwete kuita 2, asi muM akaodha maseti, uye nhamba M inogona kunge yakakura kwazvo, pahurongwa hwemazana akati wandei, kana kunyange zviuru.

Naizvozvo:

  1. Node imwe neimwe ine nhamba huru yemakiyi atove akaodha uye miti mipfupi kwazvo.
  2. Muti unowana pfuma yenzvimbo mundangariro, sezvo makiyi ari padhuze mukukosha anongogara ari padivi peumwe pane imwechete kana yakavakidzana node.
  3. Nhamba yemanodhi ekufambisa kana ichidzika mumuti panguva yekutsvaga basa inoderedzwa.
  4. Huwandu hwemanodhi anoverengwa panguva yemibvunzo yemhando inoderedzwa, sezvo imwe neimwe yadzo yatove nenhamba huru yemakiyi akaodha.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

LMDB inoshandisa mutsauko weB-muti unonzi B+ muti kuchengeta data. Dhiagiramu iri pamusoro inoratidza marudzi matatu emanodhi aripo mairi:

  1. Pamusoro pane mudzi. Haina chimwe chinhu kunze kweiyo pfungwa yedatabase mukati meimba yekuchengetera zvinhu. Mukati mechiitiko chimwe cheLMDB, unogona kugadzira akati wandei dhatabhesi anogovera mepu chaiyo kero nzvimbo. Mumwe nomumwe wavo anotanga kubva pamudzi wayo.
  2. Pamwero wakaderera pane mashizha. Ivo uye ivo chete ndivo vane kiyi-kukosha mapeya akachengetwa mudhatabhesi. Nenzira, iyi ndiyo yakasarudzika yeB + -miti. Kana zvitoro zveB-miti zvenguva dzose zvichikoshesa zvikamu mumanodhi emazinga ese, saka B + mutsauko unongori wepasi pasi. Kana tagadzirisa chokwadi ichi, tichazodaidzazve subtype yemuti unoshandiswa muLMDB kungoti B-muti.
  3. Pakati pemudzi nemashizha pane 0 kana kupfuura nhanho dzehunyanzvi dzine node dzekufamba (bazi). Basa ravo nderekuparadzanisa seti yakarongwa yemakiyi pakati pemashizha.

Panyama, nodes zvivharo zvendangariro zvehurefu hwakafanotemerwa. Saizi yavo yakawanda yehukuru hwemapeji ekurangarira muhurongwa hwekushandisa, hwatakakurukura pamusoro apa. Iyo node chimiro inoratidzwa pazasi. Musoro une meta ruzivo, iyo inonyanya kuoneka iyo semuenzaniso ndeye checksum. Tevere kunouya ruzivo nezve offset umo maseru ane data anowanikwa. Iyo data inogona kunge iri makiyi, kana isu tichitaura nezve navigation node, kana yese kiyi-value mapeya kana ari mashizha. "Kuongororwa kweKushanda Kwepamusoro-Kukosha Zvitoro".

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Mushure mekuita nezvemukati zvemukati mapeji node, isu tichaenderera mberi nekumiririra iyo LMDB B-muti nenzira yakapfava mune inotevera fomu.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Mapeji ane node anowanikwa zvakatevedzana padhisiki. Mapeji ane manhamba epamusoro anowanikwa kunoperera faira. Iyo inonzi meta peji ine ruzivo pamusoro pezvinokanganisa izvo midzi yemiti yose inogona kuwanikwa. Pakuvhura faira, LMDB inotarisisa peji refaira nepeji kubva kumagumo kusvika kumavambo mukutsvaga meta peji rinoshanda uye kuburikidza naro rinowana dhatabhesi iripo.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Ikozvino, tiine pfungwa yeiyo inonzwisisika uye yemuviri chimiro che data sangano, tinogona kuenderera mberi nekufunga mbiru yechitatu yeLMDB. Izvo nerubatsiro rwayo kuti zvese zvigadziriso zvekuchengetedza zviitike transactionally uye mukuparadzaniswa kubva kune mumwe nemumwe, zvichipa iyo dhatabhesi seyakazara pfuma yemultiversion.

3.3. Whale #3. Kopa-pa-kunyora

Mamwe mavhisi e-B-muti anosanganisira kuita shanduko yekuchinja kune node dzayo. Mumwe muenzaniso kuwedzera kiyi nyowani kune node yatosvika pakukwanisa kwayo. Muchiitiko ichi, zvakakosha, kutanga, kupatsanura node kuita maviri, uye chechipiri, kuwedzera chinongedzo kune itsva budding node yemwana mumubereki wayo. Iyi nzira ine ngozi zvikuru. Kana nokuda kwechimwe chikonzero (kuparara, kupera kwemagetsi, nezvimwewo) chikamu chimwe chete chekuchinja kubva kune zvakatevedzana chikaitika, ipapo muti ucharamba uri mumamiriro asingaenderani.

Imwe yechinyakare mhinduro yekugadzira dhatabhesi kukanganisa-inoshivirira ndeyekuwedzera imwe pa-dhisiki data chimiro padivi peB-muti - dhizaini rekutengesa, rinozivikanwawo sekunyora-mberi logi (WAL). Iyo faira pamagumo iyo iyo inotarirwa kushanda inonyorwa zvakasimba isati yagadzirisa B-muti pachayo. Saka, kana huwori hwe data hukaonekwa panguva yekuzviongorora, dhatabhesi inobvunza irogi kuti rizvigadzirire.

LMDB yakasarudza nzira yakasiyana senzira yayo yekuregerera kukanganisa, inonzi kopi-pa-kunyora. Chinhu chayo ndechekuti pachinzvimbo chekuvandudza data pane peji iripo, inotanga kuikopa zvachose uye kuita shanduko dzese mukopi.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Tevere, kuitira kuti data yakagadziridzwa ivepo, zvinodikanwa kuti uchinje chinongedzo kune node yave ikozvino mune yayo mubereki node. Sezvo inodawo kugadziridzwa nekuda kweizvi, inokopwa zvakare kare. Iyo nzira inoenderera ichidzokorodza nzira yese kusvika kumudzi. Chinhu chekupedzisira kuchinja i data iri pameta peji

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Kana kamwe-kamwe iyo nzira ikaparara panguva yekuvandudza maitiro, saka kana meta nyowani peji haizosikwe, kana kuti haizonyorwe kune disk zvachose, uye cheki yayo ichave isiriyo. Mune imwe yezviitiko zviviri izvi, mapeji matsva anenge asingasvikike, asi ekare haazokanganisike. Izvi zvinobvisa kudiwa kweLMDB kunyora kumberi logi kuchengetedza data kuenderana. De facto, chimiro chekuchengetedza data pane diski inotsanangurwa pamusoro panguva imwe chete inotora basa rayo. Kusavapo kweiyo yakajeka transaction log ndechimwe chezvinhu zveLMDB zvinopa yakakwirira data kuverenga kumhanya.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Iyo inokonzeresa dhizaini, inodaidzwa kuti append-chete B-muti, yakasikwa inopa transaction yekuzviparadzanisa uye akawanda-versioning. MuLMDB, kutengeserana kwega kwega kwakavhurika kunobatanidzwa neiyo iripo yakakodzera mudzi wemuti. Kusvikira kutengeserana kwapera, mapeji emuti ane chekuita nawo haambofa akachinjwa kana kushandiswa zvakare kushanduro itsva dze data.Saka, unogona kushanda kwenguva yakareba sezvaunoda neseti chaiyo yedata yaive yakakosha panguva iyoyo. kutengeserana kwakavhurwa, kunyangwe chengetedzo ichiramba ichivandudzwa panguva ino. Ichi ndicho musimboti we multiversion, zvichiita kuti LMDB ive yakanakira data sosi yevadikani vedu UICollectionView. Mushure mekuvhura kutengeserana, hapana chikonzero chekuwedzera ndangariro tsoka yechishandiso nekukasira kupomba data razvino mune imwe-mu-memory chimiro, nekutya kusara usina chinhu. Ichi chimiro chinosiyanisa LMDB kubva kune imwecheteyo SQLite, iyo isingagone kuzvirumbidza nekuzviparadzanisa nevamwe. Mushure mekuvhura kutengeserana kuviri mune yekupedzisira uye kudzima imwe rekodhi mukati meimwe yacho, hazvichagoneke kuwana rekodhi yakafanana mukati mechipiri yasara.

Rutivi rwepafiripi rwemari ndiyo inogona kukwira zvakanyanya kushandiswa kweyeuko chaiyo. Iyo slide inoratidza kuti iyo dhatabhesi dhizaini ichaita sei kana ikagadziridzwa panguva imwe chete ne3 yakavhurika kuverenga transaction inotarisa kune akasiyana dhatabhesi. Sezvo LMDB isingakwanise kushandisazve node dzinosvikika kubva kumidzi ine chekuita nekutengeserana kwazvino, chitoro hachina sarudzo kunze kwekugovera mumwe mudzi wechina mundangariro uye zvakare kutevedzera mapeji akagadziridzwa pasi payo.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Pano zvingave zvinobatsira kuyeuka chikamu pane ndangariro-mepu mafaera. Zvinoita sekunge iyo yekuwedzera mashandisiro eiyo chaiyo ndangariro haifanire kutinetsa zvakanyanya, nekuti haibatsire mundangariro tsoka yechishandiso. Nekudaro, panguva imwecheteyo, zvakacherechedzwa kuti iOS inonyima pakuigovera, uye isu hatigone, senge pane sevha kana desktop, kupa LMDB dunhu re1 terabyte uye tisingafungi nezve chinhu ichi zvachose. Kana zvichikwanisika, iwe unofanirwa kuedza kuita kuti hupenyu hwekutengeserana hupfupi sezvinobvira.

4. Kugadzira data schema pamusoro pekiyi-kukosha API

Ngatitangei yedu API ongororo nekutarisa iwo ekutanga abstractions akapihwa neLMDB: nharaunda uye dhatabhesi, makiyi uye kukosha, kutengeserana uye cursors.

Chiziviso pamusoro pemakodhi mazita

Masevhisi ese ari muruzhinji LMDB API anodzosera mhedzisiro yebasa ravo muchimiro chekodhi kodhi, asi mune ese anotevera rondedzero humbowo hwayo hunosiiwa nekuda kwehupfupi. fork C ++ wrappers lmdbxx, umo zvikanganiso zvinogadzirwa seC ++ kunze.

Senzira inokurumidza yekubatanidza LMDB kune purojekiti yeIOS kana macOS, ini ndinokurudzira yangu CocoaPod POSLMDB.

4.1. Basic abstractions

Environment

mamiriro MDB_env ndiyo inochengeterwa mamiriro emukati meLMDB. Prefixed basa mhuri mdb_env inokubvumira kugadzirisa zvimwe zvezvivakwa zvayo. Muchiitiko chakareruka, injini yekutanga inotaridzika seizvi.

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

MuMail.ru Cloud application, isu takachinja maitiro ekutanga emaparamita maviri chete.

Yekutanga saizi yeiyo chaiyo kero nzvimbo iyo yekuchengetedza faira yakamepurwa. Nehurombo, kunyangwe pachishandiswa chimwe chete, kukosha chaiko kunogona kusiyanisa zvakanyanya kubva pakumhanya kusvika pakumhanya. Kuti utore chikamu cheiOS ichi, iyo yakanyanya kuchengetedza vhoriyamu inosarudzwa zvine simba. Kutanga kubva kune imwe kukosha, inoteedzana nehafu kusvika basa mdb_env_open haidzosere mhedzisiro yakasiyana kubva ENOMEM. Mune dzidziso, kune zvakare nzira yakapesana - kutanga govera hushoma hwendangariro kune injini, uyezve, kana zvikanganiso zvagamuchirwa, MDB_MAP_FULL, wedzera. Zvisinei, ine minzwa yakawanda zvikuru. Chikonzero ndechekuti maitiro ekugoverazve ndangariro (remap) uchishandisa basa mdb_env_set_map_size inokonesa masangano ese (macursors, transactions, kiyi uye kukosha) zvakambogamuchirwa kubva kunjini. Kutora iyi shanduko yezviitiko munhoroondo mune kodhi kunozotungamira kune yakakosha kunetsa. Kana, zvisinei, ndangariro chaiyo yakakosha kwauri, saka ichi chingave chikonzero chekutarisa zvakanyanya forogo yaenda kure kumberi. MDBX, apo pakati pezvinhu zvakaziviswa pane "automatic on-the-fly database saizi kugadzirisa".

Yechipiri parameter, iyo yakasarudzika kukosha kwayo isina kuenderana nesu, inogadzirisa mechanics ekuona tambo kuchengetedzwa. Nehurombo, ingangoita iOS 10 ine matambudziko nerutsigiro rwetambo yekuchengetera kwenzvimbo. Nechikonzero ichi, mumuenzaniso uri pamusoro, nzvimbo yekuchengetera inovhurwa nemureza MDB_NOTLS. Pamusoro peizvi, zvakanga zvakakodzerawo fork C ++ kuputira lmdbxxkucheka zvinosiyana nehunhu uhu uye mairi.

Databases

Iyo dhatabhesi ndeye yakaparadzana B-muti muenzaniso, yatakakurukura pamusoro. Kuvhurwa kwayo kunoitika mukati mekutengeserana, izvo zvingaite sezvisinganzwisisike pakutanga.

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

Chokwadi, kutengeserana muLMDB inzvimbo yekuchengetedza, kwete chaiyo dhatabhesi entity. Iyi pfungwa inokutendera iwe kuti uite maatomu mashandiro pane masangano ari mumadhatabhesi akasiyana. Muchirevo, izvi zvinovhura mukana wekuenzanisira matafura mumhando yezvinyorwa zvakasiyana, asi pane imwe nguva ndakatora nzira yakasiyana, inotsanangurwa zvakadzama pasi apa.

Makiyi netsika

mamiriro MDB_val inoenzanisira pfungwa yezvose zvakakosha uye kukosha. Iyo repository haina ruzivo nezve semantics yavo. Kwaari, chimwe chinhu chingori nhevedzano yemabhayiti ehukuru hwakapihwa. Iyo yakakura kiyi saizi ndeye 512 bytes.

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

Uchishandisa muenzanisi, chitoro chinoronga makiyi mukukwira. Kana iwe ukasaitsiva neyako, ipapo iyo yakasarudzika ichashandiswa, iyo inovaronga byte-byte mune lexicographic order.

Transactions

Chimiro chekutengeserana chinotsanangurwa zvakadzama mu yapfuura chapter, saka pano ini ndichadzokorora muchidimbu zvinhu zvavo zvikuru:

  1. Inotsigira zvese zvakakosha zvivakwa ACID: atomicity, kuwirirana, kuzviparadzanisa uye kuvimbika. Ini handigone kubatsira asi kucherechedza kuti kune bug maererano nekusimba paMacOS uye iOS iyo yakagadziriswa muMDBX. Unogona kuverenga zvakawanda mune yavo README.
  2. Maitiro ekuverengera akawanda anotsanangurwa ne "single munyori / akawanda kuverenga" chirongwa. Vanyori vanovharana, asi musavhare vaverengi. Vaverengi havavharidzi vanyori kana mumwe nemumwe.
  3. Tsigiro yezvirongwa zvakatenderedzwa.
  4. Multiversion rutsigiro.

Multiversion muLMDB yakanaka zvekuti ndinoda kuiratidza mukuita. Kubva pane kodhi iri pasi apa unogona kuona kuti kutengeserana kwega kwega kunoshanda pamwe chete neshanduro yedhatabhesi yaive iripo panguva yakavhurwa, ichinyatsoparadzaniswa kubva kune ese anotevera shanduko. Kutanga kuchengetwa uye kuwedzera rekodhi rekodhi kwairi hakumiriri chero chinhu chinonakidza, saka tsika idzi dzakasiiwa pasi pemuparadzi.

Kuwedzera bvunzo yekupinda

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

Ini ndinokurudzira kuti iwe uedze hunyengeri hwakafanana neSQLite uye ona zvinoitika.

Multiversion inounza zvinhu zvakanaka kwazvo kuhupenyu hwemugadziri weIOS. Uchishandisa ichi chivakwa, iwe unogona nyore uye nemaitiro kugadzirisa chiyero cheiyo data sosi yemafomu ekrini, zvichibva pakufunga kweruzivo rwemushandisi. Semuenzaniso, ngatitorei chimiro cheMail.ru Cloud application senge autoloading zvirimo kubva kune system media gallery. Nekubatana kwakanaka, mutengi anokwanisa kuwedzera akati wandei mafoto pasekondi kune server. Kana iwe ukagadziridza mushure mekurodha yega yega UICollectionView ine midhiya zvirimo mugore remushandisi, unogona kukanganwa nezve 60 fps uye kupuruzira kwakatsetseka panguva iyi. Kuti udzivise kugara uchigadziridza skrini, iwe unofanirwa kudzikamisa chiyero icho data inochinja mune yepasi UICollectionViewDataSource.

Kana iyo dhatabhesi isingatsigire multiversion uye inobvumidza iwe kuti ushande chete neyazvino mamiriro, zvino kuti ugadzire nguva-yakagadzikana snapshot yedata raunoda kuikopa kune imwe-mu-memory data chimiro kana kune yechinguva tafura. Chero ipi yeiyi nzira inodhura zvakanyanya. Panyaya yekuchengetedza mu-memory, tinowana mari mundangariro, inokonzerwa nekuchengetedza zvinhu zvakavakwa, uye nekufamba kwenguva, zvine chekuita nekusarudzika kweORM. Kana iri tafura yenguva pfupi, iyi inotonyanya kudhura mafaro, kuita zvine musoro chete mune zvisiri zvidiki zviitiko.

LMDB's multiversion solution inogadzirisa dambudziko rekuchengetedza yakagadzikana data sosi nenzira yakanakisa. Zvakakwana kungovhura kutengeserana uye voila - kusvika tapedza, iyo data set inovimbiswa kugadziriswa. Iyo pfungwa yekumhanyisa kwayo yekuvandudza ikozvino yazara mumaoko eiyo mharidzo layer, isina pamusoro pezvakakosha zviwanikwa.

Vatuki

Macursors anopa nzira yekurongeka iterating pamusoro pekiyi-value peya kuburikidza neB-muti wekufamba. Pasina ivo, zvingave zvisingagoneki kunyatsotevedzera matafura ari mudhatabhesi, yatinotendeukira kwaari zvino.

4.2. Tafura Modelling

Iyo midziyo yekuodha kiyi inobvumidza iwe kuti uvake yakakwira-level abstraction senge tafura pamusoro pezvakakosha abstractions. Ngatitarisei maitiro aya tichishandisa muenzaniso wetafura huru yemutengi wegore, iyo inochengetedza ruzivo nezvese mafaera emushandisi nemaforodha.

Tafura schema

Imwe yezviitiko zvinozivikanwa zvekuti tafura ine muti wefolda inofanirwa kugadziridzwa ndeyekusarudzwa kwezvinhu zvese zviri mukati medhairekitori rakapihwa. Rutsigiro Chinyorwa. Kuti uishandise pamusoro pekiyi-kukosha kuchengetedza, zvinodikanwa kugadzirisa makiyi emafaira nemaforodha nenzira yekuti anoiswa mumapoka zvichienderana nenhengo yavo mudhairekitori revabereki. Uye zvakare, kuti uratidze zviri mukati medhairekitori muchimiro chakajairika kune mushandisi weWindows (kutanga maforodha, ipapo mafaera, ese akarongwa alfabheti), zvinodikanwa kuti ubatanidze inoenderana mimwe minda mukiyi.

Mufananidzo uri pazasi unoratidza kuti, zvichibva pane basa riripo, chinomiririra makiyi muchimiro chebyte array chingataridzika. Mabhayiti ane chiziviso chedhairekitori revabereki (tsvuku) anoiswa pekutanga, kozoita nerudzi (girinhi) uye mumuswe une zita (blue).Achirongwa neyakagadzika LMDB comparator mune lexicographical order, anoodha mu nzira inodiwa. Sequentially kuyambuka makiyi ane imwechete dzvuku prefix inotipa iwo hukama hwakabatana mukurongeka kwaanofanira kuratidzwa mune mushandisi interface (kurudyi), pasina kuda imwe yekuwedzera post-kugadzirisa.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Serializing Keys uye Values

Nzira dzakawanda dzekugadzirisa zvinhu dzakagadzirwa munyika. Sezvo takanga tisina chimwe chinodiwa kunze kwekumhanya, takasarudza iyo inokurumidza kugoneka isu pachedu - dump yendangariro inotorwa nechiitiko chechimiro chemutauro weC. Saka, kiyi yedhairekitori chinhu chinogona kuenzanisirwa nechimiro chinotevera. NodeKey.

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

Kuchengeta NodeKey mudura rinodiwa muchinhu MDB_val isa iyo data pointer kukero yekutanga kwechimiro, uye kuverenga saizi yavo nebasa sizeof.

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

Muchitsauko chekutanga chemaitiro ekusarudza dhatabhesi, ndakataura kuderedza kugoverwa kwesimba mukati meCRUD mashandiro sechinhu chakakosha chekusarudza. Basa rekodhi serialize inoratidza sei mune iyo LMDB inogona kudzivirirwa zvachose kana uchiisa zvinyorwa zvitsva mudhatabhesi. Iyo inouya byte array kubva kuserver inotanga kushandurwa kuita stack zvimiro, uye zvino inozokandwa mudura. Tichifunga kuti hapana zvakare kugoverwa kwesimba mukati meLMDB, unogona kuwana inonakidza mamiriro neIOS zviyero - shandisa chete stack memory kushanda nedata munzira yese kubva kunetiweki kuenda kudhisiki!

Kuraira makiyi ane binary comparator

Hukama hwekuraira hunokosha hunotsanangurwa nebasa rakakosha rinonzi comparator. Sezvo injini isingazive chinhu nezve semantics yemabhayiti aainawo, iyo default comparator haina sarudzo kunze kwekuronga makiyi mune lexicographic kurongeka, kutendeukira kune byte-by-byte kuenzanisa. Kuishandisa kuronga zvimiro kwakafanana nekuveura nedemo rokutema. Zvisinei, muzviitiko zviri nyore ndinoona nzira iyi inogamuchirwa. Imwe nzira inotsanangurwa pazasi, asi pano ini ndichacherechedza akati wandei akapararira munzira iyi.

Chinhu chekutanga kurangarira ndeyekurangarira kumiririrwa kwemaprimitive data types. Saka, pamidziyo yese yeApple, nhamba dzinoverengeka dzakachengetwa mufomati Mudiki Endian. Izvi zvinoreva kuti iyo isinganyanyi kukosha yebhayiti ichave kuruboshwe, uye hazvizogoneke kuronga ma integers uchishandisa byte-by-byte kuenzanisa. Semuenzaniso, kuedza kuita izvi neseti yenhamba kubva pa0 kusvika pa511 kunoburitsa zvinotevera.

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

Kugadzirisa dambudziko iri, nhamba dzinofanirwa kuchengetwa mukiyi mufomati inokodzera iyo byte-byte comparator. Mabasa kubva kumhuri achakubatsira iwe kuita shanduko inodiwa hton* (zvikuru sei htons yenhamba mbiri-byte kubva pamuenzaniso).

Iyo fomati yekumiririra tambo muchirongwa, sezvaunoziva, yakazara nhoroondo. Kana iyo semantics yetambo, pamwe neiyo encoding inoshandiswa kuvamiririra mundangariro, zvichiratidza kuti panogona kunge paine inodarika imwe byte pahunhu, saka zviri nani kubva wasiya zano rekushandisa default comparator.

Chechipiri chekuchengeta mupfungwa kurongeka kwemitemo structure field compiler. Nekuda kwavo, mabheti ane marara maitiro anogona kuumbwa mundangariro pakati peminda, iyo, hongu, inotyora byte-byte kurongedza. Kuti ubvise marara, unofanirwa kuzivisa minda nenzira yakanyatsotsanangurwa, uchichengeta mitemo yekumisikidza mupfungwa, kana kushandisa hunhu mune chiziviso chechimiro. packed.

Kuraira makiyi nemuenzanisi wekunze

Iyo yakakosha yekuenzanisa pfungwa inogona kunge yakanyanya kuomarara kune bhinari muenzanisi. Chimwe chezvikonzero zvakawanda kuvepo kwehunyanzvi minda mukati mezvimiro. Ini ndicharatidza kuitika kwavo ndichishandisa muenzaniso wekiyi yedhairekitori chinhu chatinoziva kwatiri.

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

Pasinei nekureruka kwayo, muhuwandu hwakawanda hwezviitiko zvinopedza ndangariro dzakawandisa. Iyo buffer yezita inotora 256 bytes, kunyangwe paavhareji faira nemazita emafolda haawanzo kudarika 20-30 mavara.

Imwe yemaitiro akajairwa ekugadzirisa saizi yerekodhi ndeye "kuicheka" kusvika pakukura chaiko. Chinokosha chayo ndechekuti zviri mukati mezvikamu zvese zvakasiyana-zvirefu zvakachengetwa mubhafa kumagumo echimiro, uye hurefu hwazvo hunochengetwa mumhando dzakasiyana. NodeKey inoshandurwa sezvinotevera.

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

Kupfuurirazve, kana serializing, saizi yedata haina kutaurwa sizeof chimiro chese, uye saizi yeminda yese hurefu hwakatarwa pamwe nehukuru hwechikamu chakashandiswa chaizvo chebhafa.

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

Nekuda kweiyo refactoring, takawana mari yakachengetwa munzvimbo yakagarwa nemakiyi. Nekudaro, nekuda kweiyo tekinoroji munda nameLength, the default binary comparator haichakodzeri kuenzanisa kwakakosha. Kana tikasaritsiva neredu, ipapo kureba kwezita kuchava chinhu chepamusoro-soro pakuronga kupfuura zita pacharo.

LMDB inobvumira dhatabhesi yega yega kuve neyayo yakakosha yekufananidza basa. Izvi zvinoitwa uchishandisa basa mdb_set_compare zvakasimba asati avhura. Nezvikonzero zviri pachena, haigone kuchinjwa muhupenyu hwese database. Muenzanisi anogashira makiyi maviri mubhinari fomati sekuisa, uye pazvinobuda inodzosera mhedzisiro yekuenzanisa: isingasviki (-1), yakakura kupfuura (1) kana yakaenzana ne (0). Pseudocode ye NodeKey zvinoita saizvozvo.

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

Chero bedzi makiyi ese ari mudhatabhesi ari emhando imwe chete, pasina zvisungo vachikandira yavo byte inomiririra kune rudzi rwechishandiso kiyi chimiro chiri pamutemo. Pane imwe nuance pano, asi ichakurukurwa pazasi muchikamu che "Kuverenga Records".

Seriizing Values

LMDB inoshanda zvakanyanya nemakiyi emarekodhi akachengetwa. Kuenzanisa kwavo kune mumwe nemumwe kunoitika mukati megadziriro yebasa chero ripi zvaro rinoshandiswa, uye kushanda kwemhinduro yose kunoenderana nekumhanya kwemuenzanisi. Munyika yakanaka, iyo yakasarudzika bhanari muenzanisi inofanirwa kukwana kuenzanisa makiyi, asi kana iwe waifanira kushandisa yako, saka maitiro ekubvisa makiyi mairi anofanira kunge achikurumidza sezvinobvira.

Iyo dhatabhesi haina kunyanya kufarira kukosha kwechikamu cherekodhi (kukosha). Shanduko yaro kubva pakumiririra kwebyte kuenda kuchinhu kunoitika chete kana ichinge yatodiwa nekodhi yekushandisa, semuenzaniso, kuiratidza pachiratidziri. Sezvo izvi zvisingawanzo kuitika, zvinodikanwa zvekumhanya zveiyi nzira hazvina kunyanya kunetsa, uye mukuita kwayo isu takasununguka zvakanyanya kutarisa pane zviri nyore.Semuyenzaniso, kuenzanisa metadata nezve mafaera asati atorwa, tinoshandisa. NSKeyedArchiver.

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

Nekudaro, pane dzimwe nguva apo kuita kuchiri kukosha. Semuenzaniso, kana tichichengetedza metainformation nezve faira chimiro chegore remushandisi, isu tinoshandisa imwechete ndangariro kuraswa kwezvinhu. Chinonyanya kukosha chebasa rekugadzira serialized inomiririra inyaya yekuti zvinhu zvedhairekitori zvinoteedzerwa nehukuru hwemakirasi.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Kuti uishandise mumutauro weC, minda chaiyo yevadyi venhaka inoiswa muzvimiro zvakasiyana, uye kubatana kwavo nehwaro kunotsanangurwa kuburikidza nemunda wemhando yemubatanidzwa. Izvo chaizvo zviri mukati memubatanidzwa zvinotsanangurwa kuburikidza nehunyanzvi hwemhando yemhando.

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

Kuwedzera uye kugadzirisa zvinyorwa

Iyo serialized kiyi uye kukosha kunogona kuwedzerwa kuchitoro. Kuti uite izvi, shandisa basa mdb_put.

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

Padanho rekugadzirisa, chengetedzo inogona kubvumidzwa kana kurambidzwa kuchengetedza marekodhi akawanda nekiyi imwe chete.Kana kudzokorora kwekiyi kwakarambidzwa, saka pakuisa rekodhi, unogona kuona kuti kugadzirisa rekodhi iripo kunobvumidzwa here kana kuti kwete. Kana kukanganisa kuchingoitika nekuda kwekukanganisa mukodhi, saka iwe unogona kuzvidzivirira kubva kwairi nekutsanangura mureza. NOOVERWRITE.

Kuverenga zvinyorwa

Kuti uverenge marekodhi muLMDB, shandisa basa racho mdb_get. Kana iyo kiyi-yakakosha peya inomiririrwa neyakaraswa zvimiro, saka maitiro aya anotaridzika seizvi.

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

Rondedzero yakaratidzwa inoratidza kuti serialization kuburikidza nekuraswa kwechimiro inokutendera kuti ubvise migove ine simba kwete chete kana uchinyora, asi kana uchiverenga data. Yakatorwa kubva kune basa mdb_get iyo pointer inotarisa chaizvo iyo chaiyo memory kero uko dhatabhesi inochengeta iyo byte inomiririra yechinhu. Muchokwadi, isu tinowana mhando yeORM inopa yakanyanya kukurumidza kuverenga data kunenge mahara. Pasinei nekunaka kwese kwenzira, zvinodikanwa kuyeuka akati wandei maficha ane hukama nawo.

  1. Kune yekuverenga chete transaction, chinongedzo kune kukosha kwechimiro chinovimbiswa kuramba chakasimba chete kusvikira kutengeserana kwavharwa. Sezvambotaurwa, iyo B-muti mapeji pane chinhu chiripo, nekuda kweiyo kopi-pa-kunyora musimboti, inoramba isina kuchinjika chero ichinongedzwa neinenge kutengeserana kumwe. Panguva imwecheteyo, nekukurumidza kana kutengeserana kwekupedzisira kwakabatana navo kwapera, mapeji anogona kushandiswa zvakare kune data nyowani. Kana zvichidikanwa kuti zvinhu zvirarame mukutengeserana kwakazvigadzira, saka zvinofanirwa kuteedzerwa.
  2. Kune yekuverenga yekuverenga transaction, chinongedzo kune chinokonzeresa kukosha chimiro chinozoshanda chete kusvika yekutanga kugadzirisa maitiro (kunyora kana kudzima data).
  3. Kunyangwe chimiro NodeValue kwete yakazara-yakazara, asi yakatemwa (ona chidimbu "Kuodha makiyi uchishandisa wekunze muenzanisi"), unogona kuwana zvakachengeteka minda yayo kuburikidza neinongedza. Chinhu chikuru hachisi chokuzvideredza!
  4. Pasi pemamiriro ezvinhu haafaniri kugadziriswa kuburikidza neinongedzo yakagamuchirwa. Shanduko dzese dzinofanira kuitwa chete kuburikidza nenzira mdb_put. Zvisinei, zvisinei kuti unoda kuita izvi zvakaoma sei, hazvizogoneki, sezvo nzvimbo yekuyeuka iyo nzvimbo iyi inowanikwa yakarongwa mukuverenga chete.
  5. Rema faira kune iyo process kero nzvimbo yechinangwa chekuti, semuenzaniso, kuwedzera yakakura saizi yekuchengetedza uchishandisa basa mdb_env_set_map_size inobvisa zvachose kutengeserana uye masangano ane hukama mune zvese uye anonongedzera kune zvimwe zvinhu kunyanya.

Chekupedzisira, chimwe chinhu chine hunyengeri zvekuti kuburitsa hunhu hwacho hakuenderane neimwe ndima. Muchitsauko pamusoro pemuti weB, ndakapa mufananidzo wekuti mapeji ayo akarongwa sei mundangariro. Izvi zvinotevera kubva pane izvi kuti kero yekutanga kwebhafa ine serialized data inogona kuve yakapokana. Nekuda kweizvi, chinongedzo kwavari chakagamuchirwa muchimiro MDB_val uye yakaderedzwa kuva pointer kune chimiro, inoshanduka kuve isina kurongeka mune yakajairika kesi. Panguva imwecheteyo, magadzirirwo emamwe machipisi (munyaya yeIOS iyi armv7) inoda kuti kero yechero data ive yakawanda yesaizi yezwi remuchina kana, nemamwe mazwi, saizi diki yehurongwa ( yeArmv7 i32 bits). Nemamwe mashoko, oparesheni yakaita *(int *foo)0x800002 pavari kwakafanana nokupukunyuka uye kunotungamirira kurufu nomutongo EXC_ARM_DA_ALIGN. Pane nzira mbiri dzekunzvenga nhamo yakadaro.

Yekutanga inowira pasi pekutanga kukopa data muchimiro chakarongeka. Semuenzaniso, pamuenzanisi wetsika izvi zvicharatidzwa sezvizvi.

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

Imwe nzira ndeyekuzivisa mugadziri pachine nguva kuti makiyi-value zvimiro anogona kunge asina hunhu-akaenderana. aligned(1). PaARM unogona kuita zvakafanana achieve uye kushandisa iyo yakazara hunhu. Tichifunga kuti zvinobatsirawo kukwirisa nzvimbo inogarwa nechimiro, iyi nzira inoita seyandinofarira, kunyangwe приводит kune kuwedzera kwemutengo wemabasa ekuwana data.

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

Range queries

Kuti udzokorore pamusoro peboka remarekodhi, LMDB inopa chirevo chekubvisa. Ngatitarisei maitiro ekushanda nayo tichishandisa muenzaniso wetafura ine mushandisi wegore metadata yatatojaira kwatiri.

Sechikamu chekuratidza runyoro rwemafaira mune dhairekitori, zvinodikanwa kuti uwane makiyi ese ayo mwana wayo mafaera uye maforodha anobatanidzwa. Muzvikamu zvakapfuura takaronga makiyi NodeKey zvekuti ivo vanonyanya kurairwa neID yedhairekitori revabereki. Saka, nehunyanzvi, basa rekudzoreredza zviri mukati mefolda rinodzika pakuisa cursor pamuganhu wepamusoro weboka remakiyi ane prefix yakapihwa uyezve ichidzokorodza kumuganhu wezasi.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Iyo yekumusoro yakasungirirwa inogona kuwanikwa zvakananga nekutevera kutsvaga. Kuti uite izvi, iyo cursor inoiswa pakutanga kwese rondedzero yekiyi mudhatabhesi uye inowedzera kuwedzera kusvika kiyi ine identifier yevabereki dhairekitori inoonekwa pazasi payo. Iyi nzira ine 2 zviri pachena kuipa:

  1. Linear kutsvaga kuomarara, kunyangwe, sekuzivikanwa, mumiti zvakazara uye muB-muti kunyanya inogona kuitwa munguva yelogarithmic.
  2. Pasina maturo, mapeji ose anotangira ari kutsvakwa anosimudzwa kubva mufaira kuenda kundangariro huru, iyo inodhura zvikuru.

Sezvineiwo, iyo LMDB API inopa nzira inoshanda yekutanga kuisa cursor.Kuita izvi, iwe unofanirwa kugadzira kiyi ine kukosha kwayo kuri pachena kushoma kana kuenzana nekiyi iri kumuganhu wepamusoro wenguva. Semuenzaniso, maererano nerondedzero mumufananidzo uri pamusoro, tinogona kuita kiyi iyo munda parentId ichaenzana ne2, uye mamwe ese akazadzwa nemaziro. Kiyi yakadaro yakazadzwa zvishoma inopihwa kune yekuisa basa mdb_cursor_get zvichiratidza kuvhiyiwa 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);

Kana muganho wepamusoro weboka rekiyi wawanikwa, tobva tadzokorora pamusoro pawo kusvika tasangana kana kiyi yasangana neimwe. parentId, kana kuti makiyi haachapera zvachose.

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

Chii chakanaka ndechekuti sechikamu cheiyo iteration uchishandisa mdb_cursor_get, isu tinowana kwete chete kiyi, asiwo kukosha. Kana, kuitira kuti uzadzise mamiriro ekuenzanisa, iwe unofanirwa kutarisa, pakati pezvimwe zvinhu, minda kubva kune yakakosha chikamu cherekodhi, saka ivo vanosvikika pasina mamwe majeti.

4.3. Kuenzanisira hukama pakati pematafura

Parizvino, takakwanisa kufunga nezvese maficha ekugadzira uye kushanda neiyo imwe-tafura dhatabhesi. Tinogona kutaura kuti tafura seti yemarekodhi akarongwa anoumbwa nemhando imwechete yekiyi-kukosha pairi. Kana iwe ukaratidza kiyi serectangle uye kukosha kwakabatana separallelepiped, unowana mufananidzo wekuona we database.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Zvisinei, muupenyu hazvibviri kurarama nokudeurwa kweropa kushoma. Kazhinji mune dhatabhesi inodiwa, kutanga, kuve nematafura akati wandei, uye chechipiri, kuita sarudzo mukati mawo muhurongwa hwakasiyana nekiyi yekutanga. Ichi chikamu chekupedzisira chakatsaurirwa kune nyaya dzekusika kwavo uye kubatana.

Index tables

Iyo cloud application ine "Gallery" chikamu. Iyo inoratidza midhiya zvemukati kubva mugore rose, rakarongwa nemazuva. Kuti unyatsoita sarudzo yakadaro, padivi petafura huru iwe unofanirwa kugadzira imwe ine mhando nyowani yemakiyi. Iwo achange aine ndima ine zuva rakagadzirwa faira, iyo ichaita seyekutanga kurongedza. Nekuti makiyi matsva anoreva data rakafanana nemakiyi ari mutafura huru, anonzi makiyi eindex. Mumufananidzo uri pazasi ivo vakajekeswa mune orenji.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Kuti uparadzanise makiyi ematafura akasiyana kubva kune mumwe nemumwe mukati meiyo dhatabhesi imwe, imwe tekinoroji yemunda tableId yakawedzerwa kune ese. Nekuita kuti ive iyo inonyanya kukosha pakuronga, tichawana kuunganidzwa kwemakiyi kutanga nematafura, uye mukati mematafura - zvinoenderana nemitemo yedu.

Indekisi kiyi inonongedza data imwechete sekiyi yekutanga. Kuitwa kwakatwasuka kweichi chivakwa kuburikidza nekubatana nacho kopi yekukosha chikamu chekiyi yekutanga haina kukwana kubva kune akati wandei maonero:

  1. Panyaya yenzvimbo yakatorwa kumusoro, iyo metadata inogona kupfuma.
  2. Kubva pakuona kwekuita, sezvo kana uchigadziridza metadata yenode, uchafanirwa kuinyora zvakare uchishandisa makiyi maviri.
  3. Kubva pakuona kwekutsigirwa kwekodhi, kana tikakanganwa kugadzirisa iyo data kune imwe yekiyi, isu tinowana isinganzwisisike bug yekusawirirana kwedata mukuchengetedza.

Zvadaro, tichaona kuti tingabvisa sei zvikanganiso izvi.

Kuronga hukama pakati pematafura

Chimiro chakanyatsokodzera kubatanidza tafura ye index netafura huru "kiyi sekukosha". Sezvinoratidzwa nezita rayo, kukosha kwechikamu cheiyo index rekodhi ikopi yekutanga yakakosha kukosha. Iyi nzira inobvisa zvipingamupinyi zvose zvataurwa pamusoro apa zvakabatana nekuchengetedza kopi yechikamu chekukosha kwezvinyorwa zvekutanga. Mutengo chete ndewekuti kuti uwane kukosha nekiyi index, unofanirwa kuita 2 mibvunzo kune dhatabhesi pane imwe. Schematically, iyo inoguma database schema inotaridzika seizvi.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Imwe nzira yekuronga hukama pakati pematafura ndeye "dundant key". Chinokosha chayo ndechekuwedzera humwe hunhu kukiyi, izvo zvinodiwa kwete zvekugadzirisa, asi zvekugadzirisa zvakare kiyi yakabatana.MuMail.ru Cloud application pane mienzaniso chaiyo yekushandiswa kwayo, zvisinei, kuitira kudzivirira kunyura kwakadzika mukati. mamiriro eiyo iOS masisitimu, ini ndichapa manyepo, asi muenzaniso wakajeka

Cloud mobile clients vane peji rinoratidza mafaera ese nemaforodha ayo mushandisi akagovana nevamwe vanhu. Sezvo paine mashoma mafaera akadaro, uye kune akawanda emhando dzakasiyana dzeruzivo rwekushambadza kwakabatana navo (ndiani anopihwa mukana, nekodzero dzipi, nezvimwewo), hazvizove zvine musoro kuremedza kukosha kwechikamu cheiyo rekodhi mutafura huru nayo. Nekudaro, kana iwe uchida kuratidza mafaera akadaro kunze kwenyika, iwe uchiri kuda kuichengeta kumwe. Mhinduro yakasikwa ndeyekugadzira tafura yakasiyana nayo. Mudhayagiramu iri pazasi, kiyi yaro yakamisikidzwa ne “P”, uye “propname” inobatirira nzvimbo inogona kutsiviwa neinonyanya kukosha “ruzivo rweruzhinji”.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Yese yakasarudzika metadata, nekuda kwekuchengetedza iyo tafura nyowani yakagadzirwa, inoiswa muchikamu chakakosha cherekodhi. Panguva imwecheteyo, haudi kudzokorora iyo data nezve mafaera uye maforodha akatochengetwa mutafura huru. Pane kudaro, data rakawandisa rinowedzerwa kune "P" kiyi muchimiro che "node ID" uye "timestamp" minda. Kutenda kwavari, iwe unogona kugadzira kiyi ye index, kubva kwaunogona kuwana kiyi yekutanga, kubva iyo, pakupedzisira, iwe unogona kuwana node metadata.

Mhedziso

Isu tinoongorora mhedzisiro yekuitwa kweLMDB zvakanaka. Mushure mazvo, huwandu hwemashandisirwo echando hwakadzikira ne30%.

Kupenya uye hurombo hweiyo kiyi-kukosha dhatabhesi LMDB mune iOS maapplication

Mhedzisiro yebasa rakaitwa yakanzwika kupfuura timu yeIOS. Parizvino, chimwe chezvikamu zvikuru zve "Mafaira" muAroid application yachinjawo kushandisa LMDB, uye zvimwe zvikamu zviri munzira. Mutauro weC, umo kiyi-yakakosha chitoro inoshandiswa, yaive rubatsiro rwakanaka rwekutanga kugadzira dhizaini rekushandisa rakaitenderedza muchinjika-chikuva muC ++. Iyo kodhi jenareta yakashandiswa kubatanidza isina musono raibhurari yeC ++ ine kodhi yepuratifomu muObjective-C uye Kotlin. Djinni kubva kuDropbox, asi iyo inyaya yakasiyana zvachose.

Source: www.habr.com

Voeg