Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

I le tautoulu o le 2019, na tupu ai se mea ua leva ona faʻatali i le Mail.ru Cloud iOS team. O le fa'amaumauga autu mo le teuina faifaipea o le tulaga o talosaga ua avea ma tulaga ese mo le lalolagi feavea'i Uila Memory-Mapped Database (LMDB). I lalo o le tipi, e valaʻaulia lou mafaufau i lana iloiloga auiliili i vaega e fa. Muamua, seʻi o tatou talanoa e uiga i mafuaʻaga o se filifiliga e le taua ma faigata. Ona tatou agai atu lea i le iloiloga o tafola e tolu i le fatu o le fausaga o le LMDB: faila e manatua-faafanua, B + laau, kopi-i-tusi auala mo le faʻatinoina o fefaʻatauaiga ma multiversioning. Mulimuli ane, mo le suamalie - o le vaega aoga. I totonu, o le a tatou vaʻavaʻai pe faʻapefea ona mamanuina ma faʻatinoina se faʻavae faʻavae ma le tele o laulau, e aofia ai se faasino igoa, i luga o le API-taua maualalo maualalo.​

Mataupu

  1. Fa'atinoga Fa'anaunauga
  2. Tulaga LMDB
  3. Tafola e tolu LMDB
    3.1. Tafola #1. Fa'amau-fa'afanua faila
    3.2. Tafola #2. B+-laau
    3.3. Tafola #3. kopi-i-tusi
  4. Fuafuaina o se fa'asologa o fa'amaumauga i luga o le ki-value API
    4.1. Fa'amatalaga fa'avae
    4.2. Fa'ata'ita'iga o laulau
    4.3. Fa'ata'ita'iga so'otaga i le va o laulau

1. Fa'atinoga fa'anaunauga

E fa'atasi i le tausaga, i le 2015, matou te tausia le faia o se metric, pe fa'afia ona tuai le fa'aoga o la matou talosaga. E le na ona matou faia lenei mea. E tele a matou faitioga e uiga i le mea moni o nisi taimi e le toe tali atu le talosaga i gaioiga a tagata faʻaoga: e le oomiina faʻamau, lisi e le taʻavale, ma isi. E uiga i le masini o fua ta'u atu i luga o AvitoTech, o lea ou te tuʻuina atu naʻo le faasologa o numera.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O taunuuga o fua na avea ma vai malulu mo i matou. Na aliali mai o faʻafitauli e mafua mai i le malulu e sili atu nai lo isi. Afai, aʻo leʻi iloa lenei mea moni, o le faʻamatalaga faʻapitoa faʻapitoa o le lelei sa leai se faʻalavelave, ona maeʻa lea o le taulaʻi fesuia'i i luga ole aisa saoloto.

Ua fausia dashboard ma fa'a'aisa ma ua uma ona faaalu quantitative и uiga lelei auʻiliʻiliga o latou mafuaʻaga, na manino ai le fili autu - mamafa faʻatatau pisinisi faʻatinoina i le filo autu o le talosaga. O se tali masani i lenei faalumaina o se naunautaiga malosi e tulei i totonu o galuega. Mo se fofo faʻapitoa o lenei faʻafitauli, na matou faʻaogaina se fausaga faʻapipiʻi tele e faʻavae i luga o tagata mama. Sa ou tuuto atu ana fetuunaiga mo le lalolagi iOS lua filo i le twitter tu'ufa'atasi ma tala i Habré. I le avea ai o se vaega o le tala o loʻo i ai nei, ou te manaʻo e faʻamamafa vaega na o le faʻaiuga na aʻafia ai le filifiliga o le database.​

O le faʻataʻitaʻiga faʻataʻitaʻiga o le faʻalapotopotoga faʻapitoa e manatu o le multithreading e avea ma ona uiga lona lua. O mea fa'ata'ita'i o lo'o i ai e pei o le sopoia o tuaoi o filo. Ma latou te le faia lenei mea i nisi taimi ma i nisi o nofoaga, ae toetoe lava o taimi uma ma soo se mea.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O le database o se tasi o vaega maatulimanu i le ata o loʻo tuʻuina atu. O lana galuega autu o le faʻatinoina o se mamanu macro Fa'asoa Fa'amaumauga. Afai i le lalolagi atinaʻe e faʻaaogaina e faʻapipiʻi faʻamaumauga faʻamaumauga i le va o auaunaga, ona i ai lea i le tulaga o se tagata faʻataʻitaʻiga, faʻamaumauga i le va o filo. O le mea lea, matou te manaʻomia se faʻamaumauga faʻamaumauga, o loʻo galulue ai i totonu o se siʻosiʻomaga tele-filo e le mafua ai ni faʻafitauli laiti. Aemaise lava, o lona uiga o mea e maua mai ai e tatau ona le itiiti ifo i le filo-saogalemu, ma e sili ona le mafai ona suia. E pei ona e iloa, o le mea mulimuli e mafai ona faʻaaogaina i le taimi e tasi mai le tele o filo e aunoa ma le faʻaogaina o soʻo se ituaiga loka, lea ei ai se aoga aoga i le faʻatinoga.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosagaO le mea taua lona lua na a'afia ai le filifiliga o le fa'amaumauga o la matou ao API. Na musuia e le git approach to synchronization. E pei o ia sa matou taulai i ai tuimotu muamua API, lea e foliga sili atu nai lo le talafeagai mo tagata fa'atau ao. Na fa'apea e na'o le tasi le taimi latou te pamuina ai le tulaga atoa o le ao, ona fa'atasi ai lea i le tele o mataupu o le a tupu e ala i suiga ta'avale. Ae paga lea, o lenei avanoa e naʻo le sone faʻataʻitaʻiga, ma i le faʻataʻitaʻiga, e leʻi aʻoaʻoina e tagata faʻatau le auala e galue ai ma patches. O loʻo i ai le tele o mafuaʻaga faʻamoemoe mo lenei, lea, ina ia aua neʻi faʻatuai le folasaga, o le a tatou o ese mai puipui. O le taimi nei e sili atu le manaia o faʻamatalaga aʻoaʻoga o le lesona e uiga i le mea e tupu pe a fai mai le API "A" ae leʻi fai mai le tagata faʻatau "B".

O lea la, afai e te mafaufau i le git, lea, pe a faʻatinoina se toso faʻatonuga, nai lo le faʻaogaina o patches i se ata faʻapitonuʻu, faʻatusatusa lona tulaga atoa ma le server atoa, ona e maua ai lea o se manatu saʻo lelei o le faʻaogaina. e tupu ile ao fa'atau. E faigofie ona mateina mo lona faʻatinoga e manaʻomia le tuʻufaʻatasia o laʻau DOM e lua i le manatua ma meta-faʻamatalaga e uiga i faila uma ma faila i le lotoifale. E aliali mai afai e teuina e se tagata faʻaoga le 500 afe faila i le ao, ona faʻafetaui lea, e tatau ona toe faʻaleleia ma faʻaumatia ni laau se lua ma le 1 miliona nodes. Ae o node ta'itasi o se fa'apotopotoga o lo'o i ai se kalafi o mata'upu. I lenei tulaga, na fa'amoemoeina le fa'ai'uga o fa'amatalaga. Na aliali mai e tusa lava pe aunoa ma le amanaʻiaina o le tuʻufaʻatasia algorithm, o le faiga tonu lava o le fatuina ma le faʻaumatiaina o se numera tele o mea laiti e tau ai se penny manaia. o fa'amaumauga a tagata fa'aoga. O le iʻuga, matou te faʻapipiʻiina le tulaga taua lona lua i le filifilia o se faʻamaumauga - o le mafai ona faʻatinoina galuega a le CRUD e aunoa ma le faʻaogaina o mea.

O isi mana'oga e sili atu ona masani, ma o latou lisi atoa e fa'apea.

  1. Saogalemu o filo.
  2. Fa'atosinaga. Faʻatonuina e le manaʻo e faʻaoga le faʻamatalaga faʻamaumauga tutusa e faʻafetaui ai le setete e le gata i le va o filo, ae faʻapea foi i le va o le talosaga autu ma iOS faʻaopoopoga.
  3. Le mafai ona fa'atusalia fa'alapotopotoga teuina e pei o mea e le mafai ona suia
  4. Leai o fa'asoa fa'apitoa i totonu o galuega a le CRUD.
  5. Lagolago Fefa'atauaiga mo Meatotino Autu ACIDUpu autu: atomicity, tumau, tu'ufua ma fa'amaoni.
  6. Saosaoa i mataupu sili ona lauiloa.

Faatasi ai ma lenei seti o manaʻoga, SQLite sa ma o se filifiliga lelei. Ae ui i lea, o se vaega o le suʻesuʻeina o isi mea, na ou tau ai i se tusi "Amataina ile LevelDB". I lalo o lana taʻitaʻiga, na tusia ai se faʻailoga e faʻatusatusa ai le saoasaoa o galuega ma faʻamaumauga eseese i faʻaaliga moni ao. O le taunuuga na sili atu nai lo faamoemoega sili ona leaga. I luga o mataupu sili ona lauiloa - maua se faʻailoga i luga o se lisi faʻavasegaina o faila uma ma se lisi faʻavasegaina o faila uma mo se lisi tuʻuina atu - LMDB na faʻaalia e 10 taimi sili atu nai lo SQLite. Na manino le filifiliga.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

2. LMDB Tulaga

O le LMDB o se faletusi, la'ititi (na'o le 10K laina) o lo'o fa'atinoina le vaega pito i lalo o fa'amaumauga - teuina.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O le ata o loʻo i luga o loʻo faʻaalia ai o le faʻatusatusaina o le LMDB ma le SQLite, lea e faʻaaogaina ai tulaga maualuga, e masani lava e le sili atu le saʻo nai lo le SQLite ma le Core Data. O le a sili atu ona talafeagai le taʻua o masini teuina tutusa e pei o tauva tutusa - BerkeleyDB, LevelDB, Sophia, RocksDB, ma isi. E oʻo lava i atinaʻe o loʻo galue ai le LMDB o se mea e teu ai masini mo SQLite. Le fa'ata'ita'iga muamua fa'apea i le 2012 faaalu tusitala LMDB Howard Chu. Iʻuga na foliga mai e matua fa'afiafiaina lava o lana taumafaiga na pikiina e le au fiafia o le OSS, ma maua ai lona fa'aauau i le feagai ai ma le LumoSQL. Ia Ianuari 2020 o le tusitala o lenei poloketi o Den Shearer tuuina atu i luga ole LinuxConfAu.

Ole fa'aoga autu ole LMDB ose afi mo fa'amaumauga o talosaga. E nofo aitalafu le faletusi i le au atiaʻe OpenLDAP, oe na matua le fiafia i BerkeleyDB o le faavae o la latou poloketi. Tu'i ese mai le faletusi faatauvaa blaau, Na mafai e Howard Chu ona fatuina se tasi o filifiliga sili ona lauiloa o tatou taimi. Na ia tuʻuina atu lana lipoti sili ona manaia i lenei tala, faʻapea foʻi ma le fausaga i totonu ole LMDB "O le Uila Memory-map Database". Leonid Yuriev (aka yleo) mai Positive Technologies i lana lauga i le Highload 2015 "O le LMDB engine o se siamupini faapitoa". I totonu, o loʻo ia talanoa e uiga i le LMDB i le tulaga o se galuega tutusa o le faʻatinoina o le ReOpenLDAP, ma LevelDB ua uma ona tuʻuina atu i faitioga faʻatusatusa. O se taunuuga o le faʻatinoga, Positive Technologies na oʻo lava ina maua se tui faʻatupuina malosi MDBX fa'atasi ai ma foliga sili ona manaia, fa'ata'ita'iga ma fa'aleleia o bug.

LMDB e masani ona faʻaaogaina e pei o le teuina. Mo se faʻataʻitaʻiga, o le Mozilla Firefox browser filifili mo le tele o manaʻoga, ma, amata mai le version 9, Xcode sili lona SQLite e teu ai fa'asino igoa.

O le afi foi na maua i le lalolagi o le atinaʻe feaveaʻi. Fa'ailoga o lona fa'aogaina e mafai ia maua i le iOS client mo Telegram. LinkedIn na alu i le laasaga e tasi ma filifilia le LMDB e avea ma mea e teu ai mo lona fale faʻapipiʻi faʻamaumauga faʻamaumauga, Rocket Data, e uiga i ai. ta'u atu i se tusiga i le 2016.

LMDB o loʻo tauivi ma le manuia mo se nofoaga i le la i le niche na tuʻua e BerkeleyDB ina ua maeʻa le suiga i lalo o le pule a Oracle. E alofagia le faletusi mo lona saoasaoa ma le faʻamaoni, e tusa lava pe faʻatusatusa i lona lava ituaiga. E pei ona e iloa, e leai ni taumafataga o le aoauli e leai se totogi, ma ou te manaʻo e faʻamamafa le fefaʻatauaʻiga e tatau ona e feagai pe a filifili i le va o LMDB ma SQLite. O le ata o loʻo i luga o loʻo faʻaalia manino ai le auala e ausia ai le saoasaoa faʻateleina. Muamua, matou te le totogia mo faʻaopoopoga faʻapipiʻi faʻapipiʻi i luga o le teuina o tisiki. O le mea moni, i se fausaga lelei, e le mafai lava ona e faia e aunoa ma i latou, ma o le a mautinoa lava o le a aliali mai i le numera o talosaga, ae o le a sili atu ona manifinifi. O le a leai ni a latou foliga e le manaʻomia e se faʻaoga faʻapitoa, mo se faʻataʻitaʻiga, lagolago mo fesili ile gagana SQL. Lona lua, e mafai ona fa'atinoina lelei le fa'afanua o fa'atinoga o talosaga i talosaga mo le teuina o tisiki. Afai SQLite i la’u galuega e sau mai le averesi mana'oga o se averesi talosaga, ona o oe, i le avea ai ma se tagata e fa'atupuina talosaga, e te silafia lelei fa'aaliga autu o uta. Mo se fofo sili atu ona aoga, e tatau ona e totogia se tau si'itia mo le atina'eina o le fofo muamua ma lona lagolago mulimuli ane.

3. Tafola e tolu LMDB

A mae'a ona va'ai i le LMDB mai le mata o le manulele, ua o'o i le taimi e fa'aloloto ai. O isi vaega e tolu o le a tuʻuina atu i le auiliiliga o tafola autu o loʻo i ai le fale teu oloa:

  1. O faila fa'amaufa'ailoga e fai ma masini mo le galue ma le tisiki ma fa'amaopoopo fa'amaumauga i totonu.
  2. B + -laau e avea o se faʻalapotopotoga o faʻamaumauga faʻamaumauga teuina.
  3. Kopi-i-tusi e avea o se auala e tuʻuina atu ACID meatotino fefaʻatauaʻiga ma multiversioning.

3.1. Tafola #1. Fa'amau-fa'afanua faila

O faila fa'amaufa'ailogaina o se elemene taua tele fa'atusa e fa'aalia i le igoa o le fale teu oloa. O fa'afitauli o le fa'asaoina ma le fa'amaopoopoina o le avanoa i fa'amatalaga teuina o lo'o i lalo uma o le fa'atonuga a le faiga fa'aoga. LMDB e le o iai ni fa'ailoga i totonu lava ia. O se filifiliga atamai lenei a le tusitala, talu ai o le faitau saʻo o faʻamatalaga mai faila faʻafanua e mafai ai ona e tipiina le tele o tulimanu i le faʻatinoga o le afi. O loʻo i lalo se mamao mai le lisi atoa o nisi o latou.

  1. O le tausisia o le tumau o faʻamaumauga i totonu o le teuina pe a galulue faʻatasi mai le tele o faiga e avea ma matafaioi a le faiga faʻaogaina. I le isi vaega, o lenei enisinia o loʻo talanoaina auiliili ma faʻatasi ma ata.
  2. O le leai o ni fa'amaufa'ailoga e fa'amāmā atoatoa ai le LMDB o le fa'aulu e feso'ota'i ma fa'asoa fa'amalosi. Faitau faʻamatalaga i le faʻataʻitaʻiga o le setiina o le faʻailoga i le tuatusi saʻo i le mafaufau faʻapitoa ma leai se isi mea. E foliga mai o se mafaufauga, ae i totonu o le fale teu oloa, o valaau calloc uma o loʻo faʻatumauina i le faʻatulagaina o galuega.
  3. O le leai o ni caches o lona uiga o le leai o ni loka e fesoʻotaʻi ma le faʻamaopoopoina e maua ai. O le aufaitau, lea e mafai ona i ai se numera faʻapitoa i le taimi e tasi, e le faʻafeiloaʻi se tasi mutex i luga o latou ala i faʻamatalaga. Ona o lenei mea, o le saoasaoa faitau o loʻo i ai se faʻaogaina laina lelei i tulaga o le numera o PPU. I le LMDB, na'o le fa'aogaina o gaioiga e fa'amaopoopo. E mafai ona tasi le tusitala i le taimi.
  4. Ole la'ititi ole caching ma le synchronization logic e fa'asaoina ai le code mai se fa'alavelave lavelave o mea sese e feso'ota'i ma le galue i se si'osi'omaga tele filo. E lua suʻesuʻega faʻamaumauga mataʻina i le Usenix OSDI 2014 conference: "E Le'o Fausia Faiga Tutusa Faiga Uma: I luga ole lavelave o le Fausiaina o Talosaga Fa'asa'o" и Fa'aleaga Fa'amaumauga mo Fa'afiafiaga ma Tupe Maua. Mai ia i latou e mafai ona e mauaina faʻamatalaga e uiga i le faʻatuatuaina le mafaatusalia o le LMDB, ma le toetoe lava a le atoatoa le faʻatinoina o meatotino ACID o fefaʻatauaiga, lea e sili atu i le SQLite tutusa.
  5. Ole laʻititi ole LMDB e faʻatagaina ai le faʻatusaina o masini o lona code e tuʻu atoa i le L1 cache o le gaioiga faʻatasi ai ma uiga saoasaoa.

O le mea e leaga ai, i iOS, o faila fa'amaufa'ailoga e le pei o le rosy e pei ona tatou mana'o ai. Ina ia talanoa e uiga i le le lelei o loʻo fesoʻotaʻi ma i latou ma le malamalama atili, e tatau ona manatua mataupu faavae lautele mo le faʻatinoina o lenei masini i faiga faʻaoga.

Fa'amatalaga lautele e uiga i faila fa'amaufa'ailoga

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosagaFa'atasi ai ma talosaga fa'atino ta'itasi, e fa'afeso'ota'i e le faiga fa'agaioiga se fa'alapotopotoga e ta'ua o se faiga. O fa'agasologa ta'itasi o lo'o tu'ufa'atasia se fa'asologa o tuatusi, lea e tu'u ai mea uma e mana'omia e galue ai. O tuatusi pito i lalo o lo'o i ai vaega o lo'o iai fa'amaumauga ma fa'amaumauga ma punaoa. E soso'o mai ai le poloka fa'atula'i a'e o avanoa fa'afeso'ota'i malosi, e ta'uta'ua e i matou o le fa'aputuga. O lo'o i ai tuatusi o fa'alapotopotoga o lo'o fa'aalia i le taimi o le polokalama. I le pito i luga o le vaega o le manatua o loʻo faʻaaogaina e le faʻapipiʻi talosaga. E tupu pe faʻaitiitia, i se isi faaupuga, o lona lapoʻa e iai foʻi se natura malosi. Ina ia aua ne'i una'i ma fa'alavelave le fa'aputuga ma le fa'aputuga o le tasi i le isi, e tu'u 'ese'ese i tu'uga 'ese'ese o le avanoa o le tuatusi, o lo'o i ai se pu i le va o vaega malosi e lua i le pito i luga ma lalo. O tuatusi i totonu o lenei vaega ogatotonu o loʻo faʻaogaina e le faiga faʻaogaina e faʻafesoʻotaʻi ma se faʻagasologa o faʻalapotopotoga eseese. Aemaise lava, e mafai ona faʻafanua se seti faʻaauau o tuatusi i se faila i luga o le disk. O sea faila e taʻua o se faila e manatua-faafanua.​

Ole avanoa ole tuatusi e fa'asoa mo se fa'agasologa e tele. I le talitonuga, o le numera o tuatusi e faʻatapulaʻa naʻo le tele o le faʻailoga, lea e faʻamoemoeina i le bitness o le faiga. Afai e tuʻuina atu le mafaufau faʻaletino i le 1-in-1, o le faagasologa muamua o le a faʻaumatia atoa le RAM, ma e leai se fesiligia o soʻo se multitasking.​

Ae ui i lea, matou te iloa mai le poto masani o faiga faʻaonaponei e mafai ona faʻatautaia le tele o faiga e te manaʻo ai i le taimi e tasi. E mafai lenei mea ona o le mea moni latou te tuʻuina atu le tele o manatuaga i faiga naʻo luga o pepa, ae o le mea moni latou te utaina i totonu o le mafaufau faʻaletino naʻo le vaega o loʻo manaʻomia iinei ma le taimi nei. O le mea lea, o le manatua e fesoʻotaʻi ma le faagasologa e taʻua o le virtual.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O le faiga faʻaogaina e faʻapipiʻi ai mafaufauga faʻapitoa ma faʻaletino i itulau o se lapopoa. O le taimi lava e manaʻomia ai se itulau patino o mafaufauga faʻapitoa, o le faiga faʻaogaina e utaina i le mafaufau faaletino ma tuʻu i lalo se fesoʻotaʻiga i le va oi latou i se laulau faʻapitoa. Afai e leai ni avanoa avanoa, ona kopiina lea o se tasi o itulau muamua na utaina i le disk, ma o le mea na talosagaina e suitulaga. O lenei faiga, lea o le a tatou toe foʻi i ai i se taimi lata mai, e taʻua o le suitulaga. O le ata o loʻo i lalo o loʻo faʻaalia ai le faagasologa o loʻo faʻamatalaina. I luga, o le itulau A ma le tuatusi 0 na utaina ma tuu i luga o le itulau autu manatua ma le tuatusi 4. O lenei mea moni na atagia i le laulau o fesoʻotaʻiga i le numera cell 0.​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Faatasi ai ma faila e manatua-faafanua, o le tala e tutusa lelei lava. O le mea moni, o loʻo faʻapea e faʻaauau pea ma tuʻuina atoa i totonu o le tuatusi tuatusi avanoa. Ae ui i lea, latou te oʻo i le itulau manatua faaletino i le itulau ma naʻo le manaʻomia. O suiga o ia itulau e fa'amaopoopoina ma le faila i luga o le disk. O le mea lea, e mafai ona e faia le faila I / O, naʻo le galue ma bytes i le mafaufau - o suiga uma o le a otometi lava ona faʻafeiloaʻi e le kernel system operating system i le faila muamua.​
Le
O le ata o loʻo i lalo o loʻo faʻaalia ai le faʻaogaina e le LMDB lona tulaga pe a galue ma le database mai faiga eseese. E ala i le fa'atulagaina o mafaufauga fa'apitoa o faiga eseese i luga o le faila lava e tasi, matou te fa'atonuina le faiga fa'agaoioiga e fa'agasolo fa'atasi nisi poloka o latou tuatusi avanoa i le tasi ma le isi, lea e foliga mai ai le LMDB.​
Le

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O se mea taua o le LMDB e suia le faila o faʻamatalaga e ala i le faʻaogaina o le faiga o le telefoni, ma o le faila lava ia e faʻaalia i le faitau-naʻo le faiga. O lenei faiga e lua ona uiga taua.

O le taunuuga muamua e taatele i faiga faʻaoga uma. O lona uiga o le faʻaopoopoina o puipuiga mai le faʻaleagaina faʻafuaseʻi i le database e ala ile faʻailoga sese. E pei ona e silafia, o fa'atonuga fa'atinoina o se fa'agasologa e leai se totogi e maua ai fa'amatalaga mai so'o se mea i lona avanoa tuatusi. I le taimi lava e tasi, e pei ona matou manatua, o le faʻaalia o se faila i le faitau-tusi o lona uiga o soʻo se faʻatonuga e mafai foi ona faʻaopoopoina. Afai na te faia lenei mea i se mea sese, taumafai, mo se faʻataʻitaʻiga, e sui moni se elemene elemene i se faʻailoga e le o iai, o le auala lea e mafai ai ona ia faʻafuaseʻi ona suia le faila o loʻo faʻafanua i lenei tuatusi, lea o le a taʻitaʻia ai le faʻaogaina o faʻamaumauga. Afai o le faila o loʻo faʻaalia i le faitau-naʻo le mode, ona taumafai lea e sui le avanoa o le tuatusi e fetaui ma ia o le a taʻitaʻia ai le faʻalavelave o le polokalame ma le faailo. SIGSEGV, ma o le a tumau pea le faila.

O le taunuuga lona lua ua faʻapitoa i iOS. E le o taʻua manino mai e le tusitala poʻo soʻo se isi lava punaoa, ae a aunoa ma lea, LMDB o le a le talafeagai mo le faʻaogaina i luga o lenei masini feaveaʻi. O le isi vaega o loʻo tuʻuina atu i lona iloiloga.

Fa'amatalaga o faila fa'amaufa'ailoga i le iOS

I le 2018, sa i ai se lipoti matagofie i le WWDC iOS Memory Deep Dive. O loʻo taʻu mai ai i iOS itulau uma o loʻo i totonu o le mafaufau faaletino o se tasi o ituaiga e 3: palapala, faʻapipiʻi ma mama.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O manatua mama o se aofa'iga o itulau e mafai ona fesuia'i ma le saogalemu mai le manatua fa'aletino. O fa'amaumauga o lo'o iai e mafai ona toe fa'ae'e mai a latou fa'apogai muamua pe a mana'omia. O faila faitau na'o manatua-fa'afanua e pa'ū i totonu o lenei vaega. E le fefe iOS e ave'ese itulau o lo'o fa'afanua i se faila mai le manatua i so'o se taimi, talu ai e fa'amautinoa e fa'atasi ma le faila i luga o le disk.
Le
O itulau uma ua suia e o'o atu i le manatua palapala, tusa lava po'o fea o lo'o i ai muamua. Aemaise lava, o faila faʻamaufaʻailogaina ua suia e ala i le tusitusi i le mafaufau faʻapitoa e fesoʻotaʻi ma i latou o le a faʻavasegaina foi i lenei auala. Tatala LMDB ma fu'a MDB_WRITEMAP, pe a uma ona fai suiga i ai, e mafai ona e vaai mo oe lava.​

O le taimi lava e amata ai ona tele naua mafaufauga faaletino o se talosaga, e faʻapipiʻi e iOS ona itulau palapala. O le aoina o manatua o loʻo nofoia e itulau palapala ma faʻapipiʻi o le mea lea e taʻua o le manatua o tulagavae o le talosaga. A oʻo i se tulaga faʻapitoa, o le OOM killer system daemon e sau pe a maeʻa le faʻagasologa ma faʻaumatia faʻamalosi. O le tulaga ese lea o iOS pe a faʻatusatusa i faiga faʻaoga komepiuta. I se fa'atusatusaga, o le fa'aitiitia o tulagavae manatua e ala i le fesuia'iina o itulau mai le manatua fa'aletino i le tisiki e le'o tu'uina mai ile iOS. Masalo o le faʻagasologa mo le faʻanofoina o itulau i le tisiki ma tua e tele naua le malosi mo masini feaveaʻi, pe faʻasaoina e iOS le punaoa o le toe tusiaina o sela i luga o SSD, pe atonu foi e leʻi faamalieina le au mamanu i le faʻatinoga atoa o le faiga, lea o loʻo i ai mea uma. fesuia'i pea. Po o le a lava le tulaga, e tumau pea le mea moni.

O le tala lelei, ua uma ona taʻua muamua, o le LMDB e le faʻaogaina le mmap mechanism e faʻafouina faila e ala i le faaletonu. E mulimuli mai o faʻamatalaga tuʻuina atu o loʻo faʻavasegaina o se manatua mama e iOS ma e le fesoasoani i le tulagavae manatua. E mafai ona faʻamaonia lenei mea e faʻaaoga ai le meafaigaluega Xcode e taʻua VM Tracker. O le faʻamalama o loʻo i lalo o loʻo faʻaalia ai le tulaga o le mafaufau o le iOS Cloud application i le taimi o le gaioiga. I le amataga, 2 LMDB faʻataʻitaʻiga na amataina i totonu. O le mea muamua na faʻatagaina e faʻafanua lana faila i le 1GiB o mafaufauga faʻapitoa, o le lona lua - 512MiB. E ui lava i le mea moni e faapea o faleoloa uma e lua o loʻo i ai se aofaʻi o manatuaga nofomau, e leai se tasi oi latou e saofagā i le palapala palapala.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Ua oo nei i le taimi mo le tala leaga. Fa'afetai i le swap mechanism i le 64-bit desktop operating system, e mafai e fa'agaioiga ta'itasi ona fa'aogaina le tele o avanoa tuatusi faakomepiuta e pei o le avanoa avanoa i luga o le hard disk e mafai ai ona fesuia'i. Suia le swap i le faʻamalosi i iOS e matua faʻaitiitia ai le maualuga maualuga. O le taimi nei o gaioiga uma e tatau ona fetaui i totonu o le mafaufau autu (faitau RAM), ma o mea uma e le fetaui e mafai ona faʻamutaina faʻamalosi. Ua ta'ua e pei ona taua i luga lipoti, ma i totonu pepa aloaia. O se taunuuga, iOS matua faʻatapulaʻaina le aofaʻi o manatua e avanoa mo le faʻasoa e ala i mmap. O iinei iinei e mafai ona e vaʻavaʻai i tapulaʻa faʻapitoa i luga o le aofaʻi o le manatua e mafai ona tuʻuina i luga o masini eseese e faʻaaoga ai lenei telefoni. I luga o faʻataʻitaʻiga sili ona faʻaonaponei o smartphones, ua avea iOS ma limafoai i le 2 gigabytes, ma luga o le pito i luga o le iPad - e 4. I le faʻatinoga, ioe, e tatau ona e taulaʻi atu i faʻataʻitaʻiga masini lagolago laiti, lea e matua faanoanoa ai mea uma. E sili atu le leaga, o le vaʻavaʻai i le tulaga manatua o le talosaga i le VM Tracker, o le ae iloa ai o le LMDB e mamao ese mai le mea e tasi o loʻo taʻu mai le manatua-faʻamaufaʻailoga. O pusi lelei e 'aina e tagata faʻapipiʻi faiga, faila o punaoa, faʻatulagaga o ata, ma isi mea faʻatau laiti.

O se taunuuga o faʻataʻitaʻiga i luga o le Ao, na matou maua mai ai faʻamautuga taua o le manatua na tuʻuina atu e le LMDB: 384 megabytes mo masini 32-bit ma 768 mo 64-bit mea. A mae'a ona fa'aoga le voluma, so'o se suiga e amata ona fa'amae'a i le code MDB_MAP_FULL. Matou te matauina ia mea sese i la matou mataituina, ae e laititi lava e le amanaiaina i lenei tulaga.

O se mafuaʻaga e le o manino mo le faʻaaogaina tele o mafaufauga e ala i le teuina e mafai ona avea ma fefaʻatauaiga umi. Ina ia malamalama pe faapefea ona fesootaʻi nei mea mataʻina e lua, o le a fesoasoani iā ​​i tatou e mafaufau i tafola e lua o loo totoe o le LMDB.

3.2. Tafola #2. B+-laau

Ina ia faʻataʻitaʻiina laulau i luga o se faleoloa tau-taua, o gaioiga nei e tatau ona iai i lana API:

  1. Fa'aofiina o se elemene fou.
  2. Su'e se elemene o lo'o iai se ki.
  3. Aveese se elemene.
  4. Toe fai i luga ole va'aiga autu ile latou fa'asologa.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosagaOle fausaga fa'amaumauga sili ona faigofie e faigofie ona fa'atinoina uma fa'agaioiga ole la'au su'esu'e binary. O ona pona ta'itasi o se ki e vaelua ai le vaega atoa o ki tamaiti i ni la'au laiti se lua. I le agavale o lo'o i ai mea e la'ititi nai lo le matua, ma i le itu taumatau - o mea e lapopoa. O le mauaina o se seti fa'atonu o ki e maua e ala i se tasi o la'au fa'ata'amilosaga masani

O la'au binary e lua fa'aletonu fa'avae e taofia ai i latou mai le aoga e avea ma fa'amaumauga fa'amaumauga tisiki. Muamua, o le maualuga o lo latou paleni e le mafaamatalaina. O loʻo i ai se tulaga lamatia tele o le mauaina o laʻau lea e mafai ona fesuisuiaʻi tele le maualuga o lala eseese, lea e matua faʻaleagaina ai le faʻalavelave algorithmic o le sailiga faʻatusatusa i le mea o loʻo faʻamoemoeina. Lona lua, o le tele o feso'ota'iga i le va o pona e fa'ate'aina ai la'au binary i le mea e manatua. O se taunuuga, e oo lava i se savaliga faigofie o nisi pona tuaoi i totonu o se laau e ono manaʻomia le asiasi i se numera tutusa o itulau. O se faʻafitauli lea e tusa lava pe tatou te talanoa e uiga i le aoga o laʻau binary e avea o se faʻamaumauga faʻamaumauga i totonu, talu ai e le taugofie le fesuiaʻiina o itulau i totonu o le cache processor. A o'o i le si'isi'i so'o o itulau e feso'ota'i pona mai le tisiki, e matua leaga lava mea. fa'anoanoa.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosagaB-laau, o se evolusione o laau binary, foia faafitauli na faailoa mai i le parakalafa muamua. Muamua, latou te faapaleni le tagata lava ia. Lona lua, o latou pona ta'itasi e vaevaeina le seti o ki tamaiti e le o le 2, ae i totonu o M fa'atonu vaega laiti, ma o le numera M e mafai ona tele, i luga o le fa'atonuga o le selau po'o le afe.

O lea:

  1. O node ta'itasi e iai le aofa'i tele o ki ua uma ona fa'atonu ma e matua'i maualalo lava la'au.
  2. E maua e le laau le meatotino o le nofoaga i le manatua, talu ai o ki e latalata i le tau e masani lava ona tu i tafatafa o le tasi ma le isi i luga o le tasi poʻo tuaoi tuaoi.
  3. Fa'aiti'itia le aofa'i o nodes fe'avea'i pe a alu ifo ile la'au ile taimi ole su'esu'ega.
  4. Fa'aiti'itia le aofa'i o nodes taula'i e faitau mo fesili fa'avasega, talu ai o lo'o iai i latou ta'itasi se numera tele o ki fa'atonu.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O lo'o fa'aogaina e le LMDB se fesuiaiga o le B-la'au e ta'ua o le B+ laau e teu ai fa'amaumauga. O le ata o loʻo i luga o loʻo faʻaalia ai ituaiga e tolu o nodes o loʻo i ai:

  1. I le pito i luga o le aʻa. E leai se mea e sili atu nai lo le manatu o se database i totonu o se fale teu oloa. I totonu o se fa'ata'ita'iga LMDB e tasi, e mafai ona e faia ni fa'amaumauga se tele e fa'asoa ai le avanoa o le tuatusi fa'afanua. O ia mea taitasi e amata mai i lona lava a'a.
  2. I le tulaga maualalo o lau (lau). O latou ma na'o latou o lo'o i ai pa'aga autu-taua o lo'o teuina i totonu o fa'amaumauga. I le ala, o le uiga ese lea o B + -laau. Afai e teuina e se laau masani B-vaega taua i nodes o laʻasaga uma, o le B + -variation e naʻo le pito sili ona maualalo. I le faʻamautuina o lenei mea moni, i le mea o loʻo mulimuli mai o le a tatou taʻua le subtype o le laau na faʻaaogaina i le LMDB na o se B-laau.
  3. I le va o le a'a ma laulaau, e 0 pe sili atu tulaga fa'ateknisi fa'atasi ai ma pona fa'asaga (lala). O la latou galuega o le vaevae lea o seti o ki i le va o laulaau.

Fa'aletino, o pona o poloka ia e manatua ai se umi na mua'i fuafuaina. O lo latou tele o le tele o le tele o itulau manatua i le faiga faʻaogaina, lea na matou talanoa i luga. O loʻo faʻaalia i lalo le fausaga o le node. O le ulutala o loʻo i ai faʻamatalaga-meta, o le mea sili ona manino, mo se faʻataʻitaʻiga, o le siaki siaki. O lo'o soso'o mai fa'amatalaga e uiga i offsets, fa'atasi ai ma sela o lo'o iai fa'amaumauga. O le matafaioi o faʻamaumauga e mafai ona avea ma ki, pe afai tatou te talanoa e uiga i nodes navigation, poʻo paʻaga autu-taua atoa i le tulaga o laulaau E mafai ona e faitau atili e uiga i le fausaga o itulau i le galuega "Su'esu'ega o Faleoloa Fa'atauga Maualuga".

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Ina ua uma ona taulimaina mea i totonu o nodes itulau, o le a matou fai ma sui o le LMDB B-laau i se auala faigofie i le faiga o loʻo mulimuli mai.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O itulau e iai nodes o lo'o fa'atulaga fa'asolosolo i luga ole tisiki. O itulau e maualuga atu le numera o lo'o i le pito o le faila. O le mea e taʻua o le meta page (meta page) o loʻo i ai faʻamatalaga e uiga i offsets, lea e mafai ona faʻaogaina e suʻe ai aʻa o laau uma. Pe a tatalaina se faila, e suʻesuʻe e le LMDB le itulau faila i le itulau mai le pito i le amataga e suʻe se itulau meta aoga ma maua ai faʻamaumauga o loʻo iai.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

I le taimi nei, i le i ai o se manatu i le faʻatulagaina ma le faʻatulagaina o faʻamaumauga, e mafai ona tatou faʻaauau le mafaufau i le tolu tafola o le LMDB. E fa'atasi ai ma lana fesoasoani e fa'atupu uma ai suiga i le teuina ma fa'aesea mai le tasi i le isi, ma tu'uina atu ai le fa'amaumauga atoa ma le multiversion meatotino.

3.3. Tafola #3. kopi-i-tusi

O nisi gaioiga B-laau e aofia ai le faia o se faasologa atoa o suiga i ona pona. O se tasi faʻataʻitaʻiga o le faʻaopoopoina o se ki fou i se node ua uma ona ausia lona malosi maualuga. I lenei tulaga, e tatau, muamua, ia vaevae le node i le lua, ma le lona lua, ia faaopoopo se sootaga i le node fou milo ese tamaiti i lona matua. O lenei faiga e ono matua matautia lava. Afai mo nisi mafuaʻaga (faʻalavelave, paʻu eletise, ma isi) naʻo se vaega o suiga mai le faasologa e tupu, ona tumau ai lea o le laau i se tulaga le mautonu.

O se tasi o fofo masani i le faia o se database fault-tolerant o le faʻaopoopoina lea o se faʻapipiʻi faʻapipiʻi faʻamaumauga faʻamaumauga, le faʻamaumauga o fefaʻatauaiga, lea e taʻua foi o le tusi-ahead log (WAL), i tafatafa o le B-tree. O se faila, i le pito o lea, ao leʻi faia le suiga o le B-laau lava ia, o loʻo tusia ai le gaioiga faʻamoemoeina. O le mea lea, afai e iloa le faʻaleagaina o faʻamatalaga i le taimi o suʻesuʻega a le tagata lava ia, e faʻafesoʻotaʻi e le database le ogalaau e faʻamamā ai ia lava.

Ua filifilia e le LMDB se auala ese e avea ma ana faiga faʻapalepale sese, lea e taʻua o le kopi-i-tusi. O lona uiga, nai lo le faʻafouina o faʻamaumauga i luga o se itulau o loʻo i ai, e muamua kopi atoa ma faia suiga uma ua uma ona i totonu o le kopi.​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

E le gata i lea, ina ia mafai ona maua faʻamatalaga faʻafouina, e tatau ona suia le fesoʻotaʻiga i le node ua faʻafouina i le node matua e faʻatatau i ai. Talu ai e manaʻomia foʻi ona faʻaleleia mo lenei mea, e muamua kopiina foi. O le fa'agasologa o lo'o fa'aauau pea e o'o i le a'a. O faʻamatalaga i luga ole itulau meta o le suiga mulimuli lea.​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Afai e faʻafuaseʻi ona paʻu le faʻagasologa i le taimi o le faʻafouga, ona le faia lea o se itulau meta fou, pe o le a le tusia i le disk seia oʻo i le iuga, ma o le a le saʻo lana siaki. I se tasi o nei mataupu e lua, o itulau fou o le a le mafai ona oʻo atu ma o le a le afaina itulau tuai. Ole mea lea e fa'aumatia ai le mana'oga mo le LMDB e tusi i luma o le ogalaau e fa'amautu ai fa'amaumauga. O le mea moni, o le fausaga o le teuina o faʻamaumauga i luga o le tisiki, o loʻo faʻamatalaina i luga, e faʻaaogaina i le taimi lava e tasi lana galuega. O le leai o se faʻamatalaga faʻamatalaga o fefaʻatauaiga o se tasi lea o foliga o le LMDB, e maua ai le saoasaoa o le faitau o faʻamaumauga.​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O le mea e maua ai, ua ta'ua o le append-only B-tree, e masani lava ona maua ai fefaʻatauaiga faʻatasi ma multiversioning. I le LMDB, o fefa'ataua'iga ta'itasi ta'itasi o lo'o i ai se a'a o la'au fa'aonaponei fa'atasi ma ia. Afai lava e le'i mae'a le fefa'ataua'iga, o le a le toe suia lava pe toe fa'aaogaina itulau o le la'au o lo'o feso'ota'i ma ia mo fa'amatalaga fou o fa'amaumauga. taimi na tatalaina ai le fefaʻatauaiga, e tusa lava pe faʻaauau pea ona faʻafouina le teuina i le taimi nei. Ole ute lea ole multiversioning, ma avea ai le LMDB ma fa'amaumauga lelei mo la tatou pele UICollectionView. O le tatalaina o se fefaʻatauaʻiga, e te le manaʻomia le faʻateleina o le tulagavae manatua o le talosaga, faʻavaveina le faʻamalo i fafo o faʻamatalaga o loʻo i ai nei i totonu o se fausaga manatua, ma le fefe e le tuʻua e aunoa ma se mea. O lenei vaega e fa'aeseese ai le LMDB mai le SQLite lava e tasi, lea e le mafai ona fa'amaualuga i le fa'aesea atoa. O le tatalaina o fefaʻatauaiga e lua i le mulimuli ma tapeina se faʻamaumauga patino i totonu o se tasi oi latou, o le faʻamaumauga lava e tasi e le mafai ona toe maua i totonu o le lona lua o totoe.

O le pito pito i tua o le tupe siliva o le faʻaogaina sili atu o le faʻaogaina o mafaufauga faʻapitoa. O le faʻataʻitaʻiga o loʻo faʻaalia ai foliga o le fausaga o faʻamaumauga pe afai e faʻaleleia i le taimi lava e tasi ma le 3 tatala faitau fefaʻatauaʻiga e vaʻavaʻai i vaega eseese o le database. Talu ai e le mafai e le LMDB ona toe faʻaaogaina pona e mafai ona maua mai aʻa e fesoʻotaʻi ma fefaʻatauaiga moni, o le teuina e leai se filifiliga ae o le tuʻuina atu o le isi aʻa lona fa i le manatua ma toe faʻapipiʻi itulau ua suia i lalo.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O iinei o le a le sili atu le manatuaina o le vaega i luga o faila e manatua-faafanua. E foliga mai o le faʻaopoopoga o le faʻaogaina o mafaufauga faʻapitoa e le tatau ona faʻalavelave tele ia i tatou, talu ai e le fesoasoani i le tulagavae manatua o le talosaga. Ae ui i lea, i le taimi lava e tasi, na maitauina o iOS e matua faʻatauvaʻa i le tuʻufaʻatasia, ma e le mafai ona matou tuʻuina atu se 1 terabyte LMDB itulagi i luga o se 'auʻaunaga poʻo le laulau mai le tauau o le matai ma e le mafaufau i lenei uiga. Afai e mafai, e tatau ona e taumafai e faʻapuupuu le olaga atoa o fefaʻatauaiga.

4. Fuafuaina o se fa'asologa o fa'amaumauga i luga o le ki-value API

Tatou amata fa'avasega le API e ala ile va'ava'ai i fa'amatalaga fa'avae na saunia e le LMDB: si'osi'omaga ma fa'amaumauga, ki ma tau, fefa'ataua'iga ma fetuu.

O se fa'amatalaga e uiga i lisi fa'ailoga

O galuega uma i le LMDB public API e toe fa'afo'i mai le taunu'uga o la latou galuega i le tulaga o se fa'ailoga sese, ae i lisi uma o lo'o soso'o mai e fa'ate'aina lana siaki mo le fa'atumauina. tui C++ afifi lmdbxx, lea e aliali mai ai mea sese e pei ole C++ tuusaunoaga.

O le auala sili ona vave e faʻafesoʻotaʻi ai le LMDB i se iOS poʻo macOS poloketi, ou te ofoina atu laʻu CocoaPod POSLMDB.

4.1. Fa'amatalaga fa'avae

Siosiomaga

Faʻavae MDB_env o le faleteuoloa o le totonugalemu o le LMDB. Aiga o galuega fa'apipi'i mdb_env fa'atagaina oe e fa'atulaga nisi o ona meatotino. I le tulaga sili ona faigofie, o le amataina o le afi e pei o lenei.

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

I le Mail.ru Cloud application, na matou suia le tau le aoga mo na o le lua itu.

O le mea muamua o le tele o le avanoa tuatusi faakomepiuta o lo'o fa'afanua ai le faila faila. Ae paga lea, e oʻo lava i luga o le masini lava e tasi, o le tau faʻapitoa e mafai ona matua ese mai le tamoe i le tamoe. Ina ia amanaʻia lenei vaega o iOS, matou te filifilia le maualuga maualuga o le teuina ma le malosi. Amata mai i se tulaga taua, e faasolosolo afa seia oo i le galuega mdb_env_open o le a le toe faafoi mai se taunuuga e ese mai ENOMEM. I le teori, o loʻo i ai se auala faʻafeagai - muamua tuʻufaʻatasia le itiiti ifo o le manatua i le afi, ona sosoo ai lea, pe a maua mea sese MDB_MAP_FULL, ia faateleina. Ae peitai, e sili atu ona matuitui. O le mafuaʻaga o le faʻagasologa mo le toe faʻaleleia o manatua e faʻaaoga ai le galuega mdb_env_set_map_size fa'aleaogaina uma fa'alapotopotoga (cursors, fefa'atauaiga, ki ma tau) na maua mai le afi muamua. O le su'esu'eina o sea suiga o mea na tutupu i totonu o le tulafono o le a ta'ita'ia ai lona fa'alavelave taua. Afai, e ui i lea, e pele ia te oe le mafaufau faʻapitoa, atonu o se mafuaaga lea e te vaʻai ai i le tui ua mamao i luma. MDBX, lea i totonu o faʻaaliga faʻaalia o loʻo i ai le "otometi i luga o le-lele fetuutuunaiga tele faʻamaumauga".

O le parakalafa lona lua, o le tau le aoga e le fetaui ma i matou, e faʻatonutonuina le faʻainisinia o le faʻamautinoaina o le saogalemu o filo. Ae paga lea, a itiiti mai i le iOS 10, o loʻo i ai faʻafitauli i le filo lagolago i le lotoifale. Mo lenei mafuaʻaga, i le faʻataʻitaʻiga o loʻo i luga, o le fale teu oloa e tatalaina ma le fuʻa MDB_NOTLS. E le gata i lea, e manaʻomia foi tui C++ afifi lmdbxxe tipi ese'ese'ese ma i lenei uiga.

Faʻamaumauga

O le database o se faʻataʻitaʻiga ese o le B-laau na matou talanoa i luga. O lona tatalaina e tupu i totonu o se fefaʻatauaiga, lea i le taimi muamua e foliga mai e ese teisi.

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

O le mea moni, o se fefaʻatauaiga i le LMDB o se mea e teu ai, ae le o se faʻamaumauga patino. O lenei manatu e mafai ai e oe ona faʻatino gaioiga atomika i faʻalapotopotoga o loʻo i totonu o faʻamaumauga eseese. I le teori, o lenei mea e tatalaina ai le avanoa e faʻataʻitaʻiina ai laulau i le tulaga o faʻamaumauga eseese, ae i se tasi taimi na ou alu ai i le isi auala, faʻamatala auiliili i lalo.

Ki ma tulaga faatauaina

Faʻavae MDB_val fa'ata'ita'iina le manatu o se ki ma se tau. O le faleoloa e leai se manatu e uiga ia latou semantics. Mo ia, o se mea e 'ese'ese ua na'o se fa'asologa o bytes o se lapo'a tu'ufa'atasia. Ole maualuga ole ki ole 512 paita.

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

E fa'aoga e le faleoloa se fa'atusatusaga e fa'avasega ai ki i le fa'asologa fa'aa'e. Afai e te le suia i lau oe lava, ona faʻaaogaina lea o le mea e le mafai ona faʻaaogaina, lea e faʻavasegaina i latou byte-by-byte i le lexicographic order.​

Feuaiga

O loʻo faʻamatalaina auiliili le masini fefaʻatauaʻiga i mataupu muamua, o lea o le a ou toe faia a latou meatotino autu i se laina puupuu:

  1. Lagolago mo meatotino faavae uma ACIDUpu autu: atomicity, tumau, tu'ufua ma fa'amaoni. E le mafai ona ou fesoasoani ae maitau e tusa ai ma le tumau i macOS ma iOS o loʻo i ai se pusa faʻapipiʻi i le MDBX. E mafai ona e faitau atili i latou FAITAU.
  2. O le auala i le multithreading o loʻo faʻamatalaina e le "tusitala tasi / tele le au faitau" polokalame. E poloka e tusitala le tasi ma le isi, ae latou te le poloka le au faitau. E le poloka e le aufaitau tusitala po o isi.
  3. Lagolago mo fefaʻatauaiga faʻanofo.
  4. Lagolago multiversion.

Televersioning i LMDB e matua lelei lava ou te manaʻo e faʻaalia i le gaioiga. O le faʻailoga o loʻo i lalo o loʻo faʻaalia ai o fefaʻatauaiga taʻitasi e galue faʻatasi ma le faʻamatalaga o le faʻamaumauga na talafeagai i le taimi na tatalaina ai, e matua vavae ese mai suiga uma mulimuli ane. O le amataina o le faleteuoloa ma le faʻaopoopoina o se faʻamaumauga o suʻega e leai se mea e fiafia i ai, o lea o nei tu masani e tuʻu i lalo o le faʻaleagaina.

Fa'aopoopoina se fa'ailoga su'ega

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

I le faitalia, ou te fautuaina le taumafai i le togafiti tutusa ma SQLite ma vaʻai pe o le a le mea e tupu.

O le tele o suiga e aumaia ai fa'amanuiaga sili i le olaga o se tagata fa'atupu iOS. O le fa'aogaina o lenei mea totino, e mafai ona e fa'afaigofie ma fa'anatura fa'afetaui le fa'afouga o fa'amaumauga o fa'amaumauga mo mata'i fomu e fa'atatau i iloiloga a tagata fa'aoga. Mo se faʻataʻitaʻiga, seʻi o tatou faia se faʻaaliga o le Mail.ru Cloud application e pei o le faʻapipiʻiina o mea mai le faʻasalalauga faʻasalalauga. Faatasi ai ma se fesoʻotaʻiga lelei, e mafai e le kalani ona faʻaopoopo ni ata i le sekone i le server. Afai e te fa'afou pe a mae'a ta'itasi la'uina UICollectionView faʻatasi ai ma mea faʻasalalau i le ao a le tagata faʻaoga, e mafai ona galo ia te oe le 60 fps ma le sologa lelei o le taʻavale i lenei faagasologa. Ina ia puipuia le fa'afouga faifaipea o lau, e tatau ona e fa'atapula'aina le fua o suiga o fa'amaumauga i le fa'avae UICollectionViewDataSource.

Afai e le lagolagoina e le database le multiversioning ma faʻatagaina oe e galue naʻo le tulaga o loʻo i ai nei, ona fai lea o se faʻamatalaga faʻamaumauga tumau, e manaʻomia ona e kopiina a le o se fausaga faʻamaumauga i totonu poʻo se laulau le tumau. Po'o se tasi o nei auala e taugata tele. I le tulaga o le teuina i totonu o manatuaga, tatou te maua uma tau manatua e mafua mai i le teuina o mea faufale ma le tau o taimi e fesoʻotaʻi ma suiga ole ORM. Ae mo le laulau le tumau, o se fiafiaga sili atu ona taugata, lea e talafeagai i na o mataupu e le taua.

Ole Multiversioning LMDB e fo'ia le fa'afitauli o le fa'atumauina o fa'amaumauga mautu i se auala sili ona matagofie. Ua lava na o le tatalaina o se fefaʻatauaiga ma voila - seʻia oʻo ina matou faʻamaeʻaina, o faʻamaumauga faʻamaumauga e mautinoa e faʻamautu. O le fa'atatau o lona fa'afouga fa'afouga o lo'o i ai nei i lima o le laulau fa'aaliga, e aunoa ma se fa'auluuluga o punaoa taua.

Fa'ailoga

E maua ai e fa'ailo se faiga mo le fa'atonuina o le fa'asologa o pa'aga autu-taua e ala i le sopoia o se B-la'au. A aunoa ma i latou, e le mafai ona faʻataʻitaʻiina lelei laulau i totonu o faʻamaumauga, lea tatou te liliu atu i ai.

4.2. Fa'ata'ita'iga o laulau

Ole fa'atonuga autu ole meatotino e mafai ai ona e fausia se fa'aputuga pito i luga e pei o se laulau i luga o fa'amaumauga autu. Sei o tatou mafaufau i lenei faagasologa i luga o le faʻataʻitaʻiga o le laulau autu a le tagata faʻatau ao, lea e teu ai faʻamatalaga e uiga i faila uma ma faila a le tagata faʻaoga.

Fuafuaga Laulau

O se tasi o fa'ata'ita'iga masani e tatau ai ona fa'ama'ai le fausaga o se laulau ma se la'au faila o le filifilia lea o elemene uma o lo'o i totonu o se fa'atonuga tu'ufa'atasiga. Lisi Faʻatasi. Ina ia faʻatinoina i luga o le faʻamaumauga autu-taua, e manaʻomia le faʻavasegaina o ki o faila ma faila i se auala e faʻavasegaina ai e faʻavae i luga o le faʻasinomaga matua. E le gata i lea, ina ia mafai ona faʻaalia mea o loʻo i totonu o le lisi i le foliga masani i se tagata faʻaoga Windows (muamua faila, ona faʻapipiʻi uma ai lea i le alafapeta), e manaʻomia le faʻapipiʻiina o isi vaega faʻaopoopo i le ki.

O le ata o loʻo i lalo o loʻo faʻaalia ai pe faʻapefea, e faʻatatau i le galuega, o le faʻatusaina o ki o se faʻasologa o bytes e ono foliga mai. Muamua, e tu'u le bytes ma le fa'asinomaga matua (lanumumu), ona fa'atasi ai lea ma le ituaiga (lanumeamata), ma ua uma i le si'usi'u ma le igoa (lanumoana). le auala manaomia. Fa'asologa fa'asolosolo ki fa'atasi ai ma le fa'ailoga mumu e tasi e tu'uina mai ai ia i tatou tulaga taua e fa'atatau ia i latou i le fa'asologa e tatau ona fa'aalia i le fa'aoga fa'aoga (taumatau), e aunoa ma le mana'omia o so'o se fa'asologa fa'aopoopo.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Fa'asologa o Ki ma Fa'atauga

E tele auala mo fa'asologa o mea i le lalolagi. Talu ai e leai se isi mea e manaʻomia e ese mai i le saoasaoa, na matou filifilia le mea sili ona vave e mafai mo i matou lava - o se faʻamanatuga o loʻo nofoia e se faʻataʻitaʻiga o le fausaga o le gagana C. O lea, o le ki o se elemene lisi e mafai ona faʻataʻitaʻiina e le fausaga o loʻo i lalo. NodeKey.

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

Ina ia faasaoina NodeKey i le teuina manaomia i mea MDB_val tu'u le fa'asino ile fa'amatalaga ile tuatusi ole amataga ole fausaga, ma fuafua lo latou tele ma le galuega sizeof.

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

I le mataupu muamua i luga o faʻamaumauga filifilia o faʻamaumauga, na ou taʻua ai le faʻaitiitia o vaega faʻamalosi e avea o se vaega o galuega a le CRUD o se mea taua tele. Code Galuega serialize fa'aalia pe fa'apefea, i le tulaga o le LMDB, e mafai ona 'alofia atoatoa pe a fa'aofi fa'amaumauga fou i totonu o fa'amaumauga. O le fa'asologa o bytes o lo'o sau mai le 'au'aunaga e muamua suia i fausaga fa'aputu, ona lafoa'i lea i totonu o le teuina. Talu ai e leai foʻi ni faʻasalalauga faʻamalosi i totonu o le LMDB, e mafai ona e maua se tulaga mataʻina i tulaga o iOS - faʻaaoga naʻo le faʻapipiʻi manatua e galue ai ma faʻamatalaga mai le fesoʻotaʻiga i le disk!

Fa'atonu ki fa'atasi ma se fa'atusatusaga binary

Ole feso'ota'iga fa'asologa autu e tu'uina mai e se galuega fa'apitoa e ta'ua ole fa'atusatusa. Talu ai e leai se mea e iloa e le afi e uiga i semantics o bytes o loʻo i ai, e leai se filifiliga a le tagata faʻatusatusa faʻaletonu ae o le faʻatulagaina o ki i le faʻasologa o le lexicographic, faʻaoga i la latou faʻatusatusaga byte-by-byte. O le fa'aogaina e fa'atulaga ai fausaga e pei o le seleina i se to'i vaneina. Ae ui i lea, i tulaga faigofie, ou te iloa e talia lenei metotia. O le isi filifiliga o loʻo faʻamatalaina i lalo, ae o iinei o le a ou matauina ai ni nai rake o loʻo salalau i luga o le ala.

O le mea muamua e teu i lou mafaufau o le faʻataʻitaʻiga manatua o ituaiga faʻamaumauga muamua. O lea la, i luga o masini uma a Apple, o loʻo teuina faʻasologa o fuainumera i le faatulagaga Laititi Endian. O lona uiga o le paita pito sili ona taua o le a i le agavale, ma o le a le mafai ona e fa'avasegaina numera e fa'aaoga ai la latou fa'atusatusaga byte-by-byte. Mo se faʻataʻitaʻiga, o le taumafai e fai lenei mea i se seti o numera mai le 0 i le 511 o le a maua ai le iʻuga o loʻo mulimuli mai.

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

Ina ia foia lenei faafitauli, e tatau ona teuina le numera atoa i le ki i se faatulagaga talafeagai mo le faʻatusatusaga byte. O galuega mai le aiga o le a fesoasoani i le faʻatinoina o suiga talafeagai. hton* (ae faapito tonu lava htons mo numera lua-byte mai le faʻataʻitaʻiga).

O le faatulagaga mo le faʻatusaina o manoa i polokalame, e pei ona e iloa, o se atoaga talafaasolopito. Afai o semantics o manoa, faʻapea foʻi ma le faʻaogaina o loʻo faʻaaogaina e fai ma sui i latou i le mafaufau, e taʻu mai ai atonu e sili atu ma le tasi le paita i le amio, ona sili atu lea ona lafoaʻi vave le manatu o le faʻaaogaina o se faʻatusatusaga le lelei.

O le mea lona lua e tatau ona manatua fa'aoga faavae struct field compiler. Ona oi latou, e mafai ona fausia paita ma tau lapisi i le mafaufau i le va o fanua, lea, ioe, motusia byte faavasegaina. Ina ia faʻaumatia lapisi, e tatau ona e faʻaalia fanua i se faʻatonuga faʻamaonia, tausia tulafono faʻatulagaina i lou mafaufau, pe faʻaaoga le uiga i le faʻaaliga faʻatulagaina packed.

Fa'atonuga autu e se tagata fa'atusatusa i fafo

O le fa'atusatusaga autu e ono fa'aalia e faigata tele mo se fa'atusatusaga fa'alua. O se tasi o le tele o mafuaaga o le i ai o fanua faʻapitoa i totonu o fausaga. O le a ou faʻaalia lo latou tupu i luga o le faʻataʻitaʻiga o se ki ua masani ai i matou mo se elemene faʻatonu.

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

Mo lona faigofie uma, i le tele o mataupu e tele naua le manatua. O le fa'aigoa fa'aigoa e 256 bytes, e ui i le averesi o faila ma igoa faila e seasea sili atu i le 20-30 mataitusi.

O se tasi o auala masani mo le faʻamalieina o le tele o se faʻamaumauga o le tipiina ina ia fetaui ma lona telē moni. O lona uiga, o mea o lo'o i totonu o fanua uma e fesuisuia'i-umi o lo'o teuina i totonu o se pa'u i le pito o le fausaga, ma o latou umi e teuina i ni fesuiaiga eseese. E tusa ai ma lenei faiga, o le ki. NodeKey ua liua i le ala lea.

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

E le gata i lea, i le taimi o le fa'asologa, e le o fa'amaotiina o le tele o fa'amaumauga sizeof le fausaga atoa, ma le tele o fanua uma e tumau umi faʻatasi ai ma le tele o le vaega faʻaaogaina moni o le pa.

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

O le i'uga o le toe fa'afoliga, na matou maua se fa'aputuga tele i le avanoa o lo'o nofoia e ki. Ae ui i lea, ona o le tulaga faʻapitoa nameLength, o le fa'atusatusaina binary fa'aletonu ua le toe talafeagai mo fa'atusatusaga autu. Afai tatou te le suia ia i tatou lava, o le umi o le igoa o le a sili atu le faamuamua i le faavasegaina nai lo le igoa lava ia.

O le LMDB e fa'atagaina ai fa'amaumauga ta'itasi e iai lana galuega fa'atusatusa autu. E faia lenei mea i le faʻaaogaina o le galuega mdb_set_compare sa'o a'o le'i tatalaina. Mo mafuaaga manino, e le mafai ona suia se database i lona olaga atoa. I le faʻaoga, e maua e le tagata faʻatusatusa ni ki se lua i le faʻatulagaga binary, ma i le gaioiga e toe faʻafoʻi mai ai le iʻuga o le faʻatusatusaga: itiiti ifo i le (-1), sili atu i le (1) poʻo le tutusa (0). Pseudocode mo NodeKey e foliga faapena.

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

Afai lava o ki uma i totonu o fa'amaumauga e tutusa le ituaiga, e fa'atulafonoina le tu'uina atu e aunoa ma se fa'atagaga o latou fa'atusa byte i le ituaiga o fa'atulagaga o talosaga a le ki. E tasi le nuance iinei, ae o le a talanoaina laʻititi laʻititi i le vaega "Faʻamaumauga Faitau".

Fa'asologa o Taua

Faatasi ai ma ki o faamaumauga teuina, LMDB galue malosi tele. Latou te faʻatusatusaina i le tasi ma le isi i totonu o le faʻavae o soʻo se faʻatinoga o talosaga, ma o le faʻatinoga o le fofo atoa e faʻalagolago i le saoasaoa o le faʻatusatusa. I totonu o se lalolagi lelei, e tatau ona lava le faʻatusatusaina binary faʻatusatusa e faʻatusatusa ai ki, ae afai e tatau ona e faʻaaogaina oe lava, o le faʻagasologa mo le deserializing ki i totonu e tatau ona vave.

O le fa'amaumauga e le'o fa'apitoa le fiafia i le Taua-vaega o fa'amaumauga (taua). O lona liua mai le byte faʻatusa i se mea e tupu pe a uma ona manaʻomia e le code talosaga, mo se faʻataʻitaʻiga, e faʻaalia i luga o le lau. Talu ai e seasea tupu lenei mea, o manaʻoga mo le saoasaoa o lenei faiga e le taua tele, ma i lona faʻatinoga e sili atu le saoloto e taulaʻi atu i le faʻaogagofie. NSKeyedArchiver.

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

Ae ui i lea, e iai taimi e taua ai le faʻatinoga. Mo se faʻataʻitaʻiga, pe a faʻasaoina meta-faʻamatalaga e uiga i le fausaga faila o le ao faʻaoga, matou te faʻaogaina le mea lava e tasi e manatua ai le lafoaia. O le mea taua o le galuega o le fausiaina o latou faʻataʻitaʻiga faʻasologa o le mea moni o elemene o se faʻatonuga o loʻo faʻataʻitaʻiina e se faʻasologa o vasega.​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Mo lona faʻatinoga i le gagana C, o fanua faʻapitoa o suli e ave i totonu o fausaga eseese, ma o latou fesoʻotaʻiga ma le faavae o loʻo faʻamaonia e ala i se fanua o le ituaiga iuni. O mea moni o le iuni o lo'o fa'amaoti mai ile ituaiga uiga fa'apitoa.

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

Fa'aopoopo ma fa'afou fa'amaumauga

E mafai ona fa'aopoopo le ki fa'asologa ma le tau i le faleoloa. Mo lenei mea, e faʻaaogaina le gaioiga mdb_put.

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

I le tulaga o le fa'atulagaina, e mafai ona fa'ataga pe fa'asa le faleteuoloa e teu ni fa'amaumauga se tele i le ki lava e tasi. Afai e na'o le fa'alavelave e mafai ona tupu ona o se mea sese i le code, ona mafai lea ona e inisiua e ala i le fa'amaonia o le fu'a. NOOVERWRITE.

Faitauga Faamaumauga

O le aoga mo le faitauina o faamaumauga i le LMDB o le mdb_get. Afai o le pa'aga autu-taua o lo'o fa'atusalia e fausaga na lafoa'i muamua, ona fa'apea lea o le faiga lea.

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

O le lisi o loʻo tuʻuina atu o loʻo faʻaalia ai pe faʻafefea ona faʻaogaina e ala i le lafoaia o fausaga e mafai ai e oe ona faʻaumatia vaega faʻamalosi e le gata pe a tusitusi, ae pe a faitau faʻamatalaga. Fa'atupu mai galuega mdb_get e va'ava'ai tonu le fa'asino ile tuatusi virtual memory lea e teu ai e le database le fa'atusa o le mea. O le mea moni, matou te maua se ituaiga o ORM, toetoe a leai se totogi e maua ai se saoasaoa maualuga tele o faʻamatalaga faitau. Faatasi ai ma le matagofie uma o le auala, e tatau ona manatua nisi o vaega e fesoʻotaʻi ma ia.

  1. Mo se fefa'ataua'iga na'o le faitau, o le fa'asino ile fa'atulagaina o tau e fa'amautinoa e tumau le aoga se'ia tapunia le fefa'ataua'iga. E pei ona taʻua muamua, o itulau o le B-laau o loʻo nofo ai le mea, faʻafetai i le kopi-i-tusi mataupu faavae, e tumau pea e le suia pe a itiiti ifo ma le tasi le fefaʻatauaiga e faasino ia i latou. I le taimi lava e tasi, o le taimi lava e maeʻa ai le fefaʻatauaiga mulimuli e fesoʻotaʻi ma i latou, e mafai ona toe faʻaaogaina itulau mo faʻamatalaga fou. Afai e tatau mo mea faitino e ola i le fefaʻatauaiga na faia ai, e tatau lava ona kopiina.
  2. Mo se fefaʻatauaʻiga faitau tusi, o le faʻasino i le faʻatulagaina-taua o le a aoga seia oʻo i le faʻasologa muamua o suiga (tusitusi pe tape faʻamaumauga).
  3. E ui lava o le fausaga NodeValue e le'o atoatoa, ae teuteu (silasila i le vaega "Oka ki e se fa'atusa fafo"), e ala i le fa'asino, e faigofie ona e mauaina ona fanua. O le mea autu e le o le faʻaaogaina!
  4. E leai se tulaga e mafai ona e suia le fausaga e ala i le faasinoala na maua. O suiga uma e tatau ona faia na'o le auala mdb_put. Ae ui i lea, faatasi ai ma le manaʻoga uma e faia lenei mea, o le a le aoga, talu ai o le vaega manatua o loʻo i ai lenei fausaga o loʻo faʻafanua i le faitau naʻo le faiga.
  5. Toe fa'asolo se faila i le tuatusi avanoa o se faagasologa ina ia, mo se faʻataʻitaʻiga, faʻateleina le tele o le teuina e faʻaaoga ai le galuega mdb_env_set_map_size matua fa'aleaogaina uma fefa'atauaiga ma fa'alapotopotoga e feso'ota'i i le lautele ma fa'asino e faitau mea fa'apitoa.

Ma le mea mulimuli, e tasi le isi vaega e matua fa'a'ole'ole ma o le fa'aaliaina o lona uiga e le fetaui ma na'o le tasi le isi vaega. I le mataupu i luga o le B-laau, sa ou tuuina atu se ata o le faatulagaga o ona itulau e manatua. E mulimuli mai ai o le tuatusi o le amataga o le pa'u fa'atasi ai ma fa'amaumauga fa'asologa e mafai ona matua fa'atonu. Ona o lenei mea, o le faasinoala ia i latou, maua i le fausaga MDB_val ma lafo i se faasinoala i se fausaga e masani lava ona le ogatasi. I le taimi lava e tasi, o le fausaga o nisi tupe meataalo (i le tulaga o iOS, o le armv7 lea) e manaʻomia ai le tuatusi o soʻo se faʻamatalaga o se tele o le tele o se upu masini, pe, i se isi faaupuga, o le bitness o le faiga. (mo armv7, o le 32 bits lea). I se isi faaupuga, o se taotoga e pei o *(int *foo)0x800002 i luga o i latou ua faatusaina e sola ese ma taitai atu ai i le faasalaga ma se faaiuga EXC_ARM_DA_ALIGN. E lua auala e aloese ai mai se taunuuga faanoanoa faapena.

O le mea muamua o le kopiina o faʻamaumauga i totonu o se fausaga faʻapitoa-faʻaogaina muamua. Mo se faʻataʻitaʻiga, i luga o se faʻatusatusaga masani, o le a faʻaalia e pei ona taua i lalo.

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

O se isi auala o le logoina muamua lea o le tagata tuʻufaʻatasia e faapea o fausaga ma se ki ma se tau e le mafai ona faʻaogaina e faʻaaoga ai se uiga. aligned(1). I luga ole ARM ole a'afiaga tutusa e mafai ausia ma le faʻaaogaina o uiga faʻapipiʻiina. Mafaufau e fesoasoani foi i le faʻaogaina o le avanoa o loʻo nofoia e le fausaga, o lenei metotia e foliga mai ia te aʻu e sili, e ui lava e faʻamaonia e fa'atuputeleina ai le tau o fa'agaioiga avanoa fa'amatalaga.

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

Su'ega Su'ega

Ina ia fa'ata'ita'i i luga o se vaega o fa'amaumauga, e tu'uina atu e le LMDB se fa'a'ese'esega fa'ama'i. Se'i o tatou va'ai pe fa'afefea ona galulue fa'atasi ma le fa'ata'ita'iga o se laulau fa'atasi ai ma tagata fa'aoga metadata ao ua leva ona tatou masani ai.

I le avea ai o se vaega o le faʻaalia o se lisi o faila i totonu o se lisi, e tatau ona e suʻeina uma ki e fesoʻotaʻi ai ana faila ma faila. I le vaega muamua, sa matou faavasegaina ki NodeKey ina ia fa'atonuina muamua e latou ID fa'atonu matua. O le mea lea, faʻapitoa, o le galuega o le mauaina o mea o loʻo i totonu o se faila e faʻaititia i le tuʻuina o le cursor i luga o le tuaoi pito i luga o se vaega o ki ma se prefix ua tuʻuina atu, sosoo ai ma le faʻaogaina i le pito i lalo.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

E mafai ona e mauaina le pito i luga "i luga o le muaulu" e ala ile sailiga faʻasolosolo. Ina ia faia lenei mea, e tuʻu le faʻailoga i le amataga o le lisi atoa o ki i totonu o faʻamaumauga ma faʻaopoopoina seʻia oʻo i lalo le ki ma le faʻailoga matua. O lenei faiga e 2 fa'aletonu manino:

  1. Ole lavelave ole laina ole su'esu'ega, e ui lava, e pei ona e iloa, ile la'au lautele ma ile B-fa'apitoa, e mafai ona faia ile taimi logarithmic.​
  2. E le aoga, o itulau uma e muamua atu i le mea e manaʻomia e siitia mai le faila i le manatua autu, lea e matua taugata lava.

O le mea e lelei ai, o le LMDB API o loʻo tuʻuina atu se auala lelei e faʻatulaga muamua ai le cursor. . Mo se faʻataʻitaʻiga, e faʻatatau i le lisi i le ata o loʻo i luga, e mafai ona tatou faia se ki i le fanua parentId o le a tutusa ma le 2, ma o isi mea uma e tumu i zeros. O lea ki ua fa'atumuina ua tu'uina atu i le fa'aoga o le galuega mdb_cursor_get fa'ailoa le fa'agaioiga 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);

Afai e maua le pito i luga o le vaega o ki, ona matou toe faʻataʻitaʻi lea seia oʻo ina matou feiloai poʻo le ki ma se isi. parentId, pe o le a le uma lava ki.​

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

O le a le mea manaia, o se vaega o le faʻaogaina o le mdb_cursor_get, matou te maua e le gata o le ki, ae faʻapea foi le tau. Afai, ina ia mafai ona faʻataunuʻuina tulaga filifilia, e tatau ona siaki, faatasi ai ma isi mea, fanua mai le taua-vaega o faʻamaumauga, ona latou maua ai lea e latou lava e aunoa ma ni taga faʻaopoopo.

4.3. Fa'ata'ita'iga so'otaga i le va o laulau

E oʻo mai i le taimi nei, ua mafai ona matou mafaufau i itu uma o le mamanuina ma le galulue faʻatasi ma se faʻamaumauga e tasi-table. E mafai ona tatou fa'apea o le laulau o se seti o fa'amaumauga fa'avasega o lo'o i ai pa'aga autu-taua o le ituaiga tutusa. Afai e te faʻaalia se ki o se rectangle ma lona tau faʻatatau o se pusa, e te maua se ata vaʻaia o le database.

Le

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Ae ui i lea, i le olaga moni, e seasea mafai ona ola i le itiiti o le toto. E masani lava i totonu o se faʻamaumauga e manaʻomia, muamua, ia i ai ni laulau, ma lona lua, ia faia filifiliga i totonu ia i latou i se faasologa e ese mai le ki autu. O lenei vaega mulimuli o loʻo tuʻuina atu i mataupu o lo latou fausiaina ma fesoʻotaʻiga.

Fa'asinomaga laulau

O le cloud app o loʻo i ai se vaega "Gallery". E fa'aalia mea fa'asalalau mai le ao atoa, fa'avasega i aso. Mo le faʻatinoina lelei o sea filifiliga, i tafatafa o le laulau autu, e tatau ona e fatuina se isi ma se ituaiga fou o ki. O le a iai se fanua ma le aso na faia ai le faila, lea o le a avea ma fa'avasegaga muamua. Ona o ki fou e faasino i faʻamatalaga tutusa e pei o ki i le laulau pito i lalo, e taʻua o ki faʻasino. O lo'o fa'ailogaina i le moli i le ata o lo'o i lalo.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

Ina ia mafai ona vavae'ese ki o laulau eseese mai le tasi ma le isi i totonu o le database lava e tasi, ua faʻaopoopoina se laulau faʻapitoa faʻapitoa tableId i latou uma. E ala i le faia o le fa'amuamua maualuga mo le fa'avasegaina, o le a matou fa'avasega muamua ki i laulau, ma ua uma i totonu o laulau - e tusa ai ma a tatou lava tulafono.​

O le fa'asino igoa e fa'asino i fa'amaumauga tutusa ma le ki autu. O le faʻatinoina saʻo o lenei meatotino e ala i le faʻafesoʻotaʻi ma se kopi o le vaega taua o le ki autu e sili ona lelei mai le tele o manatu i le taimi e tasi:

  1. Mai se va'aiga va'ava'ai va'aiga, o le metadata e mafai ona matua mauoa.
  2. Mai se vaaiga faʻatinoga, talu ai a faʻafouina le metadata node, e tatau ona e faʻauluina ki e lua.
  3. Mai le manatu o le code support, pe a uma, afai e galo ia i tatou le faʻafouina o faʻamatalaga mo se tasi o ki, o le a tatou maua se pusa faʻapitoa o faʻamatalaga le tutusa i le teuina.

O le isi, o le a tatou iloiloina pe faʻafefea ona faʻaumatia nei faaletonu.

Fa'atulagaina o so'oga i le va o laulau

O le mamanu e fetaui lelei mo le fesoʻotaʻi o se laulau faʻasino ma le mea autu "ki e taua". E pei ona ta'u mai e lona igoa, o le vaega taua o le fa'amaumauga o fa'amaumauga o se kopi o le tau autu autu. O lenei faiga e aveese uma ai mea le lelei o lo'o lisiina i luga e feso'ota'i ma le teuina o se kopi o le vaega taua o le fa'amaumauga muamua. Pau lava le totogifuapauina o le maua lea o le tau e ala i le ki faʻasino, e tatau ona e faia 2 fesili i le database nai lo le tasi. I le fa'avasegaina, o le fa'asologa o fa'amaumauga fa'amaumauga e fa'apea.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O le isi mamanu mo le faatulagaina o sootaga i le va o laulau o le "ki tele". O lona uiga o le faʻaopoopoina o uiga faʻaopoopo i le ki, lea e le manaʻomia mo le faʻavasegaina, ae mo le toe faʻaleleia o le ki faʻatasi. E iai faʻataʻitaʻiga moni o lona faʻaogaina i le Mail.ru Cloud application, peitaʻi, ina ia aloese mai le loloto o le maulu i totonu o le. faʻamatalaga o faʻatulagaga faʻapitoa iOS, o le a ou tuʻuina atu se faʻataʻitaʻiga, ae o se faʻataʻitaʻiga sili atu ona malamalama.

O lo'o iai le itulau a le aufaipisinisi feavea'i o le ao e fa'aalia uma faila ma faila na fa'asoa e le tagata fa'aoga ma isi tagata. Talu ai e tau leai ni faila faapena, ma e tele naua faʻamatalaga patino e uiga i faʻasalalauga e fesoʻotaʻi ma i latou (o ai e tuʻuina atu i ai le avanoa, ma o a aia tatau, ma isi), e le o se mea faʻapitoa le mamafa i le taua-vaega o le faamaumauga i le laulau autu. Ae peitaʻi, afai e te manaʻo e faʻaalia ia faila tuusao, ona e manaʻomia lava lea e teu i se mea. O se fofo masani o le faia lea o se laulau ese mo ia. I le ata o loʻo i lalo, o lona ki o loʻo faʻapipiʻiina i le "P", ma o le "propname" placeholder e mafai ona suia i le tau faʻapitoa "faʻamatalaga lautele".​

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O metadata tulaga ese uma, mo le mea na faia ai le laulau fou, ua siitia i le vaega taua o le faamaumauga. I le taimi lava e tasi, ou te le manaʻo e faʻaluaina faʻamatalaga e uiga i faila ma faila ua uma ona teuina i le laulau autu. Nai lo lena, o faʻamatalaga faʻasalalau e faʻaopoopo i le "P" ki i le tulaga o le "node ID" ma le "timestamp" fanua. Faʻafetai ia i latou, e mafai ona e fausia se ki faʻasino, lea e mafai ai ona e maua le ki autu, lea, mulimuli ane, e mafai ona e mauaina metadata o le node.

Fa'ai'uga

Matou te iloiloina lelei taunuuga o le faʻatinoga o le LMDB. A maeʻa, o le numera o talosaga faʻamalo faʻaititia i le 30%.

Le pupula ma le mativa o le autu-taua faʻamaumauga LMDB i iOS talosaga

O taunuʻuga o le galuega na faia na maua ai se tali i fafo atu o le iOS team. I le taimi nei, o se tasi o vaega autu "File" i le Android application ua suia foi i le faʻaaogaina o le LMDB, ma o isi vaega o loʻo i luga o le ala. O le gagana C, o loʻo faʻatinoina ai le teuina o mea taua, o se fesoasoani lelei ina ia mafai ai ona faʻapipiʻiina le talosaga i luga ole laiga i le gagana C ++. Mo se fesoʻotaʻiga le lelei o le faletusi C ++ ma le faʻailoga faʻavae i Objective-C ma Kotlin, na faʻaaogaina ai se generator code. Djinni mai Dropbox, ae o le isi tala lena.

puna: www.habr.com

Faaopoopo i ai se faamatalaga