Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

N'oge ọdịda nke 2019, ihe omume a na-echere ogologo oge mere na otu Mail.ru Cloud iOS. Isi nchekwa data maka nchekwa na-adịgide adịgide nke steeti ngwa abụrụla nke ukwuu maka ụwa mkpanaka Ebe nchekwa data emere Ebe nchekwa ọkụ (LMDB). N'okpuru ịkpụ ahụ anyị na-enye gị nkọwa zuru ezu banyere ya na akụkụ anọ. Nke mbụ, ka anyị kwuo banyere ihe kpatara nhọrọ dị otú ahụ na-adịghị mkpa na nke siri ike. Mgbe ahụ, anyị ga-aga n'ihu na-atụle ogidi atọ dị n'ime obi nke LMDB architecture: faịlụ ebe nchekwa, B + - osisi, idetuo-na-dere ụzọ maka mmejuputa azụmahịa na multiversion. N'ikpeazụ, maka eji megharịa ọnụ - akụkụ bara uru. N'ime ya, anyị ga-eleba anya ka esi emepụta ma mejuputa atụmatụ nchekwa data nwere ọtụtụ tebụl, gụnyere otu ndeksi, n'elu API igodo-uru dị ala.

Ihe

  1. Mkpali maka mmejuputa iwu
  2. Ọnọdụ LMDB
  3. Ogidi atọ nke LMDB
    3.1. Whale #1. Faịlụ nwere mapụtara ebe nchekwa
    3.2. Whale #2. B+ osisi
    3.3. Whale #3. Detuo-na-dere
  4. Ịmepụta atụmatụ data n'elu API igodo-uru
    4.1. Nkọwapụta ndị bụ isi
    4.2. Nlereanya tebụl
    4.3. Mmekọrịta dị n'etiti tebụl

1. Mkpali maka mmejuputa iwu

Otu afọ na 2015, anyị weere nsogbu iji tụọ ugboro ole interface nke ngwa anyị dị. Anyị mere nke a n'ihi ihe kpatara ya. Anyị anatala mkpesa ugboro ugboro na mgbe ụfọdụ ngwa na-akwụsị ịzaghachi omume onye ọrụ: enweghị ike ịpị bọtịnụ, ndepụta anaghị pịgharịa, wdg. Banyere makanika nke nha gwara na AvitoTech, yabụ ebe a ka m na-enye naanị usoro ọnụọgụ.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Nsonaazụ nha ghọrọ mmiri ịsa ahụ oyi nye anyị. Ọ tụgharịrị na e nwere ọtụtụ nsogbu ndị oyiri na-akpata karịa ihe ọ bụla ọzọ. Ọ bụrụ na tupu ịghọta eziokwu a isi oru egosi àgwà bụ okuku free, mgbe ahụ mgbe na-elekwasị anya gbanwere na ifriizi free.

N'ịbụ onye wuru dashboard nwere freezes na mgbe emefuchara ọnụọgụgụ и qualitative nyocha nke ihe kpatara ha, onye iro bụ isi bịara doo anya - mgbagwoju anya azụmahịa dị arọ gburu na isi eri nke ngwa ahụ. Mmeghachi omume ebumpụta ụwa maka ihere a bụ ọchịchọ na-ekpo ọkụ nke ịkwanye ya n'ime iyi ọrụ. Iji dozie nsogbu a n'usoro, anyị malitere ịrụ ụlọ nwere ọtụtụ eriri dabere na ndị na-eme ihe nkiri dị arọ. M raara nye ya na mmegharị ya maka ụwa iOS eri abụọ na mkpokọta Twitter na akụkọ na Habré. Dịka akụkụ nke akụkọ dị ugbu a, achọrọ m imesi akụkụ ndị ahụ nke mkpebi ahụ metụtara nhọrọ nchekwa data.

Onye na-eme ihe nkiri nke usoro nhazi usoro na-eche na multithreading na-aghọ ihe dị mkpa ya nke abụọ. Ihe nlereanya dị na ya na-amasị ịgafe oke iyi. Ma ha na-eme nke a ọ bụghị mgbe ụfọdụ na ebe a na ebe ahụ, kama ọ fọrọ nke nta ka ọ bụrụ mgbe niile na ebe niile

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ebe nchekwa data bụ otu n'ime isi ihe dị na eserese a gosipụtara. Isi ọrụ ya bụ imejuputa macropattern Ebe nchekwa data ekekọrịtara. Ọ bụrụ na n'ime ụwa ụlọ ọrụ, a na-eji ya ahazi mmekọrịta data n'etiti ọrụ, mgbe ahụ n'ihe banyere ụlọ ọrụ ihe nkiri - data n'etiti eri. Ya mere, anyị chọrọ nchekwa data nke na-agaghị akpata ọbụna obere ihe isi ike mgbe anyị na ya na-arụ ọrụ na gburugburu multi-threaded. Karịsịa, nke a pụtara na ihe ndị e nwetara site na ya ga-abụrịrị opekata mpe eri na-echekwa, na n'ụzọ zuru oke na-agaghị agbanwe agbanwe. Dị ka ị maara, enwere ike iji nke ikpeazụ mee ihe n'otu oge site na ọtụtụ eri na-enweghị iji mkpọchi ọ bụla, nke nwere mmetụta bara uru na arụmọrụ.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOSIhe nke abụọ dị mkpa metụtara nhọrọ nchekwa data bụ API ígwé ojii anyị. Ọ sitere na usoro mmekọrịta nke git nakweere. Dị ka ya, anyị iji API mbụ na-anọghị n'ịntanetị, nke na-ele anya karịa ndị ahịa igwe ojii. A na-eche na ha ga-ewepụ ọnọdụ igwe ojii naanị otu ugboro, wee mekọrịta ihe n'ọtụtụ ikpe ga-eme site n'iwepụ mgbanwe. Ewoo, ohere a ka bụ naanị na usoro iwu mpaghara, na ndị ahịa na-amụtabeghị otú e si arụ ọrụ na patches na omume. Enwere ọtụtụ ebumnuche ebumnuche maka nke a, nke, ka ọ ghara igbu oge mmeghe, anyị ga-ahapụ n'azụ brackets. Ugbu a, ihe kacha amasị bụ nkwubi okwu nkuzi banyere ihe na-eme mgbe API na-ekwu "A" na onye na-azụ ya anaghị asị "B".

Yabụ, ọ bụrụ na ị were git, nke, mgbe ị na-eme iwu ịdọrọ, kama itinye patches na foto mpaghara, jiri ọnọdụ ya tụnyere steeti sava zuru oke, mgbe ahụ ị ga-enwe echiche ziri ezi banyere otu mmekọrịta si eme na igwe ojii. ndị ahịa. Ọ dị mfe ịkọ na iji mejuputa ya, ịkwesịrị ịnye osisi DOM abụọ na ebe nchekwa yana ozi meta gbasara ihe nkesa na faịlụ mpaghara niile. Ọ na-apụta na ọ bụrụ na onye ọrụ na-echekwa 500 puku faịlụ na ígwé ojii, mgbe ahụ, iji mekọrịta ya ọ dị mkpa ịmegharị ma bibie osisi abụọ nwere 1 nde ọnụ. Mana ọnụ nke ọ bụla bụ mkpokọta nwere eserese nke isiokwu. N'okwu a, a na-atụ anya nsonaazụ profaịlụ. Ọ tụgharịrị na ọbụlagodi na-enweghị n'ime akaụntụ merging algọridim, usoro nke imepụta na mechaa mebie ọnụ ọgụgụ dị ukwuu nke obere ihe na-efu otu penny mara mma. nke njirimara scripts. N'ihi ya, anyị na-edozi akara nke abụọ dị mkpa na ịhọrọ nchekwa data - ikike iji mejuputa ọrụ CRUD na-enweghị oke nke ihe.

Ihe ndị ọzọ a chọrọ bụ omenala na ndepụta ha niile dị ka ndị a.

  1. Nchekwa eriri.
  2. Multiprocessing. Emepụtara site n'ọchịchọ iji otu ihe atụ nchekwa data iji mekọrịta steeti ọ bụghị naanị n'etiti eriri, kamakwa n'etiti ngwa ngwa na mgbakwunye iOS.
  3. Ikike ịnọchite anya ihe echekwara dị ka ihe anaghị agbanwe agbanwe.
  4. Enweghị oke ike n'ime ọrụ CRUD.
  5. Nkwado azụmahịa maka ihe ndị bụ isi Acid: atomity, agbanwe agbanwe, iche na ntụkwasị obi.
  6. Ọsọ na ikpe kachasị ewu ewu.

Site na usoro ihe achọrọ, SQLite bụ ma ka bụrụ ezigbo nhọrọ. Agbanyeghị, dịka akụkụ nke ọmụmụ ihe ndị ọzọ, ahụrụ m akwụkwọ "Ịmalite na LevelDB". N'okpuru nduzi ya, e dere akara nrịbama na-atụnyere ọsọ ọrụ na ọdụ data dị iche iche n'ezie igwe ojii. Nsonaazụ ahụ karịrị ihe anyị tụrụ anya ya. N'okwu ndị kachasị ewu ewu - ịnweta cursor na ndepụta ahaziri nke faịlụ niile yana ndepụta faịlụ niile maka akwụkwọ ndekọ aha enyere - LMDB tụgharịrị bụrụ ugboro iri ngwa ngwa karịa SQLite. Nhọrọ ahụ bịara doo anya.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

2. Ọnọdụ LMDB

LMDB bụ ọbá akwụkwọ dị obere (naanị ahịrị 10K) na-arụ ọrụ nchekwa data kacha ala - nchekwa.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Eserese dị n'elu na-egosi na iji LMDB na SQLite, nke na-emejuputa ọkwa dị elu, adịghịkwa mma karịa SQLite na Core Data. Ọ ga-abụ ihe ziri ezi na-ehota otu nchekwa engines dị ka hà asọmpi - BerkeleyDB, LevelDB, Sophia, RocksDB, wdg E nwere ọbụna mmepe ebe LMDB eme dị ka a nchekwa engine akụrụngwa maka SQLite. Nnwale mbụ dị otú ahụ bụ na 2012 nọrọ site na LMDB Howard Chu. Результаты tụgharịrị bụrụ ihe na-adọrọ adọrọ nke na ndị na-anụ ọkụ n'obi OSS welitere atụmatụ ya, wee hụ na ọ na-aga n'ihu n'ime onye ahụ. LumoSQL. Na Jenụwarị 2020, onye dere ọrụ a bụ Den Shearer ewepụtara ya na LinuxConfAu.

A na-ejikarị LMDB dị ka injin maka ọdụ data ngwa. Ọbá akwụkwọ ahụ ji ọdịdị ya n'aka ndị mmepe OpenLDAP, bụ ndị enweghị afọ ojuju na BerkeleyDB dị ka ihe ndabere maka ọrụ ha. Malite na ọbá akwụkwọ dị obere btree, Howard Chu nwere ike ịmepụta otu n'ime ụzọ ndị kachasị ewu ewu n'oge anyị. Ọ raara akụkọ ya mara mma nye akụkọ a, yana maka nhazi nke ime LMDB. "Ebe nchekwa data-mapped ebe nchekwa ọkụ". Ezigbo ihe atụ nke imeri ebe nchekwa bụ Leonid Yuryev (aka yleo) sitere na Teknụzụ Dị Mma na akụkọ ya na Highload 2015 "Injin LMDB bụ onye mmeri pụrụ iche". N'ime ya, ọ na-ekwu maka LMDB n'ọnọdụ nke ọrụ yiri ya nke mmejuputa ReOpenLDAP, na LevelDB enweelarị nkatọ atụnyere. N'ihi nke mmejuputa atumatu, Positive Teknụzụ ọbụna nwere ike na-emepe emepe ndụdụ MDBX na nnọọ tọrọ ụtọ atụmatụ, optimizations na ihe ndozi.

A na-ejikarị LMDB eme ihe dị ka ebe nchekwa. Dịka ọmụmaatụ, ihe nchọgharị Mozilla Firefox họọrọ ya maka ọtụtụ mkpa, yana, malite na ụdị 9, Xcode họọrọ ya SQLite maka ịchekwa index.

Igwe ahụ emewokwa akara ya n'ụwa mmepe mkpanaka. Mmetụta ojiji ya nwere ike ịbụ ịchọta na iOS ahịa maka Telegram. LinkedIn gara n'ihu wee họrọ LMDB ka ọ bụrụ ebe nchekwa ndabere maka nchekwa nchekwa data nke ụlọ ya na Rocket Data, nke gbasara ya. gwara na edemede ya na 2016.

LMDB na-alụ ọgụ nke ọma maka ebe dị na anyanwụ na niche BerkeleyDB hapụrụ ka ọ batachara n'okpuru njikwa Oracle. A hụrụ ọbá akwụkwọ ahụ n'anya maka ọsọ na ntụkwasị obi ya, ọbụlagodi ma e jiri ya tụnyere ndị ọgbọ ya. Dị ka ị maara, enweghị nri ehihie efu, ọ ga-amasị m imesi ike azụmaahịa nke ị ga-eche ihu mgbe ị na-ahọrọ n'etiti LMDB na SQLite. Eserese dị n'elu na-egosi nke ọma ka esi enweta ọsọ ọsọ. Nke mbụ, anyị anaghị akwụ ụgwọ maka ntinye nke abstraction ọzọ n'elu nchekwa diski. O doro anya na ezigbo ụkpụrụ ụlọ enweghị ike ime na-enweghị ha, na ha ga-apụta na koodu ngwa, mana ha ga-adị aghụghọ karị. Ha agaghị enwe njiri mara nke otu ngwa chọrọ, dịka ọmụmaatụ, nkwado maka ajụjụ n'asụsụ SQL. Nke abuo, ọ ga-ekwe omume iji rụọ ọrụ nke ọma maapụ nke ọrụ ngwa na arịrịọ maka nchekwa diski. Ọ bụrụ na SQLite n'ọrụ m dabere na nkezi mkpa ndekọ ọnụ ọgụgụ nke ngwa ngwa, mgbe ahụ, gị, dị ka onye nrụpụta ngwa, maara nke ọma ọnọdụ ọnọdụ ibu ọrụ. Maka ngwọta na-arụpụta ihe karị, ị ga-akwụ ụgwọ mkpado ọnụ ahịa ma maka mmepe nke ngwọta mbụ na maka nkwado ya na-esote.

3. Ogidi atọ nke LMDB

N'ịbụ onye lere LMDB anya site n'anya nnụnụ, ọ bụ oge ịbanye n'ime omimi. A ga-etinye akụkụ atọ ndị na-esote na nyocha nke isi ogidi ndị ụlọ nchekwa ahụ dabere na ya:

  1. Faịlụ mapụtara ebe nchekwa dị ka usoro maka iji diski arụ ọrụ yana imekọrịta ihe owuwu data dị n'ime.
  2. B + - osisi dị ka nzukọ nke Ọdịdị nke echekwara data.
  3. Detuo-na-dere dị ka ụzọ iji nye ihe onwunwe azụmahịa ACID na multiversion.

3.1. Whale #1. Faịlụ nwere mapụtara ebe nchekwa

Faịlụ nwere maapụ ebe nchekwa bụ ihe dị mkpa na-arụ ụlọ nke na ha pụtara n'aha ebe nchekwa. Okwu nke caching na mmekọrịta nke ịnweta ozi echekwara na-ahapụ kpamkpam na sistemụ arụmọrụ. LMDB enweghị oghere ọ bụla n'ime onwe ya. Nke a bụ mkpebi siri ike site n'aka onye edemede, ebe ọ bụ na ịgụ data ozugbo site na faịlụ ndị a na-esepụta na-enye gị ohere igbutu ọtụtụ akụkụ na mmejuputa engine. N'okpuru bụ ndepụta zuru oke nke ụfọdụ n'ime ha.

  1. Idebe data na-agbanwe agbanwe na nchekwa mgbe ị na-arụ ọrụ na ya site na ọtụtụ usoro na-aghọ ọrụ nke sistemụ arụmọrụ. Na ngalaba na-esote, a na-atụle ọrụ a n'ụzọ zuru ezu na foto.
  2. Enweghị ebe nchekwa na-ewepụ LMDB kpam kpam n'elu elu jikọtara ya na oke ike. Ịgụ data na omume pụtara ịtọ pointer na adreesị ziri ezi na ebe nchekwa mebere na ọ nweghị ihe ọzọ. Ọ dị ka akụkọ sayensị sayensị, mana na koodu isi iyi nchekwa oku niile na calloc na-etinye uche na ọrụ nhazi nchekwa.
  3. Enweghị cache pụtakwara enweghị mkpọchi jikọtara ya na mmekọrịta nke ohere ha. Ndị na-agụ akwụkwọ, nke enwere ike ịnwe ọnụ ọgụgụ ndị na-agụ akwụkwọ n'otu oge ahụ, anaghị ezute otu mutex n'ụzọ ha na data. N'ihi nke a, ọsọ ọgụgụ nwere ezigbo scalability linear dabere na ọnụọgụ CPU. Na LMDB, naanị ọrụ ndị na-agbanwe agbanwe na-emekọrịta. Enwere ike inwe naanị otu onye edemede n'otu oge.
  4. Opekempe nke nchekwa nchekwa na mmekọrịta mmekọrịta na-ewepụ ụdị mperi dị mgbagwoju anya jikọtara ya na ịrụ ọrụ na gburugburu ọtụtụ eriri. Enwere ihe ọmụmụ nchekwa data abụọ na-atọ ụtọ na ogbako Usenix OSDI 2014: "Ekepụtaghị sistemu faịlụ niile nhata: Na mgbagwoju anya nke ngwa mkpọka na-agbanwe agbanwe" и "Ebe nchekwa data na-ata ahụhụ maka ntụrụndụ na uru". Site na ha ị nwere ike nweta ozi gbasara ntụkwasị obi nke LMDB a na-enwetụbeghị ụdị ya yana mmejuputa ihe na-enweghị ntụpọ nke akụrụngwa azụmahịa ACID, nke dị elu karịa nke SQLite.
  5. Minimalism nke LMDB na-enye ohere maka igwe onyonyo koodu ya ka ọ dịrị kpamkpam na oghere L1 nke processor nwere njirimara ọsọ na-esote.

N'ụzọ dị mwute, na iOS, na faịlụ ndị nwere mapped ebe nchekwa, ihe niile adịghị ka ígwé ojii dị ka anyị ga-achọ. Iji kwuo banyere adịghị ike ndị metụtara ha nke ọma, ọ dị mkpa icheta ụkpụrụ izugbe nke imejuputa usoro a na sistemụ arụmọrụ.

Ozi izugbe gbasara faịlụ ndị emebere ebe nchekwa

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOSNa ngwa ọ bụla na-agba ọsọ, sistemụ arụmọrụ na-ejikọta ihe a na-akpọ usoro. A na-ekenye usoro nke ọ bụla adrees contiguous nke ọ na-etinye ihe niile ọ chọrọ iji rụọ ọrụ. Na adreesị kacha ala enwere ngalaba nwere koodu yana data siri ike na akụrụngwa. Na-esote ngọngọ na-eto eto nke oghere adreesị dị ike, nke anyị maara nke ọma n'okpuru ikpo aha. O nwere adreesị nke ụlọ ọrụ ndị na-apụta n'oge a na-arụ ọrụ mmemme. N'elu bụ ebe nchekwa nke nchịkọta ngwa na-eji. Ọ na-eto ma ọ bụ na-eme nkwekọrịta; na okwu ọzọ, nha ya nwekwara ọdịdị dị ike. Iji gbochie nchịkọta na ikpo okwu site na ịkwanye na itinye aka na ibe ha, ha dị na nsọtụ dị iche iche nke oghere adreesị Sistemu arụ ọrụ na-eji adrees dị na mpaghara etiti a ijikọ ụlọ ọrụ dị iche iche na usoro a. Karịsịa, ọ nwere ike ijikọ ụfọdụ adreesị na-aga n'ihu na faịlụ dị na diski ahụ. A na-akpọ faịlụ dị otú ahụ ebe nchekwa-mapped

Oghere adreesị ekenyela na usoro a buru ibu. N'ụzọ doro anya, ọnụ ọgụgụ nke adreesị na-ejedebe naanị site na nha nke pointer, nke a na-ekpebi site na ntakịrị ikike nke usoro. Ọ bụrụ na e debere ebe nchekwa anụ ahụ na ya 1-to-1, mgbe ahụ usoro mbụ ga-ebuli RAM dum, ọ nweghịkwa okwu gbasara ọtụtụ ọrụ.

Agbanyeghị, site n'ahụmahụ anyị, anyị maara na sistemụ arụmọrụ ọgbara ọhụrụ nwere ike ịme ọtụtụ usoro n'otu oge dịka achọrọ. Nke a ga-ekwe omume n'ihi n'eziokwu na ha na-ekenye ọtụtụ ebe nchekwa na usoro na akwụkwọ, ma n'eziokwu, ha na-ebuba n'ime ebe nchekwa anụ ahụ bụ isi naanị akụkụ ahụ na-achọ ebe a na ugbu a. Ya mere, ebe nchekwa metụtara usoro a na-akpọ mebere.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Sistemu eji arụ ọrụ na-ahazi mebere na ebe nchekwa anụ ahụ n'ime ibe nke otu nha. Ozugbo achọrọ ụfọdụ ibe nke ebe nchekwa mebere, sistemụ arụmọrụ na-ebunye ya na ebe nchekwa anụ ahụ ma dakọtara na tebụl pụrụ iche. Ọ bụrụ na enweghị oghere efu, mgbe ahụ, otu n'ime ibe ndị a na-ebugo n'oge gara aga na-e depụtaghachi ya na diski, onye a na-achọkwa na-ewere ọnọdụ ya. Usoro a, nke anyị ga-alaghachi n'oge na-adịghị anya, a na-akpọ swapping. Ọnụ ọgụgụ dị n'okpuru na-egosi usoro a kọwara. Na ya, e debere ibe A nke nwere adreesị 0 ma dọba ya na ibe ebe nchekwa nwere adreesị 4. Eziokwu a pụtara na tebụl ozi dị na nọmba cell 0.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Akụkọ ahụ bụ otu ihe ahụ na faịlụ ndị etinyere na ebe nchekwa. N'ụzọ ezi uche dị na ya, a na-eche na ha na-aga n'ihu ma nọrọ kpamkpam na oghere adreesị mebere. Agbanyeghị, ha na-abanye ibe ebe nchekwa anụ ahụ site na ibe yana naanị mgbe achọrọ ya. A na-emekọrịta ngbanwe nke ibe ndị a na faịlụ dị na diski. N'ụzọ dị otú a, ị nwere ike ịrụ faịlụ I/O site na iji bytes rụọ ọrụ na ebe nchekwa - kernel sistemụ ga-ebufe mgbanwe niile na-akpaghị aka na faịlụ isi mmalite.
Na
Foto dị n'okpuru na-egosi ka LMDB si emekọrịta steeti ya mgbe ọ na-arụ ọrụ na nchekwa data sitere na usoro dị iche iche. Site na ịdepụta ebe nchekwa dị iche iche nke usoro dị iche iche n'otu faịlụ ahụ, anyị na-amanye sistemụ arụmọrụ ka ha mekọrịta ụfọdụ ngọngọ nke oghere adreesị ha na ibe ha, ebe LMDB dị.
Na

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Otu ihe dị mkpa bụ na LMDB, na ndabara, na-agbanwe faịlụ data site na usoro ịkpọ oku, wee gosipụta faịlụ ahụ n'onwe ya na ọnọdụ ọgụgụ naanị. Ụzọ a nwere nsonaazụ abụọ dị mkpa.

Nsonaazụ mbụ bụ ihe na-emekarị maka sistemụ arụmọrụ niile. Ihe kacha mkpa bụ ịgbakwunye nchebe pụọ na mmebi nchekwa data na-amaghị ama site na koodu na-ezighi ezi. Dị ka ị maara, ntụziaka nke usoro a nwere ike ịnweta data site na ebe ọ bụla na oghere adreesị ya. N'otu oge ahụ, dị ka anyị chetara, igosipụta faịlụ na ọnọdụ ọgụgụ-agụ pụtara na ntụziaka ọ bụla nwekwara ike gbanwee ya. Ọ bụrụ na ọ na-eme nke a n'amaghị ama, na-agbalị, dịka ọmụmaatụ, idegharị ihe nhazi n'ezie na ndenye na-adịghị adị, mgbe ahụ ọ nwere ike gbanwee faịlụ ahụ na mberede na adreesị a, nke ga-eduga na mmebi nke nchekwa data. Ọ bụrụ na egosipụtara faịlụ ahụ na ọnọdụ ọgụgụ naanị, mgbe ahụ mgbalị iji gbanwee oghere adreesị kwekọrọ ga-eduga na njedebe mberede nke mmemme na mgbama. SIGSEGV, na faịlụ ga-anọgide na-adịghị.

Nsonaazụ nke abụọ adịlarị maka iOS. Ma onye edemede ahụ ma ọ bụ isi mmalite ndị ọzọ ekwughị ya nke ọma, mana na-enweghị ya LMDB agaghị adị mma maka ịgba ọsọ na sistemụ mkpanaka a. A na-etinye akụkụ nke na-esote na ntụle ya.

Nkọwapụta faịlụ nwere mapụtara ebe nchekwa na iOS

Enwere akụkọ mara mma na WWDC na 2018 "iOS ebe nchekwa Deep Dive". Ọ na-agwa anyị na na iOS, ibe niile dị na ebe nchekwa anụ ahụ bụ otu n'ime ụdị atọ: unyi, abịakọrọ na dị ọcha.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ebe nchekwa dị ọcha bụ nchịkọta ibe nke enwere ike ibudata na-enweghị mgbu site na ebe nchekwa anụ ahụ. Enwere ike ibugharị data ha nwere dịka achọrọ site na isi mmalite ya. Faịlụ ndị nwere maapụ ebe nchekwa na-adaba na ngalaba a. iOS anaghị atụ egwu ibutu ibe ndị e debere na faịlụ site na ebe nchekwa n'oge ọ bụla, ebe ọ bụ na ekwenyere na a ga-emekọrịta ha na faịlụ dị na diski.
Na
Ibe niile emezigharịrị na-ejedebe na ebe nchekwa ruru unyi, n'agbanyeghị ebe ha nọ na mbụ. Karịsịa, faịlụ ndị emebere ebe nchekwa gbanwetụrụ site na ide na ebe nchekwa mebere nke metụtara ha ga-ekewa n'ụzọ dị otú a. Mepee LMDB na ọkọlọtọ MDB_WRITEMAP, mgbe ịmechara mgbanwe na ya, ị nwere ike nyochaa nke a n'onwe gị

Ozugbo ngwa malitere iburu oke ebe nchekwa anụ ahụ, iOS na-edobe ya na mkpakọ ibe ruru unyi. Ngụkọta ebe nchekwa nke ibe ruru unyi na abịakọrọ nwere bụ ihe a na-akpọ akara ukwu ebe nchekwa. Ozugbo ọ ruru uru ọnụ ụzọ, OOM na-egbu sistemu daemon na-abịa mgbe usoro ahụ gachara wee kwụsị ya n'ike. Nke a bụ peculiarity nke iOS ma e jiri ya tụnyere sistemụ arụmọrụ desktọpụ. N'ụzọ dị iche, ibelata akara ukwu ebe nchekwa site n'ịgbanwe ibe site na ebe nchekwa anụ ahụ na diski adịghị enye na iOS. Ikekwe usoro nke iwegharị ibe na diski na azụ na-eri ike maka ngwaọrụ mkpanaka, ma ọ bụ iOS na-echekwa akụ nke idegharị mkpụrụ ndụ na draịva SSD, ma ọ bụ ikekwe ndị na-emepụta enweghị afọ ojuju na arụmọrụ nke sistemu niile, ebe ihe niile dị. na-agbanwe agbanwe mgbe niile. N'agbanyeghị na ọ nwere ike, eziokwu ahụ ka bụ eziokwu.

Ozi ọma ahụ, nke a kpọtụrụla na mbụ, bụ na LMDB na ndabara anaghị eji usoro mmap emelite faịlụ. Nke a pụtara na iOS na-ekewa data egosiri dị ka ebe nchekwa dị ọcha na anaghị etinye aka na akara ukwu ebe nchekwa. Ị nwere ike nyochaa nke a site na iji ngwa Xcode akpọrọ VM Tracker. Nseta ihuenyo dị n'okpuru na-egosi ọnọdụ nke iOS mebere ebe nchekwa nke ngwa igwe ojii n'oge arụ ọrụ. Na mbido, 2 LMDB ka emebere n'ime ya. E kwere ka nke mbụ gosipụta faịlụ ya na 1GiB nke mebere ebe nchekwa, nke abụọ - 512MiB. N'agbanyeghị eziokwu na ma storages ogide a ụfọdụ ego nke bi ebe nchekwa, ọ dịghị nke ha na-eme unyi size.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ma ugbu a, oge eruola maka akụkọ ọjọọ. N'ihi usoro ngbanwe na sistemụ desktọpụ 64-bit, usoro ọ bụla nwere ike ịnwe ohere adreesị mebere dị ka ohere diski ike efu maka ikike ịgbanwe ya na-enye ohere. Dochie swap na mkpakọ na iOS na-ebelata oke usoro iwu. Ugbu a usoro niile dị ndụ ga-adaba na ebe nchekwa isi (gụọ RAM), na ndị niile na-adabaghị adaba ga-amanye ịkwụsị. Ekwuru nke a dị ka e kwuru n'elu mkpesa, na na akwụkwọ ikike. N'ihi nke a, iOS na-amachi oke ebe nchekwa dị maka ikenye site na mmap. Ebe a ebe a Ị nwere ike ilele oke nhụsianya nke oke ebe nchekwa nwere ike ịkenye na ngwaọrụ dị iche iche site na iji oku usoro a. Na ụdị smartphone kachasị ọhụrụ, iOS aghọwo ihe na-emesapụ aka site na 2 gigabytes, na n'elu nsụgharị nke iPad - site na 4. Na omume, n'ezie, ị ga-elekwasị anya na ụdị ngwaọrụ ndị dị ala na-akwado, ebe ihe niile dị nnọọ mwute. Ọbụna nke ka njọ, site n'ịlele ọnọdụ ebe nchekwa ngwa ahụ na VM Tracker, ị ga-ahụ na LMDB dị anya na naanị otu na-ekwu na ọ bụ ebe nchekwa. Ndị na-ekenye sistemu, faịlụ akụrụngwa, ihe onyonyo, na ndị na-eri anụ ndị ọzọ na-eri ezigbo chunks.

Dabere na nsonaazụ nnwale na igwe ojii, anyị rutere ụkpụrụ nkwekọrịta ndị a maka ebe nchekwa nke LMDB kenyere: 384 megabyte maka ngwaọrụ 32-bit yana 768 maka ngwaọrụ 64-bit. Ka emechara olu a, ọrụ ọ bụla na-agbanwe agbanwe na-amalite iji koodu ahụ kwụsị MDB_MAP_FULL. Anyị na-ahụ njehie ndị dị otú ahụ na nleba anya anyị, mana ha pere mpe nke na n'oge a enwere ike ileghara ha anya.

Ihe na-abụghị nke doro anya kpatara oke ebe nchekwa oriri site na nchekwa nwere ike ịbụ azụmahịa ogologo oge. Iji ghọta ka ejikọtara ihe atụ abụọ a, a ga-enyere anyị aka site n'ịtụle ogidi abụọ fọdụrụnụ nke LMDB.

3.2. Whale #2. B + - osisi

Iji ṅomie tebụl n'elu nchekwa uru isi, ọrụ ndị a ga-adịrịrị na API ya:

  1. Ịtinye ihe ọhụrụ.
  2. Chọọ ihe mmewere nwere igodo enyere.
  3. Iwepu ihe mmewere.
  4. Tinyegharịa ogologo oge igodo n'usoro haziri.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOSUsoro data kachasị mfe nke nwere ike ịme ngwa ngwa ọrụ anọ niile bụ osisi ọchụchọ ọnụọgụ abụọ. Nke ọ bụla n'ime ọnụ ya na-anọchi anya igodo na-ekewa akụkụ nke igodo ụmụaka ka ọ bụrụ osisi abụọ. Nke aka ekpe nwere ndị dị nta karịa nne na nna, na nke aka nri nwere ndị ka ukwuu. A na-enweta usoro igodo enyere iwu site na otu n'ime njem njem osisi ama ama

Osisi ọnụọgụ abụọ nwere ntụpọ abụọ bụ isi nke na-egbochi ha ịdị irè dị ka nhazi data dabeere na diski. Nke mbụ, ogo nke nguzozi ha enweghị atụ. Enwere nnukwu ihe ize ndụ nke ịnweta osisi nke ịdị elu nke alaka dị iche iche nwere ike ịdị iche iche, nke na-eme ka mgbagwoju algorithmic nke ọchụchọ dịkwuo njọ ma e jiri ya tụnyere ihe a na-atụ anya ya. Nke abuo, otutu njikọ n'etiti ọnụ na-egbochi osisi ọnụọgụ abụọ nke mpaghara na ebe nchekwa. N'ihi nke a, ọbụna mfe ịgafe ọtụtụ ọnụ ụzọ agbata obi n'osisi nwere ike ịchọ ịga leta ọnụ ọgụgụ ibe. Nke a bụ nsogbu ọbụna mgbe anyị na-ekwu banyere irè nke ọnụọgụ abụọ osisi dị ka ihe na-ncheta data Ọdịdị, ebe ọ bụ na mgbe niile na-atụgharị peeji nke na processor cache abụghị a ọnụ ala ụtọ. Mgbe ọ na-abịa na iweghachite ibe ugboro ugboro jikọtara ọnụ na diski, ọnọdụ ahụ na-aghọ kpamkpam dị mwute.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOSB-osisi, ịbụ mmalite nke osisi ọnụọgụ abụọ, dozie nsogbu ndị akọwapụtara na paragraf gara aga. Nke mbụ, ha na-edozi onwe ha. Nke abuo, onye ọ bụla n'ime ha ọnụ na-ekewa set nke igodo ụmụaka bụghị n'ime 2, ma n'ime M nyere iwu subsets, na ọnụ ọgụgụ M nwere ike ịbụ nnọọ nnukwu, na usoro nke ọtụtụ narị, ma ọ bụ ọbụna ọtụtụ puku.

Site na ya:

  1. Ọnụ ọ bụla nwere ọnụ ọgụgụ buru ibu nke igodo enyerelarị iwu na osisi ndị ahụ dị mkpụmkpụ.
  2. Osisi ahụ na-enweta ihe onwunwe nke mpaghara ọnọdụ na ebe nchekwa, ebe ọ bụ na igodo ndị dị nso na uru na-adabere na ya n'akụkụ ibe ha n'otu akụkụ ma ọ bụ agbata obi.
  3. Ọnụ ọgụgụ nke ọnụ ụzọ agafe mgbe ị na-agbada osisi n'oge ọrụ ọchụchọ na-ebelata.
  4. A na-ebelata ọnụ ọgụgụ nke oghere ebumnuche ndị a na-agụ n'oge ajụjụ dị iche iche, ebe ọ bụ na nke ọ bụla n'ime ha enweelarị nnukwu igodo igodo.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

LMDB na-eji mgbanwe nke osisi B a na-akpọ osisi B+ iji chekwaa data. Eserese dị n'elu na-egosi ụdị ọnụ atọ dị na ya:

  1. N'elu bụ mgbọrọgwụ. Ọ dịghị ihe na-eme ka ọ bụrụ echiche nke nchekwa data dị n'ime ụlọ nkwakọba ihe. N'ime otu ihe atụ LMDB, ị nwere ike ịmepụta ọtụtụ ọdụ data na-ekekọrịta oghere adreesị mebere mapụtara. Onye ọ bụla n'ime ha na-amalite site na mgbọrọgwụ nke ya.
  2. N'ogo kachasị ala bụ akwụkwọ. Ha na naanị ha nwere ụzọ ụzọ isi uru echekwara na nchekwa data. Site n'ụzọ, nke a bụ peculiarity nke B + - osisi. Ọ bụrụ na osisi B mgbe niile na-echekwa akụkụ bara uru na ọnụ nke ọkwa niile, mgbe ahụ mgbanwe B+ bụ naanị na nke kachasị ala. N'igosi eziokwu a, anyị ga-akpọkwa subtype nke osisi a na-eji na LMDB naanị osisi B.
  3. N'etiti mgbọrọgwụ na akwụkwọ nwere ọkwa teknụzụ 0 ma ọ bụ karịa nwere ọnụ ụzọ igodo (alaka). Ọrụ ha bụ ikesa igodo ahazi n'etiti akwụkwọ.

N'anụ ahụ, ọnụ ọnụ bụ ngọngọ nke ebe nchekwa nke ogologo a kara aka. Ogo ha bụ otutu nke ibe ebe nchekwa na sistemụ arụmọrụ, nke anyị tụlere n'elu. E gosipụtara usoro ọnụ ọnụ n'okpuru. nkụnye eji isi mee nwere ozi meta, nke kacha pụta ìhè dịka ọmụmaatụ bụ checksum. Ọzọ na-abịa ozi gbasara nkwụsị nke mkpụrụ ndụ nwere data dị. Data ahụ nwere ike ịbụ igodo ọ bụla, ma ọ bụrụ na anyị na-ekwu maka ọnụ ụzọ igodo, ma ọ bụ ụzọ abụọ igodo uru n'ihe gbasara akwụkwọ. Ị nwere ike ịgụkwu banyere nhazi nke ibe na ọrụ ahụ. "Ntụle nke ụlọ ahịa igodo-uru dị elu".

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

N'ịmekọrịta ọdịnaya nke ọnụ ụzọ ibe, anyị ga-anọchi anya osisi LMDB B n'ụzọ dị mfe n'ụdị na-esonụ.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ibe ndị nwere ọnụ dị n'usoro na diski. Ibe ndị nwere ọnụ ọgụgụ dị elu dị na njedebe nke faịlụ ahụ. Ihe a na-akpọ meta ibe nwere ozi gbasara mgbaghara nke enwere ike ịchọta mgbọrọgwụ nke osisi niile. Mgbe ị na-emepe faịlụ, LMDB na-enyocha ibe faịlụ site na ibe site na njedebe ruo na mmalite na-achọ ibe meta bara uru ma site na ya chọta ọdụ data dị.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ugbu a, n'inwe echiche nke usoro ezi uche na nke anụ ahụ nke nzukọ data, anyị nwere ike ịga n'ihu ịtụle ogidi nke atọ nke LMDB. Ọ bụ site n'enyemaka ya ka mgbanwe niile nke nchekwa na-eme azụmahịa na n'ichepụta onwe ha, na-enye nchekwa data dị ka ihe onwunwe nke multiversion.

3.3. Whale #3. Detuo-na-dere

Ụfọdụ ọrụ B-osisi gụnyere ime mgbanwe dị iche iche na ọnụ ya. Otu ihe atụ na-agbakwunye igodo ọhụrụ na ọnụ ọnụ nke eruola oke ike ya. N'okwu a, ọ dị mkpa, nke mbụ, kewaa ọnụ ụzọ abụọ, na nke abụọ, ịgbakwunye njikọ na oghere nwa ọhụrụ na-eto eto na nne na nna ya. Usoro a nwere ike ịdị ize ndụ. Ọ bụrụ na n'ihi ihe ụfọdụ (okuku, ọkụ ọkụ, wdg) naanị akụkụ nke mgbanwe site na usoro ahụ na-eme, mgbe ahụ, osisi ahụ ga-anọgide na-enweghị nkwekọrịta.

Otu ngwọta ọdịnala maka ime ka nchekwa data nwee mmejọ bụ ịgbakwunye usoro data on-disk ọzọ n'akụkụ osisi B - ndekọ azụmahịa, nke a makwaara dị ka dee-n'ihu log (WAL). Ọ bụ faịlụ na njedebe nke e debere ọrụ a chọrọ ka ọ bụrụ nke ọma tupu ịmegharịa osisi B n'onwe ya. Ya mere, ọ bụrụ na achọpụtara nrụrụ data n'oge nchọpụta onwe onye, ​​nchekwa data na-enyocha ndekọ iji tinye onwe ya n'usoro.

LMDB ahọrọla usoro dị iche dịka usoro nnabata mmejọ, nke a na-akpọ oyiri-na-dere. Ihe kacha mkpa bụ na kama imelite data na ibe dị adị, ọ na-ebu ụzọ depụta ya kpamkpam wee mee mgbanwe niile na nnomi a.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Na-esote, ka data emelitere dị, ọ dị mkpa ịgbanwe njikọ na ọnụ nke ghọrọ ugbu a na ọnụ nne na nna ya. Ebe ọ dịkwa mkpa ka a gbanwee ya maka nke a, a na-eṅomikwa ya tupu oge eruo. Usoro na-aga n'ihu recursively niile n'ụzọ na mgbọrọgwụ. Ihe ikpeazụ ị ga-agbanwe bụ data dị na ibe meta

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ọ bụrụ na usoro ahụ dara na mberede n'oge usoro mmelite, mgbe ahụ, a gaghị emepụta ibe meta ọhụrụ, ma ọ bụ na agaghị ede ya na diski kpamkpam, na checksum ya agaghị ezighi ezi. N'ime nke ọ bụla n'ime ikpe abụọ a, a gaghị enwe ike ịnweta ibe ọhụrụ, mana agaghị emetụta ndị ochie. Nke a na-ewepụ mkpa LMDB dee ndekọ n'ihu iji jikwaa ndakọrịta data. N'ezie, usoro nke nchekwa data na diski akọwara n'elu n'otu oge na-arụ ọrụ ya. Enweghị ndekọ ndekọ azụmahịa doro anya bụ otu n'ime njirimara LMDB na-enye ọsọ ọgụgụ data dị elu

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Ihe si na ya pụta, nke a na-akpọ append-only B-osisi, na-enye ikewapụ azụmahịa yana ọtụtụ ụdị. Na LMDB, azụmahịa ọ bụla mepere emepe na-ejikọta ya na mgbọrọgwụ osisi dị ugbu a. Ruo mgbe emechara azụmahịa ahụ, ibe osisi ndị metụtara ya agaghị agbanwe ma ọ bụ jiri ya mee ihe maka nsụgharị ọhụrụ nke data ahụ. Ya mere, ị nwere ike ịrụ ọrụ ruo ogologo oge masịrị gị na nhazi data dị mkpa n'oge ahụ. Emeghere azụmahịa ahụ, ọbụlagodi ma ọ bụrụ na nchekwa ahụ na-aga n'ihu na-emelite nke ọma n'oge a. Nke a bụ isi mmalite nke multiversion, na-eme LMDB ka ọ bụrụ ezigbo data maka ndị anyị hụrụ n'anya UICollectionView. N'ịbụ onye meghere azụmahịa, ọ dịghị mkpa ịbawanye akara ebe nchekwa nke ngwa ahụ site na ngwa ngwa na-ebupụta data dị ugbu a n'ime ụfọdụ ihe nchekwa nchekwa, n'ihi egwu nke ịbụ onye ọ bụla. Njirimara a na-ekewa LMDB n'otu SQLite, nke na-enweghị ike ịnya isi maka oke dị otú ahụ. N'ịbụ onye meghere azụmahịa abụọ na nke ikpeazụ ma kpochapụ otu ndekọ n'ime otu n'ime ha, ọ gaghị enwe ike ịnweta otu ndekọ ahụ n'ime nke abụọ fọdụrụnụ.

Akụkụ ntụgharị nke mkpụrụ ego bụ oke oriri nke ebe nchekwa mebere nke ọma. Ihe mmịfe ahụ na-egosi ihe nhazi nchekwa data ga-adị ka ma ọ bụrụ na agbanwere ya n'otu oge na azụmahịa 3 mepere emepe na-ele anya na nsụgharị dị iche iche nke nchekwa data. Ebe ọ bụ na LMDB enweghị ike iji nodes nwere ike nweta site na mgbọrọgwụ metụtara azụmahịa dị ugbu a, ụlọ ahịa ahụ enweghị nhọrọ ma ọ bụghị ikenye mgbọrọgwụ nke anọ ọzọ na ebe nchekwa ma mechie ibe ndị gbanwere n'okpuru ya.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

N'ebe a, ọ ga-aba uru icheta ngalaba dị na faịlụ ndị e debere ebe nchekwa. O yiri ka mgbakwunye oriri nke mebere ebe nchekwa ekwesịghị ichegbu onwe anyị nke ukwuu, ebe ọ bụ na ọ naghị etinye aka na ebe nchekwa akara nke ngwa ahụ. Otú ọ dị, n'otu oge ahụ, a chọpụtara na iOS na-esi ike ikenye ya, na anyị enweghị ike, dị ka na ihe nkesa ma ọ bụ desktọpụ, nye mpaghara LMDB nke 1 terabyte ma ghara iche maka njirimara a ma ọlị. Ọ bụrụ na ọ ga-ekwe omume, ị kwesịrị ịgbalị ime ka ndụ nke azụmahịa dị mkpụmkpụ dị ka o kwere mee.

4. Ịmepụta atụmatụ data n'elu API igodo-uru

Ka anyị bido nyocha API anyị site n'ịlele nkọwapụta nke LMDB nyere: gburugburu na ọdụ data, igodo na ụkpụrụ, azụmahịa na cursors.

Ihe ndetu gbasara ndepụta koodu

Ọrụ niile dị na ọha LMDB API na-eweghachi nsonaazụ nke ọrụ ha n'ụdị koodu njehie, mana na ndepụta niile na-esote, ewepụrụ nkwenye ya maka nkenke. ndụdụ Ihe mkpuchi C ++ lmdbxx, nke emebere mperi dị ka ewepụrụ C ++.

Dịka ụzọ kachasị ọsọ iji jikọọ LMDB na oru ngo maka iOS ma ọ bụ macOS, ana m atụ aro CocoaPod m POSLMDB.

4.1. Nkọwapụta ndị bụ isi

gburugburu

Ọdịdị MDB_env bụ ebe nchekwa nke ala ime nke LMDB. Ezinụlọ arụrụ arụrụ arụrụ mdb_env na-enye gị ohere ịhazi ụfọdụ akụrụngwa ya. N'okwu kachasị mfe, mmalite engine dị ka nke a.

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

Na ngwa Mail.ru Cloud, anyị gbanwere ụkpụrụ ndabara nke naanị parampat abụọ.

Nke mbụ bụ nha oghere adreesị mebere nke a na-edobe faịlụ nchekwa ahụ. N'ụzọ dị mwute, ọbụlagodi na otu ngwaọrụ ahụ, uru a kapịrị ọnụ nwere ike ịdịgasị iche site na ọsọ gaa na-agba ọsọ. Iji buru n'uche njirimara nke iOS a, a na-ahọrọ oke nchekwa kachasị elu. Malite na ụfọdụ uru, a na-eweghachi ya n'usoro ruo mgbe ọrụ ahụ mdb_env_open agaghị alaghachi a n'ihi dị iche na ENOMEM. Na tiori, enwerekwa ụzọ ọzọ - buru ụzọ kenye obere ebe nchekwa na injin ahụ, mgbe ahụ, mgbe enwetara njehie. MDB_MAP_FULL, mụbaa ya. Otú ọ dị, ọ bụ ogwu ka ukwuu. Ihe kpatara ya bụ na usoro maka re-ekenye ebe nchekwa (remap) iji ọrụ mdb_env_set_map_size na-emebi ụlọ ọrụ niile (cursors, azụmahịa, igodo na ụkpụrụ) enwetaburu site na injin. Iburu n'uche ihe omume a na koodu ahụ ga-eduga na mgbagwoju anya ya. Otú ọ dị, ọ bụrụ na ebe nchekwa mebere dị gị ezigbo mkpa, mgbe ahụ nke a nwere ike ịbụ ihe mere ị ga-eji lebakwuo anya na ndụdụ ahụ gara n'ihu. MDBX, ebe n'ime atụmatụ mara ọkwa e nwere "akpaaka na-na-fly nchekwa data size mmezi".

Oke nke abụọ, uru ndabara nke na-adabaghị anyị, na-achịkwa usoro nke ịhụ na nchekwa eri. O di nwute, opekata mpe iOS 10 nwere nsogbu na nkwado maka nchekwa mpaghara eri. N'ihi nke a, na ihe atụ dị n'elu, a na-eji ọkọlọtọ meghere ebe nchekwa ahụ MDB_NOTLS. Na mgbakwunye na nke a, ọ dịkwa mkpa ndụdụ Ihe mkpuchi C++ lmdbxxiji bepụ mgbanwe na njirimara a na n'ime ya.

Databases

Ebe nchekwa data bụ ihe atụ B-osisi dị iche, nke anyị tụlere n'elu. Mmeghe ya na-eme n'ime azụmahịa, nke nwere ike iyi ntakịrị ihe na mbụ.

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

N'ezie, azụmahịa na LMDB bụ ebe nchekwa, ọ bụghị otu nchekwa data. Echiche a na-enye gị ohere ịrụ ọrụ atọmịk na ụlọ ọrụ dị na ọdụ data dị iche iche. Na tiori, nke a na-emepe ohere nke ịmegharị tebụl n'ụdị ọdụ data dị iche iche, ma n'otu oge m weere ụzọ dị iche iche, kọwara n'ụzọ zuru ezu n'okpuru.

Igodo na ụkpụrụ

Ọdịdị MDB_val na-egosipụta echiche nke ma isi na uru. Ebe nchekwa ahụ enweghị echiche gbasara semantics ha. Maka ya, ihe ọzọ bụ naanị n'usoro nke bytes nke a nyere nha. Ogo igodo kacha bụ 512 bytes.

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

Iji comparator, ụlọ ahịa ahụ na-ahazi igodo n'usoro nrịgo. Ọ bụrụ na ijighị nke gị dochie ya, a ga-eji nke ndabara mee ihe, nke na-ahazi ha site na byte n'usoro lexicographic.

Azụmahịa

A kọwara usoro azụmahịa ahụ n'ụzọ zuru ezu na isiakwụkwọ gara aga, ya mere, ebe a, m ga-eji nkenke ikwughachi ha isi Njirimara:

  1. Na-akwado ihe niile bụ isi Acid: atomity, agbanwe agbanwe, iche na ntụkwasị obi. Enweghị m ike ịnyere aka ma mara na enwere ahụhụ n'ihe gbasara ịdịte aka na macOS na iOS nke edoziri na MDBX. Ị nwere ike ịgụkwu na ha README.
  2. A na-akọwa ụzọ a ga-esi na-agụ ọtụtụ ihe site n'atụmatụ "otu onye edemede / ọtụtụ ndị na-agụ akwụkwọ". Ndị ode akwụkwọ na-egbochi ibe ha, mana anaghị egbochi ndị na-agụ akwụkwọ. Ndị na-agụ akwụkwọ anaghị egbochi ndị edemede ma ọ bụ ibe ha.
  3. Nkwado maka azụmahịa akwụ ụgwọ.
  4. Nkwado multiversion.

Multiversion na LMDB dị mma nke na achọrọ m igosipụta ya n'omume. Site na koodu dị n'okpuru, ị nwere ike ịhụ na azụmahịa ọ bụla na-arụ ọrụ na kpọmkwem ụdị nke nchekwa data dị ugbu a n'oge e meghere ya, na-ekewapụ kpamkpam na mgbanwe niile na-esote. Ịmalite nchekwa na ịgbakwunye ihe ndekọ ule na ya adịghị anọchi anya ihe ọ bụla na-adọrọ mmasị, ya mere a na-ahapụ ememe ndị a n'okpuru onye na-emebi ihe.

Na-agbakwụnye ntinye ule

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

Ana m akwado ka ị nwaa otu aghụghọ ahụ na SQLite wee hụ ihe na-eme.

Multiversion na-eweta ezigbo uru na ndụ onye nrụpụta iOS. Iji akụrụngwa a, ị nwere ike n'ụzọ dị mfe na ndammana ịhazi ọnụego mmelite nke isi iyi data maka ụdị ihuenyo, dabere na nlebanya ahụmịhe onye ọrụ. Dịka ọmụmaatụ, ka anyị were otu akụkụ nke ngwa ngwa ígwé ojii Mail.ru dị ka nbudata ọdịnaya site na ụlọ ọrụ mgbasa ozi sistemụ. Site na njikọ dị mma, onye ahịa nwere ike itinye ọtụtụ foto kwa sekọnd na sava ahụ. Ọ bụrụ na imelite mgbe nbudata ọ bụla gasịrị UICollectionView na ọdịnaya mgbasa ozi na igwe ojii nke onye ọrụ, ị nwere ike ichefu ihe dị ka 60fps na mpịakọta dị nro n'oge usoro a. Iji gbochie mmelite ihuenyo ugboro ugboro, ịkwesịrị ịmachi ọnụego data na-agbanwe n'okpuru UICollectionViewDataSource.

Ọ bụrụ na nchekwa data anaghị akwado multiversion ma na-enye gị ohere ịrụ ọrụ naanị na ọnọdụ dị ugbu a, mgbe ahụ, iji mepụta oge na-akwụ ụgwọ nke data ị chọrọ ka iṅomi ya ma ọ bụ na ụfọdụ nhazi data nchekwa ma ọ bụ na tebụl nwa oge. Nke ọ bụla n'ime ụzọ ndị a dị oke ọnụ. N'ihe banyere nchekwa ebe nchekwa, anyị na-enweta ụgwọ ma na ebe nchekwa, nke sitere na ịchekwa ihe arụrụ arụ, na ka oge na-aga, jikọtara ya na mgbanwe mgbanwe ORM. Banyere tebụl na-adịru nwa oge, nke a bụ ihe ụtọ dị oke ọnụ karịa, na-eme ka ọ bụrụ naanị n'ọnọdụ ndị na-adịghị mkpa.

Ngwọta multiversion nke LMDB na-edozi nsogbu nke idowe isi iyi data kwụsiri ike n'ụzọ mara mma. O zuru ezu naanị imepe azụmahịa na voila - ruo mgbe anyị mechara ya, a na-ekwe nkwa na a ga-edozi ntọala data ahụ. Echiche maka ọsọ mmelite ya dị ugbu a kpamkpam n'aka nke ihe ngosi ngosi, na-enweghị ihe ọ bụla dị ịrịba ama.

Cursor

Cursors na-enye usoro maka ịtụgharị n'usoro n'usoro karịa ụzọ abụọ bara uru site na ịgafe osisi B. Na-enweghị ha, ọ gaghị ekwe omume ịmepụta tebụl dị na nchekwa data nke ọma, nke anyị na-atụgharị ugbu a.

4.2. Nlereanya tebụl

Ngwongwo nke nhazi isi na-enye gị ohere ịmepụta abstraction dị elu dị ka tebụl n'elu abstractions bụ isi. Ka anyị tụlee usoro a site na iji ihe atụ nke okpokoro isi nke onye ahịa igwe ojii, nke na-echekwa ozi gbasara faịlụ na nchekwa niile nke onye ọrụ.

Atụmatụ tebụl

Otu n'ime ihe ndị a na-ahụkarị maka nhazi tebụl nwere osisi nchekwa bụ nhọrọ nke ihe niile dị n'ime akwụkwọ ndekọ aha. Ndepụta Adjacency. Iji mejuputa ya n'elu nchekwa uru igodo, ọ dị mkpa ịhazi igodo faịlụ na nchekwa n'ụzọ ga-esi na-agbakọta ha dabere na otu ha na ndekọ ndekọ ndị nne na nna. Na mgbakwunye, iji gosipụta ọdịnaya nke ndekọ ahụ n'ụdị nke onye ọrụ Windows maara nke ọma (mkpokọ nke mbụ, wee faịlụ, ha abụọ n'usoro mkpụrụedemede), ọ dị mkpa itinye mpaghara ndị ọzọ kwekọrọ na igodo ahụ.

Foto dị n'okpuru ebe a na-egosi ka, dabere na ọrụ dị n'aka, ihe nnochite anya igodo n'ụdị nhazi byte nwere ike ịdị ka. A na-edobe bytes nwere ihe nchọpụta nke ndekọ ndekọ aha nne na nna (acha ọbara ọbara) na mbụ, wee jiri ụdị (akwụkwọ ndụ akwụkwọ ndụ) na ọdụ ya nwere aha (acha anụnụ anụnụ) N'ịbụ ndị na-ahazi ya site na ndabara LMDB comparator n'usoro lexicographical, a na-enye ha iwu na . usoro achọrọ. Igodo na-agafe n'usoro na otu prefix uhie ahụ na-enye anyị ụkpụrụ ha jikọtara ya na usoro ha kwesịrị igosi na interface onye ọrụ (n'aka nri), na-achọghị nhazi nhazi ọzọ.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Igodo usoro na ụkpụrụ

E chepụtala ọtụtụ ụzọ maka ịhazi ihe n'usoro n'ụwa. Ebe ọ bụ na anyị enweghị ihe ọ bụla ọzọ a chọrọ ma ọ bụghị ọsọ, anyị họọrọ ngwa ngwa maka onwe anyị - mkpofu ebe nchekwa nke ihe atụ nke usoro asụsụ C nwere. NodeKey.

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

Ka ịchekwaa NodeKey na nchekwa dị mkpa na ihe MDB_val dobe pointer data na adreesị nke mmalite nke nhazi ahụ, ma gbakọọ nha ha na ọrụ ahụ sizeof.

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

N'isi nke mbụ na njirisi nhọrọ nchekwa data, m kwuru na mbelata oke oke n'ime ọrụ CRUD dị ka ihe nhọrọ nhọrọ dị mkpa. Koodu ọrụ serialize na-egosi ka n'ihe banyere LMDB ha nwere ike isi zere kpamkpam mgbe ị na-etinye ndekọ ọhụrụ na nchekwa data. A na-ebu ụzọ gbanwee usoro byte nke na-abata site na sava ahụ ka ọ bụrụ ihe mkpokọ, emesia a na-atụba ha obere ihe na nchekwa. N'iburu n'uche na enweghị oke oke n'ime LMDB, ị nwere ike nweta ọnọdụ dị egwu site na ụkpụrụ iOS - jiri naanị ebe nchekwa nchekwa rụọ ọrụ na data n'akụkụ ụzọ niile site na netwọkụ gaa na diski!

Ịnye igodo ya na ọnụọgụ ọnụọgụ abụọ

A na-akọwapụta mmekọrịta dị n'usoro isi site na ọrụ pụrụ iche a na-akpọ comparator. Ebe ọ bụ na injin ahụ amaghị ihe ọ bụla gbasara semantics nke bytes ndị ha nwere, onye comparator nke ndabara enweghị nhọrọ ma ọ bụghị ịhazi igodo ya n'usoro lexicographic, na-eji ntụnyere byte-byte. Iji ya na-ahazi ihe owuwu dị ka iji anyụike gbuo afụ ọnụ. Otú ọ dị, n'ọnọdụ ndị dị mfe, a na m achọta usoro a dị mma. A kọwara usoro ọzọ n'okpuru ebe a, mana ebe a, m ga-ahụ rake ole na ole gbasasịrị n'ụzọ a.

Ihe mbụ ị ga-echeta bụ ihe nnọchianya ebe nchekwa nke ụdị data oge ochie. N'ihi ya, na niile Apple ngwaọrụ, integer variables na-echekwara na format Obere Endian. Nke a pụtara na byte kacha nta ga-adị n'aka ekpe, ọ gaghịkwa ekwe omume ịhazi ọnụọgụgụ site na iji ntụnyere byte-byte. Dịka ọmụmaatụ, ịgbalị iji usoro ọnụọgụgụ site na 0 ruo 511 mee nke a ga-arụpụta nsonaazụ a.

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

Iji dozie nsogbu a, a ga-edobe integers na igodo n'ụdị dabara adaba maka comparator byte-byte. Ọrụ sitere na ezinụlọ ga-enyere gị aka ime mgbanwe dị mkpa hton* (ọ kachasị htons maka ọnụọgụ abụọ-byte site na ihe atụ).

Usoro maka ịnọchite anya eriri na mmemme bụ, dịka ị maara, zuru oke akụkọ ihe mere eme. Ọ bụrụ na semantics nke eriri, yana encoding eji na-anọchi anya ha na ebe nchekwa, na-egosi na a pụrụ inwe ihe karịrị otu byte kwa agwa, mgbe ahụ ọ ka mma ozugbo hapụ echiche nke iji ndabara comparator.

Ihe nke abụọ kwesịrị iburu n'uche bụ nhazi ụkpụrụ nhazi ubi nchịkọta. N'ihi ha, bytes nwere ụkpụrụ mkpofu nwere ike ịmepụta na ebe nchekwa n'etiti ubi, nke, n'ezie, na-agbaji nhazi byte-byte. Iji kpochapụ ihe mkpofu, ịkwesịrị ịkpọsa mpaghara n'usoro akọwapụtara nke ọma, na-eburu iwu nhazi n'uche, ma ọ bụ jiri njirimara dị na nkwupụta nhazi ahụ. packed.

Ịnye igodo ya na comparator mpụga

Echiche ntụnyere igodo nwere ike ịdị mgbagwoju anya maka ọnụọgụ ọnụọgụ abụọ. Otu n'ime ọtụtụ ihe kpatara ya bụ ọnụnọ nke teknuzu ubi n'ime ihe owuwu. M ga-akọwa ihe mere ha site n'iji ihe atụ nke igodo maka ihe ndekọ aha nke anyị maara nke ọma.

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

N'agbanyeghị na ọ dị mfe, n'ọtụtụ ọnọdụ ọ na-eri oke nchekwa. Ihe nchekwa maka aha na-ewe 256 bytes, n'agbanyeghị na nkezi faịlụ na aha nchekwa anaghị agafe mkpụrụedemede 20-30.

Otu n'ime usoro ọkọlọtọ maka ịkwalite nha ndekọ bụ "ịkpụcha" ya na nha ya. Ihe kachasị mkpa bụ na a na-echekwa ihe dị n'ime oghere niile na-agbanwe agbanwe na ebe nchekwa na njedebe nke nhazi ahụ, a na-echekwa ogologo ha na mgbanwe dị iche iche. Dị ka usoro a si dị, igodo ahụ NodeKey na-agbanwe dị ka ndị a.

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

Ọzọkwa, mgbe ị na-eme usoro, akọwapụtaghị nha data sizeof Nhazi ahụ dum, na nha nke ubi niile bụ ogologo a kapịrị ọnụ gbakwunyere nha nke akụkụ ahụ ejiri n'ezie nke ihe nchekwa.

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

N'ihi nrụgharị ahụ, anyị nwetara nnukwu ego na oghere nke igodo nwere. Otú ọ dị, n'ihi na teknuzu ubi nameLength, comparator ọnụọgụ abụọ nke ndabara adabaghị maka ntụnyere igodo. Ọ bụrụ na anyị ejighị nke anyị dochie ya, mgbe ahụ ogologo aha ga-abụ ihe kachasị mkpa na nhazi karịa aha n'onwe ya.

LMDB na-enye ohere nchekwa data ọ bụla nwee ọrụ ntụnyere isi nke ya. A na-eme nke a site na iji ọrụ ahụ mdb_set_compare kpomkwem tupu imeghe. Maka ihe doro anya, enweghị ike ịgbanwe ya n'oge ndụ nchekwa data niile. Onye comparator na-enweta igodo abụọ n'ụdị ọnụọgụ abụọ dị ka ntinye, ma na mmepụta ọ na-eweghachi nsonaazụ ntụnyere: ihe na-erughị (-1), karịa (1) ma ọ bụ nhata (0). Pseudocode maka NodeKey dị ka nke ahụ.

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

Ọ bụrụhaala na igodo niile dị na nchekwa data bụ otu ụdị, na-enweghị ihe ọ bụla ịtụba nnọchite byte ha n'ụdị nhazi igodo ngwa bụ nke iwu kwadoro. Enwere otu nuance ebe a, mana a ga-atụle ya n'okpuru ebe a na mpaghara "Ihe ndekọ ọgụgụ".

Usoro ụkpụrụ

LMDB na-arụ ọrụ nke ukwuu na igodo ndekọ echekwara. Ntụnyere ha na ibe ha na-eme n'ime usoro nke ọrụ ọ bụla etinyere, na arụmọrụ nke ngwọta dum dabere na ọsọ nke comparator. N'ime ụwa zuru oke, onye na-atụnye ọnụọgụ abụọ nke ndabara kwesịrị iji tụnyere igodo, mana ọ bụrụ na ị ga-eji nke gị, mgbe ahụ usoro maka ịmegharị igodo n'ime ya kwesịrị ịdị ngwa ngwa o kwere mee.

Ebe nchekwa data enweghị mmasị karịsịa na akụkụ uru nke ndekọ (uru). Ntughari ya site na nnochi anya byte gaa na ihe na-eme naanị mgbe koodu ngwa chọrọ ya, dịka ọmụmaatụ, igosi ya na ihuenyo. Ebe ọ bụ na nke a na-eme obere oge, ihe achọrọ maka usoro a adịghị oke egwu, yana na mmejuputa ya, anyị na-enwere onwe anyị ilekwasị anya na ịdị mma dịka ọmụmaatụ, iji serialize metadata gbasara faịlụ ndị ebudatabeghị, anyị na-eji. NSKeyedArchiver.

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

Agbanyeghị, enwere oge mgbe arụmọrụ ka dị mkpa. Dịka ọmụmaatụ, mgbe ị na-echekwa metainformation gbasara nhazi faịlụ nke igwe ojii, anyị na-eji otu ebe nchekwa ihe. Isi ihe dị n'ọrụ nke imepụta ihe nnochite anya ha n'usoro bụ eziokwu bụ na a na-eji usoro klaasị na-ahazi ihe ndị dị na ndekọ aha.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Iji mejuputa ya na asụsụ C, a na-etinye akụkụ ụfọdụ nke ndị nketa n'ụdị dị iche iche, a na-akọwakwa njikọ ha na isi ihe site na mpaghara ụdị njikọ. A na-akọwapụta ọdịnaya nke otu n'ezie site na ụdị njirimara teknụzụ.

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

Na-agbakwụnye ma na-emelite ndekọ

Enwere ike ịgbakwunye igodo na uru a na-ahazi na ụlọ ahịa ahụ. Iji mee nke a, jiri ọrụ ahụ mdb_put.

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

N'oge nhazi, enwere ike ịhapụ ma ọ bụ machibido ebe nchekwa ahụ iji chekwaa ọtụtụ ndekọ na otu igodo ahụ, ọ bụrụ na amachibidoro ịmegharị igodo, mgbe ị na-etinye ndekọ, ị nwere ike ikpebi ma anabataghị imelite ndekọ dị adị ma ọ bụ na anabataghị ya. Ọ bụrụ na ọgbaghara nwere ike ime naanị n'ihi njehie dị na koodu ahụ, mgbe ahụ ị nwere ike ichebe onwe gị site na ịkọwa ọkọlọtọ. NOOVERWRITE.

Ndenye ọgụgụ

Iji gụọ ndekọ na LMDB, jiri ọrụ ahụ mdb_get. Ọ bụrụ na ejikọtara ụzọ abụọ igodo-uru site na ihe arụrụ arụ na mbụ, mgbe ahụ usoro a dị ka nke a.

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

Ndepụta a gosipụtara na-egosi otú serialization site na mkpofu ihe owuwu na-enye gị ohere iwepu oke oke ọ bụghị naanị mgbe ị na-ede ihe, mana mgbe ị na-agụ data. E sitere na ọrụ mdb_get pointer na-ele anya kpọmkwem na adreesị ebe nchekwa mebere ebe nchekwa data na-echekwa ihe ngosi byte nke ihe ahụ. N'ezie, anyị na-enweta ụdị ORM nke na-enye ọsọ ọgụgụ data dị elu nke fọrọ nke nta ka ọ bụrụ n'efu. N'agbanyeghị mma niile nke ịbịaru nso, ọ dị mkpa icheta ọtụtụ atụmatụ metụtara ya.

  1. Maka azụmahịa naanị ịgụ, ihe nrịbama maka nhazi uru ga-adị irè naanị ruo mgbe emechiri azụmahịa ahụ. Dị ka e kwuru na mbụ, ibe akwụkwọ B-osisi nke ihe dị na ya, n'ihi ụkpụrụ nnomi-na-ede, na-anọgide na-agbanwe agbanwe ma ọ bụrụhaala na ha na-ezo aka na ọ dịkarịa ala otu azụmahịa. N'otu oge ahụ, ozugbo azụmahịa ikpeazụ metụtara ha mezuru, enwere ike iji ibe ndị ahụ mee ihe maka data ọhụrụ. Ọ bụrụ na ọ dị mkpa ka ihe na-adị ndụ na azụmahịa nke mere ha, mgbe ahụ, a ka ga-edepụta ha.
  2. Maka azụmahịa a na-agụgharị, ihe nrịbama nke usoro uru ga-esi na ya pụta ga-adị irè naanị ruo mgbe usoro mgbanwe nke mbụ (ide ma ọ bụ ihichapụ data).
  3. Ọ bụ ezie na Ọdịdị NodeValue Ọ bụghị nke zuru oke, mana edoziri ya (lee mpaghara nkebi "Ịtọ igodo n'iji mpụta comparator"), ị nwere ike ịnweta ubi ya n'enweghị nsogbu site na ntụnye. Ihe bụ isi abụghị ịkwanye ya!
  4. N'ọnọdụ ọ bụla, ekwesịrị ịmegharị ihe owuwu ahụ site na nrịbama enwetara. A ghaghị ime mgbanwe niile naanị site na usoro mdb_put. Otú ọ dị, n'agbanyeghị otú ị chọrọ ime nke a, ọ gaghị ekwe omume, ebe ọ bụ na ebe nchekwa ebe ihe owuwu a na-esetịpụ naanị na ọnọdụ ọgụgụ.
  5. Debe faịlụ na oghere adreesị usoro maka ebumnuche, dịka ọmụmaatụ, ịbawanye ogo nchekwa kachasị site na iji ọrụ ahụ mdb_env_set_map_size na-emebi azụmahịa niile na ihe ndị metụtara ya n'ozuzu yana ntụnye aka na ụfọdụ ihe.

N'ikpeazụ, akụkụ ọzọ dị aghụghọ nke na ikpughe isi ihe ya adabaghị na paragraf ọzọ. N'isiakwụkwọ banyere osisi B, m nyere eserese nke otú e si hazie ibe ya na ebe nchekwa. Ọ na-esi na nke a na adreesị nke mmalite nke ihe nchekwa nwere data serialized nwere ike bụrụ ihe aka ike. N'ihi nke a, pointer ha natara na Ọdịdị MDB_val ma belata na pointer ka usoro ihe owuwu, ọ na-eme ka ọ bụrụ ihe na-adịghị mma n'ozuzu. N'otu oge ahụ, architectures nke ụfọdụ ibe (n'ihe banyere iOS nke a bụ armv7) chọrọ ka adreesị nke data ọ bụla bụrụ otutu nke okwu igwe ma ọ bụ, n'ikwu ya n'ụzọ ọzọ, ntakịrị nha nke usoro ahụ. maka armv7 ọ bụ 32 bits). N'ikwu ya n'ụzọ ọzọ, ọrụ dị ka *(int *foo)0x800002 na ha bụ nhata ịgbapụ na-eduga na igbu na a mkpebi EXC_ARM_DA_ALIGN. E nwere ụzọ abụọ a ga-esi gbanarị ụdị ọnọdụ ọjọọ ahụ.

Nke mbụ na-agbada ruo na mbido mbụ nke data n'ime usoro dabara adaba. Dịka ọmụmaatụ, na comparator omenala nke a ga-egosipụta dị ka ndị a.

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

Ụzọ ọzọ bụ ịgwa onye na-achịkọta ihe tupu oge eruo na ụkpụrụ isi-uru nwere ike ọ gaghị ejikọta ya. aligned(1). Na ARM ị nwere ike inwe otu mmetụta ahụ nweta na iji njirimara juru n'ọnụ. N'iburu n'uche na ọ na-enye aka ịkwalite ohere nke ihe owuwu ahụ nwere, usoro a yiri ka ọ masịrị m, ọ bụ ezie na ume na-abawanye na-eri nke data ohere ọrụ.

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

Ajuju nke oke

Iji nyochaa otu ndekọ, LMDB na-enye abstraction cursor. Ka anyị lelee otu esi arụ ọrụ na ya site na iji ihe atụ nke tebụl nwere metadata igwe ojii nke onye ọrụ maralarị anyị.

Dị ka akụkụ nke igosipụta ndepụta faịlụ na ndekọ, ọ dị mkpa ịchọta igodo niile ejikọrọ faịlụ na nchekwa nwa ya. Na nkeji ndị gara aga anyị haziri igodo NodeKey nke mere na a na-enye ha iwu site na ID nke ndekọ ndekọ aha nne na nna. Ya mere, na teknụzụ, ọrụ nke iweghachite ọdịnaya nke folda na-agbadata idowe cursor n'akụkụ elu nke otu igodo nwere prefix enyere wee ruo na ala ala.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Enwere ike ịchọta oke elu ozugbo site na nchọ usoro. Iji mee nke a, a na-edobe cursor na mmalite nke ndepụta igodo niile dị na nchekwa data wee gbasaa ruo mgbe igodo nwere njirimara nke ndekọ ndekọ ndị nne na nna pụtara n'okpuru ya. Usoro a nwere ọghọm 2 doro anya:

  1. Ihe mgbagwoju anya nchọta Linear, ọ bụ ezie na, dị ka a maara, na osisi n'ozuzu na na osisi B karịsịa, enwere ike ime ya na oge logarithmic.
  2. N'efu, a na-ebuli ibe niile dị n'ihu nke a na-achọ site na faịlụ gaa na ebe nchekwa bụ isi, nke dị oke ọnụ.

Ọ dabara nke ọma, LMDB API na-enye ụzọ dị irè isi dobe cursor na mbụ. Iji mee nke a, ịkwesịrị ịmepụta igodo nke uru ya na-erughị ma ọ bụ ha nhata na igodo dị na oke oke nke etiti oge. Dịka ọmụmaatụ, n'ihe gbasara ndepụta dị na ọnụ ọgụgụ dị n'elu, anyị nwere ike ịme igodo nke ubi ahụ parentId ga-adị nhata 2, na ndị ọzọ niile juputara na efu. A na-enye ụdị igodo ahụ emejuru akụkụ na ntinye ọrụ mdb_cursor_get na-egosi ọrụ ahụ 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);

Ọ bụrụ na a chọtara ókèala elu nke otu igodo, mgbe ahụ, anyị na-emegharị ya ruo mgbe anyị zutere ma ọ bụ igodo ahụ zutere ọzọ. parentId, ma ọ bụ igodo agaghị agwụ ma ọlị

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

Ihe dị mma bụ na dị ka akụkụ nke iteration na-eji mdb_cursor_get, anyị na-enweta ọ bụghị naanị igodo, kamakwa uru. Ọ bụrụ na, iji mezuo ọnọdụ nlele, ịkwesịrị ịlele, n'etiti ihe ndị ọzọ, mpaghara site na uru nke ndekọ ahụ, mgbe ahụ, a na-enweta ha nke ọma na-enweghị mmegharị ahụ ọzọ.

4.3. Mmekọrịta dị n'etiti tebụl

Ka ọ dị ugbu a, anyị jisiri ike tụlee akụkụ niile nke imepụta na ịrụ ọrụ na nchekwa data otu tebụl. Anyị nwere ike ịsị na tebụl bụ ihe ndekọ ahaziri ahazi nke nwere otu ụdị igodo-uru ụzọ abụọ. Ọ bụrụ n'igosi igodo dị ka akụkụ anọ yana uru ejikọta ya dị ka myikọ, ị ga-enweta eserese anya nke nchekwa data.

Na

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Otú ọ dị, n'ime ndụ n'ezie, ọ naghị esiri ike iji obere mwụfu ọbara nweta ya. Ọtụtụ mgbe na nchekwa data a na-achọrọ, nke mbụ, inwe ọtụtụ tebụl, na nke abụọ, ịme nhọrọ n'ime ha n'usoro dị iche na isi igodo. Akụkụ ikpeazụ a na-etinye aka na okwu nke okike na njikọ njikọ ha.

Tebụl index

Ngwa igwe ojii nwere ngalaba "Gallery". Ọ na-egosiputa ọdịnaya mgbasa ozi sitere na igwe ojii niile, nke ejiri ụbọchị hazie ya. Iji mejuputa nhọrọ dị otú ahụ nke ọma, na-esote tebụl isi ịkwesịrị ịmepụta nke ọzọ nwere ụdị igodo ọhụrụ. Ha ga-enwe ubi nwere ụbọchị emepụtara faịlụ ahụ, nke ga-arụ ọrụ dị ka akara nhazi mbụ. N'ihi na igodo ọhụrụ ahụ na-ezo aka na otu data dị ka igodo dị na tebụl bụ isi, a na-akpọ ha igodo ndeksi. Na foto dị n'okpuru ebe a na-eme ka ha pụta ìhè na oroma.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Iji kewaa mkpịsị ugodi nke tebụl dị iche iche n'etiti ibe ha n'ime otu nchekwa data, agbakwunyere tableId ngalaba teknụzụ na ha niile. Site n'ime ka ọ bụrụ ihe kacha mkpa maka nhazi, anyị ga-ebu ụzọ nweta nchịkọta nke igodo site na tebụl, na n'ime tebụl - dịka iwu nke anyị si dị.

Igodo ndeksi na-ezo aka na otu data dị ka igodo isi. Nmejuputa akụrụngwa a kwụ ọtọ site na ijikọ ya otu akụkụ uru nke igodo isi adịghị mma site n'ọtụtụ echiche:

  1. N'ihe gbasara oghere ewelitere, metadata nwere ike ịba ụba nke ukwuu.
  2. Site n'echiche arụmọrụ, ebe ọ bụ na mgbe ị na-emelite metadata nke ọnụ ọnụ, ị ga-eji igodo abụọ degharịa ya.
  3. Site n'echiche nke nkwado koodu, ọ bụrụ na anyị echefuru imelite data maka otu igodo, anyị ga-enweta ahụhụ na-enweghị isi nke data enweghị nkwekọrịta na nchekwa.

Ọzọ, anyị ga-atụle otú e si ewepụ adịghị ike ndị a.

Ịhazi mmekọrịta n'etiti tebụl

Ụkpụrụ ahụ dabara nke ọma maka ijikọ tebụl index na tebụl isi "igodo dị ka uru". Dị ka aha ya na-egosi, akụkụ uru nke ndekọ index bụ nnomi nke isi uru isi. Ụzọ a na-ewepụ adịghị ike niile a kpọtụrụ aha n'elu metụtara ịchekwa otu akụkụ uru nke ndekọ mbụ. Naanị ọnụ ahịa bụ na iji nweta uru site na igodo ndeksi, ịkwesịrị ịme ajụjụ 2 na nchekwa data kama ịbụ otu. N'usoro, atụmatụ nchekwa data pụta dị ka nke a.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Usoro ọzọ maka ịhazi mmekọrịta n'etiti tebụl bụ "Igodo eji eme ihe". Ihe kachasị mkpa bụ ịgbakwunye njirimara ndị ọzọ na igodo ahụ, nke a na-achọghị maka nhazi, kama maka ịmegharị igodo jikọtara ya na Mail.ru Cloud ngwa enwere ezigbo ihe atụ nke iji ya, Otú ọ dị, iji zere ịdaba miri emi n'ime ya. Ọnọdụ nke usoro iOS akọwapụtara, m ga-enye akụkọ ifo, mana ọmụmaatụ doro anya

Ndị ahịa mkpanaka igwe ojii nwere ibe na-egosiputa faịlụ na nchekwa niile onye ọrụ kesara ndị ọzọ. Ebe ọ bụ na faịlụ ndị dị otú ahụ dị ole na ole, na e nwere ọtụtụ ụdị dị iche iche nke ozi akọwapụtara gbasara mgbasa ozi metụtara ha (onye enyere ohere, ya na ikike ndị, wdg), ọ gaghị abụ ihe ezi uche dị na ya ibu akụkụ bara uru nke ndekọ na isi tebụl na ya. Agbanyeghị, ọ bụrụ na ịchọrọ igosipụta faịlụ ndị ahụ na-anọghị n'ịntanetị, ị ka ga-echekwa ya ebe. Ihe ngwọta okike bụ ịmepụta tebụl dị iche iche maka ya. N'ime eserese dị n'okpuru, a na-etinye igodo ya na "P", ma jiri uru bara uru karịa "ozi ọha" dochie onye na-edebe "propname".

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

A na-etinye metadata niile pụrụ iche, n'ihi ịchekwa tebụl ọhụrụ ahụ, n'akụkụ uru nke ndekọ ahụ. N'otu oge ahụ, ịchọghị ịmegharị data gbasara faịlụ na nchekwa echekwara na tebụl isi. Kama, a na-agbakwunye data na-abaghị uru na igodo "P" n'ụdị nke "NJ ọnụ" na "timestamp". Ekele dịrị ha, ị nwere ike rụọ igodo ndeksi, nke ị nwere ike nweta igodo isi, nke, n'ikpeazụ, ị nwere ike nweta metadata node.

Mmechi

Anyị na-enyocha nsonaazụ nke mmejuputa LMDB nke ọma. Mgbe nke ahụ gasịrị, ọnụ ọgụgụ nke ngwa na-ebelata 30%.

Ihe na-egbuke egbuke na ịda ogbenye nke isi-uru nchekwa data LMDB na ngwa iOS

Nsonaazụ nke ọrụ mere resoned karịrị iOS otu. Ugbu a, otu n'ime ngalaba "Files" bụ isi na ngwa gam akporo agbanyela iji LMDB, akụkụ ndị ọzọ na-aga. Asụsụ C, nke etinyere ụlọ ahịa igodo-ọnụ ahịa, bụ ezigbo enyemaka iji mepụta usoro ngwa n'okirikiri ya na C++. Eji koodu generator jikọọ ụlọ akwụkwọ C++ nke pụtara na koodu ikpo okwu na Objective-C na Kotlin. Djinni site na Dropbox, mana nke ahụ bụ akụkọ dị iche kpamkpam.

isi: www.habr.com

Tinye a comment