Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Hoetla ka 2019, ketsahalo eo e leng khale e letetsoe e etsahetse sehlopheng sa Mail.ru Cloud iOS. Sebaka sa polokelo ea litaba sa mantlha bakeng sa polokelo e phehellang ea boemo ba kopo e se e le ntho e makatsang lefatšeng la mehala Lehalima Memory-Mapped Database (LMDB). Ka tlase ho sehiloeng re u fa tlhahlobo e qaqileng ea eona likarolong tse 'nè. Taba ea pele, a re ke re bue ka mabaka a khetho e joalo e sa reng letho le e thata. Joale re tla tsoela pele ho nahana ka litšiea tse tharo tse bohareng ba meralo ea LMDB: lifaele tsa mohopolo oa mohopolo, B + -sefate, mokhoa oa ho kopitsa-ho ngola bakeng sa ho kenya ts'ebetsong transactionality le multiversion. Qetellong, bakeng sa lijo tse theolelang - karolo e sebetsang. Ho eona re tla sheba mokhoa oa ho rala le ho kenya ts'ebetsong schema ea database e nang le litafole tse 'maloa, ho kenyeletsoa index e le' ngoe, ka holim'a API ea boemo bo tlase ba bohlokoa.

Tse ka hare

  1. Khothatso ea ho phethahatsa
  2. Boemo ba LMDB
  3. Litšiea tse tharo tsa LMDB
    3.1. Leruarua #1. Lifaele tse entsoeng ka memori
    3.2. Leruarua #2. B+-sefate
    3.3. Leruarua #3. Kopitsa-ngola
  4. Ho theha schema ea data ka holim'a API ea bohlokoa ba bohlokoa
    4.1. Lintlha tsa motheo
    4.2. Tafole Modeling
    4.3. Ho etsa mohlala oa likamano lipakeng tsa litafole

1. Khothatso ea ho phethahatsa

Selemong se seng ka 2015, re ile ra nka bothata ba ho lekanya hore na sebopeho sa kopo ea rona se lieha hakae. Re entse sena ka lebaka. Re fumane litletlebo khafetsa tsa hore ka linako tse ling ts'ebeliso e khaotsa ho arabela liketsong tsa basebelisi: li-buttons ha li khone ho hatelloa, manane ha a tsamaee, joalo-joalo. Mabapi le mechanics ea litekanyo bolelloa ho AvitoTech, kahoo mona ke fana ka taelo ea linomoro feela.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Liphetho tsa litekanyo li ile tsa fetoha shaoara e batang ho rona. Ho ile ha fumaneha hore ho na le mathata a mangata a bakoang ke leqhoa ho feta a mang. Haeba pele u hlokomela taba ena, letšoao le ka sehloohong la tekheniki ea boleng e ne e le ntle le ho senyeha, joale ka mor'a ho tsepamisa maikutlo suthile ka leqhoa mahala.

Ho ahile dashboard e nang le serame le ka mora ho qeta bongata и boleng tlhahlobo ea mabaka a bona, sera se ka sehloohong se ile sa hlaka - logic e boima ea khoebo e phethiloe khoele e kholo ea kopo. Karabelo ea tlhaho ho lihlong tsena e ne e le takatso e tukang ea ho e sutumelletsa melapong ea mosebetsi. Ho rarolla bothata bona ka mokhoa o hlophisehileng, re ile ra fetohela ho meaho e nang le likhoele tse ngata e thehiloeng ho libapali tse bobebe. Ke e nehetse ho ikamahanya le maemo bakeng sa lefatše la iOS likhoele tse peli ho Twitter e kopanetsoeng le sengoloa se buang ka Habré. E le karolo ea tlaleho ea morao-rao, ke batla ho totobatsa lintlha tseo tsa qeto e ileng ea susumetsa khetho ea polokelo ea boitsebiso.

Mohlala oa motšoantšisi oa mokhatlo oa tsamaiso o nka hore multithreading e fetoha mohloli oa eona oa bobeli. Mohlala oa lintho tse ho eona li rata ho tšela meeli ea melapo. 'Me ha ba etse sena ka linako tse ling le mona le mane, empa hoo e ka bang kamehla le hohle

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Database ke e 'ngoe ea likarolo tsa motheo tsa setšoantšo se hlahisitsoeng. Mosebetsi oa eona o ka sehloohong ke ho kenya tšebetsong macropattern Database e arolelanoang. Haeba lefats'eng la khoebo le sebelisetsoa ho hlophisa khokahano ea data lipakeng tsa lits'ebeletso, joale molemong oa meralo ea libapali - data lipakeng tsa likhoele. Kahoo, re ne re hloka database e neng e ke ke ea baka mathata a fokolang ha re sebetsa le eona sebakeng se nang le likhoele tse ngata. Haholo-holo, sena se bolela hore lintho tse fumanoang ho eona e tlameha ho ba bonyane tse bolokehileng, 'me li sa fetohe ka ho feletseng. Joalokaha u tseba, ea morao-rao e ka sebelisoa ka nako e le 'ngoe ho tloha likhoele tse' maloa ntle le ho sebelisa ho koala leha e le efe, e nang le phello e molemo mosebetsing.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOSNtho ea bobeli ea bohlokoa e ileng ea susumetsa khetho ea database ke API ea rona ea leru. E bululetsoe ke mokhoa oa ho hokahanya o amohetsoeng ke git. Joalo ka eena, re ne re ikemiselitse offline-pele API, e shebahalang ho feta e loketseng bareki ba maru. Ho ne ho nahanoa hore ba tla pompa boemo bo felletseng ba leru hang feela, ebe khokahano maemong a mangata haholo e tla etsahala ka ho hlahisa liphetoho. Oho, monyetla ona o ntse o le sebakeng sa theory feela, 'me bareki ha ba e-s'o ithute ho sebetsa le li-patches ka tloaelo. Ho na le mabaka a 'maloa a sepheo sa sena, e le hore re se ke ra lieha ho kenyelletsa kenyelletso, re tla siea li-brackets. Joale, se khahlang haholo ke liqeto tse rutang tsa thuto mabapi le se etsahalang ha API e re "A" mme moreki oa eona a sa re "B".

Kahoo, haeba u nahana git, eo, ha u etsa taelo ea ho hula, ho e-na le ho sebelisa li-patches setšoantšong sa sebaka sa heno, e bapisa boemo ba eona bo feletseng le boemo bo feletseng ba seva, joale u tla ba le khopolo e nepahetseng ea hore na ho lumellana ho etsahala joang marung. bareki. Ho bonolo ho hakanya hore ho e kenya tšebetsong, o hloka ho beha lifate tse peli tsa DOM mohopolong ka tlhaiso-leseling e mabapi le li-server tsohle le lifaele tsa lehae. Hoa etsahala hore haeba mosebeletsi a boloka lifaele tse likete tse 500 marung, joale ho li lumellana ho hlokahala ho tsosolosa le ho senya lifate tse peli tse nang le li-node tse limilione tse 1. Empa node ka 'ngoe ke kakaretso e nang le graph ea subsubjects. Ka lebaka lena, liphetho tsa profilse li ne li lebelletsoe. Ho ile ha fumaneha hore le ntle le ho ela hloko algorithm ea ho kopanya, mokhoa ona oa ho theha le ho senya palo e kholo ea lintho tse nyane o bitsa chelete e ngata haholo. ea lingoliloeng tsa basebelisi. Ka lebaka leo, re lokisa ntlha ea bobeli ea bohlokoa ha re khetha database - bokhoni ba ho kenya ts'ebetsong ts'ebetso ea CRUD ntle le kabo e matla ea lintho.

Litlhoko tse ling ke tsa setso le lethathamo la tsona kaofela ke tse latelang.

  1. Tšireletseho ea khoele.
  2. Multiprocessing. E laetsoe ke takatso ea ho sebelisa mohlala o tšoanang oa database ho hokahanya boemo eseng feela lipakeng tsa likhoele, empa hape le lipakeng tsa ts'ebeliso ea mantlha le li-extensions tsa iOS.
  3. Bokhoni ba ho emela mekhatlo e bolokiloeng e le lintho tse sa fetoheng
  4. Ha ho likabelo tse matla ka har'a ts'ebetso ea CRUD.
  5. Tšehetso ea transaction bakeng sa thepa ea mantlha ACID: atomicity, consistency, ho itšehla thajana le ho tšepahala.
  6. Lebelo ho linyeoe tse tsebahalang haholo.

Ka sehlopha sena sa litlhoko, SQLite e ne e le khetho e ntle ebile e ntse e le teng. Leha ho le joalo, e le karolo ea thuto ea mekhoa e meng, ke ile ka fumana buka "Ho qala ka LevelDB". Tlas'a boetapele ba hae, ho ile ha ngoloa benchmark e bapisa lebelo la mosebetsi le li-database tse fapaneng maemong a nnete a maru. Phello e ile ea feta tebello ea rōna e hlaha. Maemong a tsebahalang haholo - ho fumana sesupa lethathamong le hlophisitsoeng la lifaele tsohle le lethathamo le hlophisitsoeng la lifaele tsohle bakeng sa bukana e fanoeng - LMDB e bile ka lebelo la makhetlo a 10 ho feta SQLite. Khetho e ile ea totobala.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

2. Boemo ba LMDB

LMDB ke laeborari e nyane haholo (methalo e 10K feela) e sebelisang karolo e tlase haholo ea polokelo ea polokelo.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Setšoantšo se ka holimo se bontša hore ho bapisa LMDB le SQLite, eo hape e sebelisang maemo a holimo, hangata ha e nepahale ho feta SQLite le Core Data. Ho ka ba molemo ho feta ho qotsa lienjineri tse tšoanang tsa polokelo e le bahlolisani ba lekanang - BerkeleyDB, LevelDB, Sophia, RocksDB, joalo-joalo Ho na le lintlafatso moo LMDB e sebetsang e le karolo ea enjene ea polokelo bakeng sa SQLite. Teko ea pele e joalo e etsahetse ka 2012 sebedisitsoe ka LMDB Howard Chu. Liphetho e ile ea e-ba monate hoo morero oa hae o ileng oa nkoa ke ba chesehelang OSS, 'me ba fumana tsoelo-pele ea oona ho motho. LumoSQL. Ka Pherekhong 2020, sengoli sa morero ona e ne e le Den Shearer hlahisitsoe ho LinuxConfAu.

LMDB e sebelisoa haholo-holo e le enjene ea lisebelisoa tsa lisebelisoa. Laeborari e tlameha ho hlaha ho bahlahisi Bula Open, ba neng ba sa khotsofala haholo ke BerkeleyDB e le motheo oa morero oa bona. Ho qala ka laebrari e itekanetseng btree, Howard Chu o ile a khona ho etsa e 'ngoe ea mekhoa e meng e tummeng ka ho fetisisa mehleng ea rona. O fane ka tlaleho ea hae e monate haholo pale ena, hammoho le sebopeho sa ka hare sa LMDB. "The Lightning Memory-mapped Database". Mohlala o motle oa ho hapa sebaka sa polokelo o ile oa arolelanoa ke Leonid Yuryev (aka yleo) ho tsoa ho Positive Technologies tlalehong ea hae ho Highload 2015 "Enjene ea LMDB ke 'mampoli ea khethehileng". Ho eona, o bua ka LMDB maemong a mosebetsi o ts'oanang oa ho kenya ts'ebetsong ReOpenLDAP, mme LevelDB e se e bile tlas'a nyatso ea papiso. Ka lebaka la ts'ebetsong, Positive Technologies e bile ea e-na le fereko e ntseng e hōla ka mafolofolo MDBX e nang le likarolo tse monate haholo, optimizations le li-bugfixes.

LMDB hangata e sebelisoa joalo ka polokelo. Ka mohlala, sebatli sa Mozilla Firefox khetha eona bakeng sa litlhoko tse 'maloa,' me, ho qala ka mofuta oa 9, Xcode khethang SQLite ea eona ea ho boloka li-index.

Enjene e boetse e entse letšoao lefatšeng la nts'etsopele ea mehala. Mesaletsa ea tšebeliso ea eona e ka ba ho fumana ho moreki oa iOS bakeng sa Telegraph. LinkedIn e ile ea fetela pele le ho feta mme ea khetha LMDB joalo ka polokelo ea kamehla bakeng sa moralo oa eona oa lehae oa polokelo ea data Rocket Data, eo ka eona bolelloa sengolong sa hae sa 2016.

LMDB e loanela ka katleho sebaka sa letsatsi sebakeng se siiloeng ke BerkeleyDB ka mor'a hore se be tlas'a taolo ea Oracle. Laebrari e ratoa ka lebelo la eona le ho tšepahala, esita le ha e bapisoa le lithaka tsa eona. Joalo ka ha u tseba, ha ho na lijo tsa mots'eare tsa mahala, 'me ke rata ho totobatsa khoebo eo u tla tlameha ho tobana le eona ha u khetha pakeng tsa LMDB le SQLite. Setšoantšo se ka holimo se bontša ka ho hlaka hore na lebelo le eketsehileng le finyelloa joang. Ntlha ea pele, ha re lefelle likarolo tse ling tsa ho tlosoa ka holim'a disk polokelo. Ho hlakile hore mohaho o motle o ntse o ke ke oa etsoa ntle le bona, 'me ka mokhoa o hlakileng o tla hlaha khoutu ea kopo, empa e tla ba e poteletseng haholo. Li ke ke tsa ba le likarolo tse sa hlokeng ts'ebeliso e itseng, mohlala, tšehetso ea lipotso ka puo ea SQL. Taba ea bobeli, hoa khonahala ho kenya ts'ebetsong 'mapa oa ts'ebetso ea ts'ebeliso ka likopo tsa polokelo ea disk. Haeba SQLite mosebetsing oa ka e itšetlehile ka litlhoko tse tloaelehileng tsa lipalo-palo tsa kopo e tloaelehileng, joale uena, joaloka moqapi oa kopo, u tseba hantle maemo a ka sehloohong a mosebetsi. Bakeng sa tharollo e hlahisang litholoana haholoanyane, o tla tlameha ho lefa theko e eketsehileng bakeng sa nts'etsopele ea tharollo ea pele le bakeng sa ts'ehetso ea eona e latelang.

3. Litšiea tse tharo tsa LMDB

Ka mor'a ho sheba LMDB ka leihlo la nonyana, e ne e le nako ea ho teba haholoanyane. Likarolo tse tharo tse latelang li tla neheloa tlhahlobong ea litšiea tse kholo tseo moaho oa polokelo o itšetlehileng ka tsona:

  1. Lifaele tse nang le 'mapa oa memori e le mokhoa oa ho sebetsa le disk le ho hokahanya likarolo tsa data tsa ka hare.
  2. B + -sefate e le mokhatlo oa sebopeho sa data e bolokiloeng.
  3. Copy-on-write e le mokhoa oa ho fana ka thepa ea transaction ea ACID le mefuta e mengata.

3.1. Leruarua #1. Lifaele tse entsoeng ka memori

Lifaele tse entsoeng ka 'mapa oa memori ke karolo ea bohlokoa ea meralo hoo li bileng li hlahang ka lebitso la polokelo. Mathata a caching le amahanyo ea phihlello ea tlhahisoleseling e bolokiloeng e tlohetsoe ka botlalo ho sistimi e sebetsang. LMDB ha e na li-cache ka hare ho eona. Ena ke qeto e hlokolosi ea mongoli, kaha ho bala data ka ho toba ho lifaele tse entsoeng ka 'mapa ho u lumella ho khaola likhutlo tse ngata ts'ebetsong ea enjene. Ka tlase ke lethathamo le felletseng la tse ling tsa tsona.

  1. Ho boloka botsitso ba data polokelong ha u sebetsa le eona ho tsoa lits'ebetsong tse 'maloa ho fetoha boikarabello ba sistimi e sebetsang. Karolong e latelang, mechanics ena e tšohloa ka botlalo le ka litšoantšo.
  2. Ho ba sieo ha li-cache ho felisa ka ho feletseng LMDB ho tloha holimo ho amanang le likabelo tse matla. Ho bala lintlha ka ts'ebetso ho bolela ho beha pointer atereseng e nepahetseng mohopolong oa sebele mme ha ho letho le leng hape. Ho utloahala eka ke tšōmo ea mahlale, empa ho khoutu ea mohloli oa polokelo li-call tsohle ho calloc li tsepamisitsoe mosebetsing oa tlhophiso ea polokelo.
  3. Ho ba sieo ha li-cache ho boetse ho bolela ho ba sieo ha linotlolo tse amanang le khokahano ea phihlello ea tsona. Babali, bao palo ea babali ba ka bang teng ka nako e le 'ngoe, ha ba kopane le semumu se le seng ha ba le tseleng ea ho ea data. Ka lebaka la sena, lebelo la ho bala le na le scalability e nepahetseng e ipapisitseng le palo ea li-CPU. Ho LMDB, ke ts'ebetso ea ho fetola feela e hokahanngoang. Ho ka ba le mongoli a le mong feela ka nako.
  4. Bonyane ba caching le synchronization logic bo felisa mofuta o rarahaneng haholo oa liphoso o amanang le ho sebetsa tikolohong e nang le likhoele tse ngata. Ho bile le lithuto tse peli tse khahlisang tsa database kopanong ea Usenix OSDI 2014: "Litsamaiso Tsohle tsa Lifaele ha lia bōptjoa li Lekana: Bothateng ba ho Etsa Likopo tse sa Tlisoang ke Crash" и "Litaba tsa tlhokofatso bakeng sa monate le phaello". Ho tsoa ho bona u ka fumana leseli mabapi le ts'epo e e-so ka e bonoa ea LMDB le ts'ebetsong e batlang e se na sekoli ea thepa ea transaction ea ACID, e phahametseng ea SQLite.
  5. The minimalism ea LMDB e lumella setšoantšo sa mochine oa khoutu ea eona hore e be teng ka ho feletseng ka har'a cache ea L1 ea processor e nang le litšobotsi tse latelang tsa lebelo.

Ka bomalimabe, ho iOS, ka lifaele tsa 'mapa oa mohopolo, ntho e' ngoe le e 'ngoe ha e na maru joalokaha re ka rata. Ho bua ka mefokolo e amanang le bona ka hloko, hoa hlokahala ho hopola melao-motheo e akaretsang ea ho kenya ts'ebetsong mokhoa ona lits'ebetsong tsa ts'ebetso.

Tlhahisoleseding e akaretsang mabapi le difaele tse entsweng ka memori

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOSKa ts'ebeliso e 'ngoe le e' ngoe e sebetsang, sistimi ea ts'ebetso e amahanya setheo se bitsoang ts'ebetso. Ts'ebetso e 'ngoe le e' ngoe e abetsoe mefuta e fapaneng ea liaterese moo e behang tsohle tseo e li hlokang ho sebetsa. Liatereseng tse tlaase ka ho fetisisa ho na le likarolo tse nang le khoutu le lintlha tse thata le lisebelisoa. Ka mor'a moo ho tla sebaka se ntseng se hola sa sebaka sa liaterese se matla, seo re se tsebang hantle tlasa lebitso la qubu. E na le liaterese tsa mekhatlo e hlahang nakong ea ts'ebetso ea lenaneo. Ka holimo ke sebaka sa memori se sebelisoang ke stack ea ts'ebeliso. E ea hola kapa ea etsa likonteraka; ka mantsoe a mang, boholo ba eona le eona e na le sebopeho se matla. Ho thibela qubu le qubu hore li se ke tsa sututsana le ho kena-kenana, li fumaneha lipheletsong tse fapaneng tsa sebaka sa aterese. Sistimi ea ts'ebetso e sebelisa liaterese karolong ena e bohareng ho hokahanya mekhatlo e fapaneng le ts'ebetso. Haholo-holo, e ka amahanya sete e itseng e tsoelang pele ea liaterese le faele e disk. Faele e joalo e bitsoa memory-mapped

Sebaka sa aterese se abetsoeng mokhoa ona se seholo. Ka khopolo, palo ea liaterese e lekanyelitsoe feela ke boholo ba pointer, e khethiloeng ke matla a fokolang a tsamaiso. Haeba mohopolo oa 'mele o ne o ka etsoa' mapa ho eona 1-to-1, joale ts'ebetso ea pele e ne e tla phahamisa RAM kaofela, 'me ho ne ho ke ke ha e-ba le puo ea ho etsa lintho tse ngata.

Leha ho le joalo, ho latela boiphihlelo ba rona rea ​​tseba hore lits'ebetso tsa sejoale-joale li ka etsa lits'ebetso tse ngata kamoo li batlang ka nako e le 'ngoe. Sena se ka etsahala ka lebaka la hore ba fana ka mohopolo o mongata feela ho lits'ebetso pampiring, empa ha e le hantle ba kenya mohopolong oa mantlha oa 'mele feela karolo eo e batloang mona le hona joale. Ka hona, mohopolo o amanang le ts'ebetso o bitsoa virtual.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Sistimi ea ts'ebetso e hlophisa mohopolo oa sebele le oa 'mele ka maqephe a boholo bo itseng. Hang ha leqephe le itseng la memori ea sebele le hlokahala, sistimi e sebetsang e e kenya mohopolong oa 'mele ebe e ba bapisa tafoleng e khethehileng. Haeba ho se na li-slots tsa mahala, joale e 'ngoe ea maqephe a kentsoeng pele e kopitsoa ho disk,' me e hlokahalang e nka sebaka sa eona. Mokhoa ona, oo re tla khutlela ho oona haufinyane, o bitsoa swapping. Setšoantšo se ka tlase se bontša mokhoa o hlalositsoeng. Ho eona, leqephe la A le nang le aterese 0 le ile la laeloa ’me la behoa leqepheng la sehlooho la memori le nang le aterese ea 4. ’Nete ena e ile ea bonahala lethathamong la ngollano la nomoro ea sele 0.​

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Pale e ts'oana hantle le lifaele tse kentsoeng mohopolong. Ka ho utloahalang, ho nahanoa hore li lula li le teng sebakeng sa aterese. Leha ho le joalo, ba kenya leqephe la memori ea 'mele ka leqephe le ka kopo feela. Phetoho ea maqephe a joalo e hokahanngoa le faele e ho disk. Ka tsela ena, o ka etsa faele ea I / O ka ho sebetsa feela ka li-byte mohopolong - liphetoho tsohle li tla fetisetsoa ka bohona ke kernel ea sistimi ho faele ea mohloli.

Setšoantšo se ka tlase se bontša kamoo LMDB e hokahanyang boemo ba eona ha e sebetsa le database ho tsoa lits'ebetsong tse fapaneng. Ka ho etsa 'mapa oa mohopolo oa lits'ebetso tse fapaneng faeleng e le' ngoe, re tlama sistimi ea ts'ebetso ho hokahanya li-block tsa libaka tsa bona tsa liaterese, moo LMDB e shebahalang teng.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ntho ea bohlokoa ke hore LMDB, ka ho sa feleng, e fetola faele ea data ka mochine oa mohala oa ho ngola, 'me e hlahisa faele ka boeona ka mokhoa oa ho bala feela. Mokhoa ona o na le liphello tse peli tsa bohlokoa.

Phello ea pele e tloaelehile ho litsamaiso tsohle tsa ts'ebetso. Ntho ea bohlokoa ea eona ke ho eketsa tšireletso khahlanong le tšenyo e sa reroang ho database ka khoutu e fosahetseng. Joalo ka ha u tseba, litaelo tse phethiloeng tsa ts'ebetso li lokolohile ho fihlella data ho tsoa kae kapa kae sebakeng sa eona sa aterese. Ka nako e ts'oanang, joalo ka ha re sa tsoa hopola, ho bonts'a faele ka mokhoa oa ho bala ho bolela hore taelo efe kapa efe e ka e fetola. Haeba a etsa sena ka phoso, a leka, ho etsa mohlala, ho hlakola ntho e 'ngoe le e 'ngoe ho index e seng teng, a ka fetola ka phoso faele e entsoeng atereseng ena, e leng se tla lebisa bobolung ba database. Haeba faele e bontšoa ka mokhoa oa ho bala feela, joale teko ea ho fetola sebaka sa aterese e lumellanang e tla lebisa ho felisoa ha tšohanyetso ha lenaneo ka pontšo. SIGSEGV, mme faele e tla lula e le joalo.

Sephetho sa bobeli se se se tobile ho iOS. Leha e le sengoli kapa mehloli e meng ha e e bue ka ho hlaka, empa ntle le eona LMDB e ka se be e loketseng ho sebetsa ho sistimi ena ea ts'ebetso ea mehala. Karolo e latelang e lebisitsoe tlhokomelong ea eona.

Lintlha tse qaqileng tsa lifaele tse entsoeng ka memori ho iOS

Ho bile le tlaleho e ntle ho WWDC ka 2018 "iOS Memory Deep Dive". E re bolella hore ho iOS, maqephe ohle a fumanehang mohopolong oa 'mele ke o mong oa mefuta e 3: e litšila, e hatelitsoeng ebile e hloekile.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Memori e hloekileng ke pokello ea maqephe a ka theoleloang ntle le bohloko mohopolong oa 'mele. Lintlha tseo li nang le tsona li ka kenngoa hape ha ho hlokahala ho tsoa mehloling ea eona ea mantlha. Lifaele tsa memori tse baloang feela li oela sehlopheng sena. iOS ha e tšabe ho laolla maqephe a kentsoeng faeleng ho tsoa mohopolong ka nako efe kapa efe, kaha li netefalitsoe hore li tla hokahanngoa le faele e ho disk.

Maqephe ohle a fetotsoeng a qetella a le mohopolong o litšila, ho sa tsotellehe hore na a ne a le hokae qalong. Haholo-holo, lifaele tsa 'mapa oa memori tse fetotsoeng ka ho ngolla mohopolong o amanang le tsona li tla hlophisoa ka tsela ena. Ho bula LMDB ka folakha MDB_WRITEMAP, ka mor'a ho etsa liphetoho ho eona, u ka netefatsa sena ka bouena

Hang ha ts'ebeliso e qala ho nka mohopolo o mongata haholo, iOS e e beha tlas'a khatello ea leqephe le litšila. Kakaretso ea memori e kentsoeng ke maqephe a litšila le a petelitsoeng e etsa seo ho thoeng ke mohopolo oa mohopolo oa ts'ebeliso. Hang ha e fihla boleng bo itseng, daemon ea "OOM killer system" e tla kamora ts'ebetso ebe e e felisa ka likhoka. Ena ke eona e ikhethang ea iOS ha e bapisoa le lits'ebetso tsa desktop. Ka lehlakoreng le leng, ho fokotsa sebaka sa mohopolo ka ho fapanyetsana maqephe ho tloha mohopolong oa 'mele ho ea ho disk ha ho fanoe ka iOS. Mabaka a ka hakanyetsoa feela. Mohlomong ts'ebetso ea ho tsamaisa maqephe ka matla ho disk le morao e ja matla haholo bakeng sa lisebelisoa tsa mehala, kapa iOS e boloka mohloli oa ho ngola lisele ho li-drive tsa SSD, kapa mohlomong baqapi ba ne ba sa khotsofala ke ts'ebetso e akaretsang ea sistimi, moo ntho e ngoe le e ngoe e leng teng. ho fapanyetsana kamehla. Leha ho ka ba joalo, 'nete e ntse e le 'nete.

Litaba tse monate, tse seng li boletsoe pejana, ke hore LMDB ka boiketsetso ha e sebelise mochine oa mmap ho ntlafatsa lifaele. Sena se bolela hore data e bonts'itsoeng e khetholloa ke iOS e le memori e hloekileng 'me ha e kenye letsoho molemong oa mohopolo. U ka netefatsa sena u sebelisa sesebelisoa sa Xcode se bitsoang VM Tracker. Setšoantšo se ka tlase se bonts'a boemo ba memori ea iOS ea sesebelisoa sa Cloud nakong ea ts'ebetso. Qalong, maemo a 2 a LMDB a ile a qalisoa ho eona. Ea pele e ile ea lumelloa ho hlahisa faele ea hae ho 1GiB ea memori ea sebele, ea bobeli - 512MiB. Ho sa tsotellehe 'nete ea hore ka bobeli storages nka palo e itseng ea memori ea moahi, ha ho le ea mong oa bona ea fanang ka boholo bo litšila.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Mme jwale ke nako ya ditaba tse mpe. Ka lebaka la mochine oa swap ho li-desktop tsa 64-bit, ts'ebetso e 'ngoe le e' ngoe e ka nka sebaka se lekaneng sa aterese kamoo sebaka sa mahala sa disk sa mahala bakeng sa phetoho e ka bang teng se lumella. Ho fetola swap ka compression ho iOS ho fokotsa boholo ba theory. Hona joale lits'ebetso tsohle tse phelang li tlameha ho kenella mohopolong oa mantlha (bala oa RAM), 'me tsohle tse sa lumellaneng li tlameha ho qobelloa ho emisa. Sena se boletsoe joalokaha ho boletsoe ka holimo tlalehale ho litokomane tsa molao. Ka lebaka leo, iOS e fokotsa haholo palo ea memori e fumanehang bakeng sa kabo ka mmap. Mona mona U ka sheba meeli e matla ea palo ea memori e ka abeloang lisebelisoa tse fapaneng ho sebelisa mohala ona oa sistimi. Mehlala ea morao-rao ea li-smartphone, iOS e fetohile e fanang ka seatla se bulehileng ka li-gigabyte tse 2, 'me ka holim'a liphetolelo tse ka holimo tsa iPad - ka 4. Ha e le hantle, u lokela ho tsepamisa maikutlo ho lisebelisoa tse tlaase ka ho fetisisa tse tšehetsoeng, moo ntho e 'ngoe le e' ngoe e leng bohloko haholo. Ho hobe le ho feta, ka ho sheba boemo ba mohopolo oa ts'ebeliso ho VM Tracker, u tla fumana hore LMDB e hole le eona feela e ipolelang hore e na le mohopolo. Likotoana tse ntle li jeoa ke baabi ba sistimi, lifaele tsa lisebelisoa, meralo ea litšoantšo le libatana tse ling tse nyane.

Ho ipapisitsoe le liphetho tsa liteko ho Cloud, re fihlile ho litekanyetso tse latelang tsa ho sekisetsa mohopolong o fanoeng ke LMDB: 384 megabytes bakeng sa lisebelisoa tsa 32-bit le 768 bakeng sa lisebelisoa tsa 64-bit. Kamora hore molumo ona o sebelisoe, ts'ebetso efe kapa efe ea ho fetola e qala ho fela ka khoutu MDB_MAP_FULL. Re bona liphoso tse joalo ka leihlo la rona, empa li nyane hoo mothating ona li ka hlokomolohuoang.

Lebaka le sa hlakang la tšebeliso e feteletseng ea memori ke polokelo e ka ba litšebelisano tsa nako e telele. Ho utloisisa hore na liketsahalo tsena tse peli li hokahane joang, re tla thusoa ke ho nahana ka litšiea tse peli tse setseng tsa LMDB.

3.2. Leruarua #2. B+-sefate

Ho etsisa litafole ka holim'a polokelo ea boleng ba bohlokoa, ts'ebetso e latelang e tlameha ho ba teng ho API ea eona:

  1. Ho kenya elemente e ncha.
  2. Batla element ka senotlolo se fanoeng.
  3. Ho tlosa element.
  4. Hlophisa ka linako tse ling tsa linotlolo ka tatellano ea tsona.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOSSebopeho se bonolo ka ho fetisisa sa data se ka phethahatsang ts'ebetso eohle e mene habonolo ke sefate sa ho batla sa binary. E 'ngoe le e' ngoe ea li-node tsa eona e emela senotlolo se arolang karoloana eohle ea linotlolo tsa bana ka li-subtrees tse peli. Ka ho le letšehali ho na le tse nyenyane ho feta motsoali, ’me ka ho le letona ho na le tse khōloanyane. Ho fumana sete e hlophisitsoeng ea linotlolo ho finyelloa ka e 'ngoe ea litsela tsa khale tsa lifate

Lifate tsa Binary li na le mefokolo e 'meli ea mantlha e li thibelang ho sebetsa joalo ka sebopeho sa data se thehiloeng ho disk. Taba ea pele, tekanyo ea ho leka-lekana ha bona ha e tsejoe esale pele. Ho na le kotsi e kholo ea ho fumana lifate moo bophahamo ba makala a fapaneng bo ka fapanang haholo, e leng ho mpefatsang ho rarahana ha algorithmic ha ho bapisoa le se lebelletsoeng. Taba ea bobeli, bongata ba likhokahano lipakeng tsa li-node bo amoha lifate tsa binary tsa sebaka mohopolong.Li-node tse koalehileng (ho ea ka likhokahano lipakeng tsa tsona) li ka fumaneha maqepheng a fapaneng ka ho felletseng mohopolong oa sebele. Ka lebaka leo, esita le ho haola ho bonolo ha li-node tse 'maloa tse haufi sefateng ho ka hloka ho etela palo e lekanang ea maqephe. Ena ke bothata esita le ha re bua ka katleho ea lifate tsa binary e le mohaho oa boitsebiso ba mohopolong, kaha maqephe a lulang a potoloha ka har'a cache ea processor ha se monyaka o theko e tlaase. Ha ho tluoa khafetsa ho khutlisa maqephe a amanang le li-node ho tsoa ho disk, boemo bo fetoha ka botlalo nyatsehang.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOSLifate tsa B, e leng phetoho ea lifate tsa binary, li rarolla mathata a boletsoeng serapeng se fetileng. Taba ea pele, ba ikemela. Taba ea bobeli, e 'ngoe le e' ngoe ea li-node tsa bona e arola sete ea linotlolo tsa bana eseng ho 2, empa ho li-subsets tse laetsoeng ke M, mme palo ea M e ka ba kholo haholo, ka tatellano ea makholo a 'maloa, kapa esita le likete.

Ka hona:

  1. Node e 'ngoe le e' ngoe e na le linotlolo tse ngata tse seng li laetsoe 'me lifate li khutšoanyane haholo.
  2. Sefate se fumana thepa ea sebaka sa sebaka ka mohopolo, kaha linotlolo tse haufi le boleng li fumaneha ka tlhaho haufi le tse ling ka li-node tse tšoanang kapa tsa boahelani.
  3. Palo ea li-transit nodes ha u theoha sefate nakong ea ts'ebetso ea ho batla e fokotsehile.
  4. Palo ea li-node tse baloang nakong ea lipotso tse fapaneng li fokotsehile, kaha e 'ngoe le e' ngoe ea tsona e se e na le linotlolo tse ngata tse laetsoeng.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

LMDB e sebelisa phapang ea sefate sa B se bitsoang B+ sefate ho boloka data. Setšoantšo se ka holimo se bontša mefuta e meraro ea li-node tse teng ho eona:

  1. Ka holimo ke motso. Ha e sebetse letho haese mohopolo oa database ka har'a ntlo ea polokelo. Ka ketsahalo e le 'ngoe ea LMDB, u ka theha li-database tse' maloa tse arolelanang sebaka sa aterese sa 'mapa. E 'ngoe le e' ngoe ea tsona e qala ka metso ea eona.
  2. Boemong bo tlaase ka ho fetisisa ke makhasi. Ke tsona feela tse nang le lipara tsa bohlokoa tse bolokiloeng polokelong ea litaba. Ka tsela, ena ke eona e ikhethang ea lifate tsa B +. Haeba mabenkele a tloaelehileng a B-tree a na le likarolo tsa bohlokoa ho li-node tsa maemo ohle, joale phapang ea B + e tlaase ka ho fetisisa. Ha re se re lokisitse taba ena, re tla bitsa mofuta o monyane oa sefate se sebelisoang ho LMDB feela sefate sa B.
  3. Pakeng tsa motso le makhasi ho na le maemo a 0 kapa ho feta a tekheniki a nang le node ea ho tsamaea (ea lekala). Mosebetsi oa bona ke ho arola sete e hlophisitsoeng ea linotlolo pakeng tsa makhasi.

Ka 'mele, li-node ke li-blocks tsa bolelele bo reriloeng esale pele. Boholo ba bona ke boholo ba boholo ba maqephe a memori tsamaisong ea ts'ebetso, eo re buileng ka eona ka holimo. Sebopeho sa node se bontšitsoe ka tlase. Sehlooho se na le tlhahisoleseding ea meta, e totobetseng ka ho fetisisa eo ka mohlala e leng checksum. Ho latelang ho tla tlhahisoleseling mabapi le li-offsets tseo lisele tse nang le data li leng ho tsona. Lintlha e ka ba linotlolo, haeba re bua ka li-node tsa ho tsamaea, kapa lipara tse feletseng tsa bohlokoa tabeng ea makhasi. "Tlhahlobo ea Mabenkele a Boleng ba Ts'ebetso e Phahameng".

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ha re se re sebetsane le litaba tsa kahare tsa li-node tsa maqephe, re tla tsoela pele ho emela sefate sa LMDB B ka mokhoa o nolofalitsoeng ka mokhoa o latelang.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Maqephe a nang le li-node a fumaneha ka tatellano ho disk. Maqephe a nang le linomoro tse holimo a fumaneha qetellong ea faele. Seo ho thoeng ke leqephe la meta le na le tlhahisoleseling mabapi le li-offsets tseo metso ea lifate tsohle e ka fumanoang ka tsona. Ha o bula faele, LMDB e hlahloba leqephe la faele ka leqephe ho tloha qetellong ho ea qalong ho batla leqephe le nepahetseng la meta mme ka eona e fumana li-database tse teng.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Joale, ha re na le mohopolo oa sebopeho se hlakileng le sa 'mele sa mokhatlo oa data, re ka tsoela pele ho nahana ka tšiea ea boraro ea LMDB. Ke ka thuso ea eona hore liphetoho tsohle tsa polokelo li etsahala ka transactional le ka thōko ho tse ling, ho fana ka database ka kakaretso thepa ea multiversion.

3.3. Leruarua #3. Kopitsa-ngola

Mesebetsi e meng ea sefate sa B e kenyelletsa ho etsa letoto la liphetoho ho li-node tsa eona. Mohlala o mong ke ho eketsa senotlolo se secha ho node e seng e fihletse boholo ba eona. Tabeng ena, hoa hlokahala, pele, ho arola node ka bobeli, 'me ea bobeli, ho eketsa sehokelo ho node e ncha ea ngoana ho motsoali oa eona. Mokhoa ona o ka ba kotsi haholo. Haeba ka lebaka le itseng (ho senyeha, ho tima matla, joalo-joalo) karolo feela ea liphetoho tse tsoang letotong li etsahala, joale sefate se tla lula se le boemong bo sa tsitsang.

Tharollo e le 'ngoe ea setso bakeng sa ho etsa hore database e se ke ea mamella liphoso ke ho eketsa sebopeho sa data ho disk haufi le B-tree - log ea transaction, e tsejoang hape e le "write-ahead log" (WAL). Ke faele qetellong eo ts'ebetso e reretsoeng e ngotsoeng ka thata pele e fetola B-sefate ka boeona. Kahoo, haeba bobolu ba data bo fumanoa nakong ea ho itlhahloba, database e buisana le log ho ipeha ka tatellano.

LMDB e khethile mokhoa o fapaneng e le mokhoa oa eona oa ho mamella liphoso, o bitsoang copy-on-write. Taba ea mantlha ke hore ho e-na le ho ntlafatsa datha leqepheng le seng le ntse le le teng, e qala ho e kopitsa ka botlalo ebe e etsa liphetoho tsohle kopi.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ka mor'a moo, e le hore data e nchafalitsoeng e fumanehe, hoa hlokahala ho fetola sehokelo ho node e seng e le teng sebakeng sa eona sa motsoali. Kaha e boetse e hloka ho fetoloa bakeng sa sena, e boetse e kopitsoa esale pele. Ts'ebetso e tsoela pele ka ho pheta-pheta ho ea fihla motsong. Ntho ea ho qetela eo u ka e fetolang ke data e leqepheng la meta

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Haeba ka tšohanyetso ts'ebetso e senyeha nakong ea ts'ebetso ea ntlafatso, joale leqephe le lecha la meta le ke ke la bōptjoa, kapa le ke ke la ngoloa ho disk ka ho feletseng, 'me checksum ea eona e tla fosahetse. Ho e 'ngoe ea linyeoe tsena tse peli, maqephe a macha a ke ke a fumaneha, empa a khale a ke ke a ameha. Sena se felisa tlhoko ea LMDB ho ngola esale pele ho boloka botsitso ba data. Ha e le hantle, sebopeho sa polokelo ea data ho disk e hlalositsoeng ka holimo ka nako e le 'ngoe se nka mosebetsi oa sona. Ho ba sieo ha lethathamo le hlakileng la transaction ke e 'ngoe ea likarolo tsa LMDB tse fanang ka lebelo le phahameng la ho bala data.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Moralo o hlahisitsoeng, o bitsoang append-only B-tree, ka tlhaho o fana ka karohano ea transaction le mefuta e mengata. Ho LMDB, khoebo e 'ngoe le e' ngoe e bulehileng e amahanngoa le motso oa sefate o sebetsang hona joale. Ho fihlela transaction e phethetsoe, maqephe a sefate se amanang le sona a ke ke a fetoloa kapa a sebelisoa hape bakeng sa mefuta e mecha ea data. Kahoo, o ka sebetsa nako e telele kamoo o ratang ka sete ea data e neng e sebetsa ka nako eo. transaction e ile ea buloa, le haeba polokelo e tsoela pele ho ntlafatsoa ka mafolofolo ka nako ena. Sena ke motheo oa mefuta e mengata, e etsang LMDB mohloli o nepahetseng oa data bakeng sa baratuoa ba rona UICollectionView. Ha u se u buletse transaction, ha ho na tlhoko ea ho eketsa mohopolo oa mohopolo oa ts'ebeliso ka ho pompa data ea morao-rao ka har'a sebopeho se seng sa mohopolo, ka lebaka la ho tšaba ho sala u se na letho. Karolo ena e khetholla LMDB ho SQLite e tšoanang, e ke keng ea ithorisa ka ho itšehla thajana ka botlalo. Ka mor'a ho bula litšebelisano tse peli ho qetela le ho hlakola tlaleho e itseng ka har'a e 'ngoe ea tsona, ho ke ke ha hlola ho khoneha ho fumana tlaleho e tšoanang ka har'a ea bobeli e setseng.

Lehlakore le lecha la chelete ea tšepe ke tšebeliso e phahameng haholo ea mohopolo oa sebele. Slide e bonts'a hore na sebopeho sa polokelo ea polokelo se tla shebahala joang ha se ka fetoloa ka nako e le 'ngoe le li-transactions tse 3 tse bulehileng tse shebileng mefuta e fapaneng ea polokelo. Kaha LMDB ha e khone ho sebelisa li-node tse fumanehang ho tloha metsong e amanang le litšebelisano tsa morao-rao, lebenkele ha le na boikhethelo haese ho fana ka motso o mong oa bone mohopolong le ho kopanya maqephe a fetotsoeng tlas'a eona.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Mona ho ka ba molemo ho hopola karolo ea lifaele tse entsoeng ka memori. Ho bonahala eka tšebeliso e eketsehileng ea memori ea sebele ha ea lokela ho re tšoenya haholo, kaha ha e kenye letsoho mohopolong oa mohopolo oa kopo. Leha ho le joalo, ka nako e ts'oanang, ho ile ha hlokomeloa hore iOS e senya haholo ha e fana ka eona, 'me re ke ke ra khona, joaloka seva kapa komporong, ho fana ka sebaka sa LMDB sa 1 terabyte mme re sa nahane ka tšobotsi ena ho hang. Haeba ho khonahala, o lokela ho leka ho etsa hore nako ea bophelo bohle ba li-transaction e be khuts'oane ka moo ho ka khonehang.

4. Ho theha schema ea data ka holim'a API ea bohlokoa-boleng

Ha re qaleng tlhahlobo ea rona ea API ka ho sheba lintlha tsa mantlha tse fanoeng ke LMDB: tikoloho le database, linotlolo le boleng, litšebelisano le li-cursor.

Molaetsa o mabapi le manane a khoutu

Mesebetsi eohle ho LMDB API ea sechaba e khutlisetsa sephetho sa mosebetsi oa bona ka mokhoa oa khoutu ea phoso, empa lethathamong lohle le latelang netefatso ea eona e siiloe molemong oa bokhutšoane. fereko C ++ wrappers lmdbxx, moo liphoso li hlahisoang e le mekhelo ea C++.

E le mokhoa o potlakileng oa ho hokahanya LMDB morerong oa iOS kapa macOS, ke khothaletsa CocoaPod ea ka POSLMDB.

4.1. Lintlha tsa motheo

Tikoloho

sebopeho sa MDB_env ke polokelo ea boemo ba ka hare ba LMDB. Lelapa la ts'ebetso ea prefixed mdb_env e o lumella ho hlophisa tse ling tsa thepa ea eona. Boemong bo bonolo, ho qalisoa ha enjene ho shebahala tjena.

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

Ts'ebelisong ea Cloud ea Mail.ru, re fetotse boleng ba kamehla ba li-parameter tse peli feela.

Ea pele ke boholo ba sebaka sa aterese sa sebele seo faele ea polokelo e entsoeng ho sona. Ka bomalimabe, esita le sesebelisoa se le seng, boleng bo khethehileng bo ka fapana haholo ho tloha ho matha ho ea ho matha. Ho ela hloko tšobotsi ena ea iOS, palo e kholo ea polokelo e khethoa ka matla. Ho qala ho boleng bo itseng, e arotsoe ka ho latellana ho fihlela mosebetsi mdb_env_open e ke ke ea khutlisa sephetho se fapaneng le ENOMEM. Ka khopolo, ho boetse ho na le tsela e fapaneng - qala ka ho fana ka bonyane ba mohopolo ho enjene, ebe, ha liphoso li amoheloa, MDB_MAP_FULL, e eketse. Leha ho le joalo, e meutloa le ho feta. Lebaka ke hore ts'ebetso ea ho arolelana mohopolo hape (map) o sebelisa ts'ebetso mdb_env_set_map_size e thibela mekhatlo eohle (li-cursor, transactions, linotlolo le litekanyetso) tse fumanoeng pele ho tsoa enjeneng. Ho nka phetoho ena ea liketsahalo ho khoutu ho tla lebisa mathateng a eona a bohlokoa. Haeba, leha ho le joalo, mohopolo oa sebele o bohlokoa haholo ho uena, joale sena e ka 'na ea e-ba lebaka la ho shebisisa fereko e tsoileng pele. MDBX, moo har'a likarolo tse phatlalalitsoeng ho nang le "tokiso ea boholo ba database ea othomathiki ea on-the-fly".

Paramethara ea bobeli, boleng ba eona ba kamehla bo neng bo sa re tšoanele, e laola metjhini ea ho netefatsa polokeho ea likhoele. Ka bomalimabe, bonyane iOS 10 e na le mathata a tšehetso bakeng sa polokelo ea lehae. Ka lebaka lena, mohlaleng o ka holimo, sebaka sa polokelo se buloa ka folakha MDB_NOTLS. Ho phaella ho sena, ho ne ho boetse ho hlokahala fereko Sekoahelo sa C ++ lmdbxxho seha diphapano tse nang le semelo sena le ho sona.

Databases

Database ke mohlala o fapaneng oa sefate sa B, seo re se buileng ka holimo. Ho buleha ha eona ho etsahala ka har'a khoebo, e ka 'nang ea bonahala e makatsa qalong.

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

Ehlile, transaction ho LMDB ke setsi sa polokelo, eseng setheo se ikhethileng sa polokelo ea litaba. Khopolo ena e u lumella ho etsa ts'ebetso ea athomo ho mekhatlo e fumanehang litsing tse fapaneng. Ka khopolo, sena se bula monyetla oa ho etsa litafole tsa mohlala ka mokhoa oa li-database tse fapaneng, empa ka nako e 'ngoe ke ile ka nka tsela e fapaneng, e hlalositsoeng ka botlalo ka tlase.

Linotlolo le litekanyetso

sebopeho sa MDB_val mehlala ea khopolo ea bobeli senotlolo le boleng. Sebaka sa polokelo ha se tsebe letho ka semantics ea bona. Ho eena, ntho e 'ngoe ke letoto la li-byte tsa boholo bo fanoeng. Boholo ba boholo ba senotlolo ke li-byte tse 512.

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

Ka ho sebelisa papiso, lebenkele le hlophisa linotlolo ka tatellano e nyolohang. Haeba u sa e nkele sebaka ka ea hau, joale ho tla sebelisoa e sa fetoheng, e li hlophisang ka tatellano ea mantsoe.

Litšebelisano

Sebopeho sa transaction se hlalositsoe ka botlalo ho khaolo e fetileng, kahoo mona ke tla pheta ka bokhutšoanyane thepa ea bona ea mantlha:

  1. E ts'ehetsa thepa eohle ea mantlha ACID: atomicity, consistency, ho itšehla thajana le ho tšepahala. Ha ke tsebe ho hlokomela hore ho na le phoso mabapi le ho tšoarella ho macOS le iOS e neng e behiloe ho MDBX. U ka bala haholoanyane ho bona README.
  2. Mokhoa oa ho bala mefuta e mengata o hlalosoa ke "mongoli a le mong / babali ba bangata". Bangodi ba a thibana, empa le se ke la thibela babadi. Babali ha ba thibele bangodi kapa ba bang.
  3. Ts'ehetso bakeng sa litšebelisano tse entsoeng sehlaheng.
  4. Tšehetso ea mefuta e mengata.

Multiversion ho LMDB e ntle hoo ke batlang ho e bontša ka liketso. Ho tsoa ho khoutu e ka tlase u ka bona hore ts'ebetso e 'ngoe le e' ngoe e sebetsa hantle le mofuta oa database o neng o le teng nakong eo o neng o buloa, o arohane ka ho felletseng le liphetoho tsohle tse latelang. Ho qala polokelo le ho eketsa tlaleho ea teko ho eona ha e emele ntho leha e le efe e thahasellisang, kahoo litloaelo tsena li sala tlas'a mohatelli.

Ho eketsa tlhahiso ea teko

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

Ke khothaletsa hore o leke leqheka le tšoanang le SQLite mme o bone se etsahalang.

Multiversion e tlisa lintho tse ntle haholo bophelong ba moqapi oa iOS. U sebelisa thepa ena, u ka khona ho fetola habonolo le ka tlhaho sekhahla sa ntlafatso ea mohloli oa data bakeng sa liforomo tsa skrine, ho ipapisitse le lintlha tsa boiphihlelo ba mosebelisi. Mohlala, ha re nkeng karolo ea sesebelisoa sa Cloud sa Mail.ru joalo ka ho jarolla litaba ka bohona ho tsoa setsing sa pokello ea litaba. Ka khokahano e ntle, moreki o khona ho eketsa linepe tse 'maloa motsotsoana ho seva. Haeba u ntjhafatsa ka mora download e nngwe le e nngwe UICollectionView ka litaba tsa mecha ea litaba lerung la mosebelisi, o ka lebala ka 60fps le ho tsamaisetsa hantle nakong ea ts'ebetso ena. Ho thibela liapdeite tsa skrineng khafetsa, o hloka ho fokotsa sekhahla seo data e fetohang ho sona UICollectionViewDataSource.

Haeba database e sa tšehetse mefuta e mengata 'me e u lumella ho sebetsa feela le boemo ba hona joale, joale ho etsa setšoantšo se tsitsitseng sa data seo u se hlokang ho se kopitsa ho ba bang ba memori ea memori kapa tafoleng ea nakoana. E 'ngoe ea mekhoa ena e theko e boima haholo. Tabeng ea polokelo ea mohopolo, re fumana litšenyehelo ka mohopolong, tse bakoang ke ho boloka lintho tse hahiloeng, 'me ha nako e ntse e ea, tse amanang le liphetoho tse sa hlokahaleng tsa ORM. Ha e le tafole ea nakoana, ena ke monyaka o theko e boima le ho feta, o utloahala feela maemong a sa reng letho.

Tharollo ea mefuta e mengata ea LMDB e rarolla bothata ba ho boloka mohloli oa data o tsitsitseng ka tsela e ntle haholo. Ho lekane feela ho bula transaction le voila - ho fihlela re e phethela, sete ea data e netefalitsoe hore e tla lokisoa. Monahano oa lebelo la ntlafatso ea eona o se o le matsohong a sethala sa tlhahiso, ha ho na lisebelisoa tse ngata tsa bohlokoa.

Lirohaka

Li-cursors li fana ka mokhoa oa ho pheta-pheta ka mokhoa o hlophisehileng holim'a lipara tsa bohlokoa ka ho tšela sefate sa B. Ntle le bona, ho ne ho ke ke ha khoneha ho etsa mohlala oa litafole ka har'a database, tseo hona joale re retelehelang ho tsona.

4.2. Tafole Modeling

Thepa ea ho odara ea bohlokoa e u fa monyetla oa ho aha sekhetho sa boemo bo holimo joalo ka tafole ka holim'a lintlha tsa mantlha. Ha re nahaneng ka ts'ebetso ena re sebelisa mohlala oa tafole e kholo ea moreki oa leru, e bolokang tlhahisoleseling mabapi le lifaele le lifoldara tsohle tsa mosebelisi.

Letlapa la schema

E 'ngoe ea maemo a tloaelehileng ao sebopeho sa tafole se nang le sefate sa foldara se lokelang ho etsoa ke khetho ea likarolo tsohle tse fumanehang ka har'a bukana e fanoeng. Lethathamo la ho tloaela. Ho e kenya ts'ebetsong ka holim'a polokelo ea bohlokoa ea bohlokoa, hoa hlokahala ho hlophisa linotlolo tsa lifaele le lifoldara ka tsela eo li arotsoeng ho latela litho tsa tsona bukeng ea motsoali. Ntle le moo, bakeng sa ho bonts'a litaba tsa bukana ka mokhoa o tloaelehileng ho mosebelisi oa Windows (lifoldara tsa pele, ebe lifaele, ka bobeli li hlophisitsoe ka alfabeta), hoa hlokahala ho kenyelletsa likarolo tse ling tse amanang le senotlolo.

Setšoantšo se ka tlase se bontša kamoo, ho ipapisitse le mosebetsi o etsoang, setšoantšo sa linotlolo ka mokhoa oa "byte array" se ka shebahalang joalo. Li-byte tse nang le sekhetho sa bukana ea motsoali (khubelu) li behiloe pele, ebe ka mofuta (motala) le mohatleng o nang le lebitso (putsoa). mokhoa o hlokahalang. Likonopo tse tsamaeang ka tatellano tse nang le sehlomathiso se sefubelu se tšoanang li re fa boleng ba tsona bo amanang le tatellano eo li lokelang ho hlahisoa ka har'a sebopeho sa mosebelisi (ka ho le letona), ntle le ho hloka ts'ebetso e 'ngoe ea morao-rao.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ho boloka Linotlolo le Maemo

Mekhoa e mengata ea ho kopanya lintho e qapiloe lefatšeng. Kaha re ne re se na tlhokahalo e 'ngoe ntle le lebelo, re ile ra ikhethela lebelo ka ho fetisisa - ho lahla mohopolo o tšoaretsoeng ke mohlala oa sebopeho sa puo ea C. Ka hona, senotlolo sa karolo ea directory se ka etsoa ka mokhoa o latelang. NodeKey.

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

Ho boloka NodeKey polokelong e hlokahalang nthong MDB_val beha pontshi ya data atereseng ea tšimoloho ea sebopeho, 'me u bale boholo ba tsona ka mosebetsi sizeof.

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

Khaolong ea pele ea mekhoa ea khetho ea database, ke boletse ho fokotsa likabelo tse matla ka har'a ts'ebetso ea CRUD e le ntlha ea bohlokoa ea khetho. Khoutu ea tšebetso serialize e bontša kamoo tabeng ea LMDB li ka qojoang ka ho feletseng ha li kenya litlaleho tse ncha polokelong ea boitsebiso. Li-byte tse kenang ho tsoa ho seva li qala ka ho fetoloa hore e be li-stack structures, ebe li lahleloa ka har'a polokelo. Ha u nahana hore hape ha ho na likabelo tse matla ka hare ho LMDB, u ka fumana boemo bo monate ka litekanyetso tsa iOS - sebelisa mohopolo oa "stack" feela ho sebetsa le data tseleng eohle ho tloha marang-rang ho ea ho disk!

Ho laela linotlolo tse nang le papiso ea binary

Kamano ea bohlokoa ea taelo e hlalosoa ke mosebetsi o khethehileng o bitsoang comparator. Kaha enjene ha e tsebe letho ka semantics ea li-byte tseo li nang le tsona, motho ea bapisang kamehla ha a na boikhethelo haese ho hlophisa linotlolo ka tatellano ea li-lexicographic, a sebelisa papiso ea byte-byte. Ho e sebelisa ho hlophisa meaho ho tšoana le ho kuta ka selepe se remang. Leha ho le joalo, maemong a bonolo ke fumana mokhoa ona o amoheleha. Mokhoa o mong o hlalositsoe ka tlase, empa mona ke tla hlokomela liraka tse 'maloa tse hasaneng tseleng ena.

Ntho ea pele eo u lokelang ho e hopola ke setšoantšo sa memori sa mefuta ea khale ea data. Ka hona, lisebelisoa tsohle tsa Apple, mefuta e mengata e bolokiloe ka sebopeho Endian e monyane. Sena se bolela hore li-byte tsa bohlokoa haholo li tla ba ka ho le letšehali, 'me ho ke ke ha khoneha ho hlophisa lipalo ho sebelisa papiso ea byte-byte. Ka mohlala, ho leka ho etsa sena ka palo ea linomoro ho tloha ho 0 ho ea ho 511 ho tla hlahisa sephetho se latelang.

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

Ho rarolla bothata bona, lipalo-palo li tlameha ho bolokoa ka senotlolo ka mokhoa o loketseng sebali sa li-byte-byte. Mesebetsi e tsoang ho lelapa e tla u thusa ho etsa phetoho e hlokahalang hton* (ka ho khetheha htons bakeng sa linomoro tse peli-byte ho tloha mohlaleng).

Sebopeho sa ho emela likhoele lenaneong ke, joalo ka ha u tseba, kaofela histori. Haeba semantics ea likhoele, hammoho le khouto e sebelisoang ho li emela mohopolong, li fana ka maikutlo a hore ho ka ba le li-byte tse fetang bonngoe ka sebopeho se le seng, ho molemo ho lahla hanghang mohopolo oa ho sebelisa sebali sa kamehla.

Ntho ea bobeli eo u lokelang ho e hopola ke melao-motheo ea ho tsamaisana sebopeho sa tšimo mokopanyi. Ka lebaka la bona, li-byte tse nang le litekanyetso tsa lithōle li ka thehoa mohopolong pakeng tsa masimo, ao, ehlile, a senyang ho hlopha li-byte-byte. Ho felisa lithōle, o hloka ho phatlalatsa masimo ka tatellano e hlakileng, ho boloka melao ea ho lokisoa kelellong, kapa ho sebelisa tšobotsi ho phatlalatso ea sebopeho. packed.

Ho laela linotlolo tse nang le sebapi sa kantle

Taba ea bohlokoa ea papiso e kanna ea ba e rarahane haholo bakeng sa papiso ea binary. E 'ngoe ea mabaka a mangata ke ho ba teng ha masimo a tekheniki ka har'a meaho. Ke tla bontša ho hlaha ha bona ke sebelisa mohlala oa senotlolo bakeng sa karolo ea bukana eo re seng re e tloaetse.

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

Leha e le bonolo, maemong a mangata e ja mohopolo o mongata haholo. Buffer bakeng sa lebitso lena e nka li-byte tse 256, leha ka karolelano mabitso a lifaele le lifoldara ha a fete litlhaku tse 20-30.

E 'ngoe ea mekhoa e tloaelehileng ea ho ntlafatsa boholo ba rekoto ke ho "fokotsa" ho isa boholong ba nnete. Moko oa eona ke hore likahare tsa masimo ohle a bolelele bo fapaneng li bolokoa ka har'a buffer qetellong ea sebopeho, 'me bolelele ba tsona bo bolokoa ka mefuta e fapaneng.​ Ho latela mokhoa ona, senotlolo. NodeKey e fetoha ka tsela e latelang.

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

Ho feta moo, ha ho etsoa seriali, boholo ba data ha bo boleloe sizeof sebopeho sohle, 'me boholo ba masimo ohle ke bolelele bo tsitsitseng hammoho le boholo ba karolo e hlileng e sebelisoang ea buffer.

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

Ka lebaka la refactoring, re ile ra fumana chelete e ngata ea polokelo sebakeng seo linotlolo li neng li le ho sona. Leha ho le joalo, ka lebaka la tšimo ea tekheniki nameLength, ea kamehla binary comparator ha e sa tšoanela ho bapisa senotlolo. Haeba re sa e nkele sebaka ka sa rona, bolelele ba lebitso e tla ba ntho e ka sehloohong ea ho hlopha ho feta lebitso ka bolona.

LMDB e lumella database ka 'ngoe ho ba le ts'ebetso ea eona ea bohlokoa ea papiso. Sena se etsoa ho sebelisa sesebelisoa mdb_set_compare ka thata pele ho buloa. Ka mabaka a totobetseng, e ke ke ea fetoloa ho pholletsa le bophelo ba database. Motho ea bapisang o fumana linotlolo tse peli ka sebopeho sa binary e le ho kenya letsoho, 'me ha se hlahisoa se khutlisetsa sephetho sa papiso: ka tlase ho (-1), e kholo ho feta (1) kapa e lekanang le (0). Pseudocode bakeng sa NodeKey e shebahala joalo.

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

Hafeela linotlolo tsohle tsa database li le tsa mofuta o le mong, ntle le maemo a lahlela boemeli ba bona ba li-byte ho mofuta oa sebopeho sa senotlolo sa kopo ke molao. Ho na le nuance e le 'ngoe mona, empa e tla tšohloa ka tlase ho karoloana ea "Reading Records".

Ho boloka Melao ea Boitšoaro

LMDB e sebetsa ka matla haholo ka linotlolo tsa lirekoto tse bolokiloeng. Papiso ea bona le e mong le e mong e etsahala ka har'a moralo oa ts'ebetso leha e le efe e sebelisoang, 'me ts'ebetso ea tharollo eohle e itšetlehile ka lebelo la papiso. Lefatšeng le letle, sebapali sa kamehla sa binary se lokela ho lekana ho bapisa linotlolo, empa haeba u ne u tlameha ho sebelisa ea hau, mokhoa oa ho lahla linotlolo ho eona e lokela ho ba kapele kamoo ho ka khonehang.

Database ha e thahaselle ka ho khetheha karolo ea boleng ba rekoto (boleng). Phetoho ea eona ho tloha ho boemeli ba byte ho ntho e etsahala feela ha e se e hlokoa ke khoutu ea kopo, mohlala, ho e bontša skrineng. Kaha sena se etsahala ka seoelo, litlhoko tsa lebelo bakeng sa ts'ebetso ena ha li bohlokoa hakaalo, 'me ts'ebetsong ea eona re lokolohile haholo ho tsepamisa maikutlo ho bonolo.Mohlala, ho hlophisa metadata ka lifaele tse e-s'o kopitsoe, re sebelisa. NSKeyedArchiver.

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

Leha ho le joalo, ho na le linako tseo ka tsona ts'ebetso e ntseng e le ea bohlokoa. Mohlala, ha re boloka metainformation mabapi le sebopeho sa faele sa leru la mosebelisi, re sebelisa memori e ts'oanang ea ho lahla lintho. Ntho e ka sehloohong ea mosebetsi oa ho hlahisa boemeli ba bona bo fapaneng ke 'nete ea hore likarolo tsa bukana li entsoe ke sehlopha sa lihlopha.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Ho e kenya ts'ebetsong ka puo ea C, masimo a khethehileng a majalefa a behiloe ka mekhoa e fapaneng, 'me kamano ea bona le motheo e hlalosoa ka tšimo ea mofuta oa bonngoe. Likahare tsa 'nete tsa bonngoe li hlalositsoe ka mofuta oa tšobotsi ea tekheniki.

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

Ho eketsa le ho ntlafatsa lirekoto

Senotlolo sa serialized le boleng li ka ekeletsoa lebenkeleng. Ho etsa sena, sebelisa sesebelisoa mdb_put.

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

Mothating oa ho lokisa, polokelo e ka lumelloa kapa ea thibeloa ho boloka litlaleho tse ngata ka senotlolo se le seng Haeba ho thibetsoe ho pheta-pheta ha linotlolo, joale ha u kenya tlaleho, u ka tseba hore na ho ntlafatsa tlaleho e teng ho lumelloa kapa che. Haeba fraying e ka hlaha feela ka lebaka la phoso ea khoutu, joale u ka itšireletsa ho eona ka ho hlakisa folakha. NOOVERWRITE.

Likenyo tsa ho bala

Ho bala lirekoto ho LMDB, sebelisa ts'ebetso mdb_get. Haeba para ea bohlokoa-boleng e emeloa ke meaho e neng e lahliloe pele, joale mokhoa ona o shebahala tjena.

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

Lethathamo le hlahisitsoeng le bonts'a hore na serialization ka ho lahla sebopeho ho u lumella joang ho tlosa likabelo tse matla eseng feela ha u ngola, empa ha u bala data. E tsoa mosebetsing mdb_get pointer e sheba hantle aterese ea memori ea sebele moo database e bolokang setšoantšo sa byte sa ntho. Ebile, re fumana mofuta oa ORM o fanang ka lebelo le holimo haholo la ho bala data hoo e batlang e le mahala. Ho sa tsotellehe botle bohle ba mokhoa ona, hoa hlokahala ho hopola likarolo tse 'maloa tse amanang le eona.

  1. Bakeng sa transaction e balang feela, pointer ea sebopeho sa boleng e netefalitsoe hore e tla lula e sebetsa ho fihlela transaction e koetsoe. Joalokaha ho boletsoe pejana, maqephe a sefate sa B moo ntho e leng teng, ka lebaka la molao-motheo oa kopi-on-write, a lula a sa fetohe hafeela a boleloa ke bonyane transaction e le 'ngoe. Ka nako e ts'oanang, hang ha ts'ebetso ea ho qetela e amanang le bona e fela, maqephe a ka sebelisoa hape bakeng sa data e ncha. Haeba ho hlokahala hore lintho li pholohe transaction e li hlahisitseng, joale li ntse li tlameha ho kopitsoa.
  2. Bakeng sa transaction ea ho bala, pointer ea sebopeho sa boleng bo hlahisitsoeng e tla sebetsa feela ho fihlela ts'ebetso ea pele ea tokiso (ho ngola kapa ho hlakola data).
  3. Le hoja sebopeho NodeValue eseng ka botlalo, empa e hlophisitsoe (sheba karoloana "Ho laela linotlolo ho sebelisa sebapi sa kantle"), o ka fihlella masimo a eona ka mokhoa o sireletsehileng ka pointer. Ntho ea bohlokoa ha se ho e nyenyefatsa!
  4. Tlas'a maemo leha e le afe mohaho o lokela ho fetoloa ka pointer e amoheloang. Liphetoho tsohle li tlameha ho etsoa feela ka mokhoa mdb_put. Leha ho le joalo, ho sa tsotellehe hore na u batla ho etsa sena ka thata hakae, ho ke ke ha khoneha, kaha sebaka sa mohopolo moo mohaho ona o leng teng o ngotsoe ka mokhoa oa ho bala feela.
  5. Khutlisa faele sebakeng sa aterese ea ts'ebetso ka sepheo sa, mohlala, ho eketsa boholo ba boholo ba polokelo u sebelisa ts'ebetso mdb_env_set_map_size e felisa ka botlalo litšebelisano tsohle le mekhatlo e amanang le eona ka kakaretso le lisupa tsa lintho tse itseng ka ho khetheha.

Qetellong, tšobotsi e 'ngoe e bolotsana hoo ho senola moelelo oa eona ho sa lumellaneng le serapa se seng feela. Khaolong e buang ka sefate sa B, ke fane ka setšoantšo sa hore na maqephe a eona a hlophisitsoe joang mohopolong. Ho latela ho tsoa ho sena hore aterese ea tšimoloho ea buffer e nang le data ea serialized e ka ba e hanyetsanang ka ho feletseng. Ka lebaka la sena, pointer ho bona e ile ea amoheloa ka sebopeho MDB_val 'me e fokotsoe hore e be pointer ho sebopeho, e fetoha e sa tsitsang tabeng e akaretsang. Ka nako e ts'oanang, meralo ea li-chips tse ling (tabeng ea iOS ena ke armv7) e hloka hore aterese ea data efe kapa efe e be boholo ba boholo ba lentsoe la mochini kapa, ka mantsoe a mang, boholo ba sistimi. bakeng sa armv7 ke likotoana tse 32). Ka mantsoe a mang, opereishene e kang *(int *foo)0x800002 holim'a tsona ho tšoana le ho phonyoha 'me ho isa polaong ka kahlolo EXC_ARM_DA_ALIGN. Ho na le litsela tse peli tsa ho qoba qetello e bohloko joalo.

Ea pele ke ho kopitsoa ha data ka mokhoa o hlakileng. Ka mohlala, ho bapisa ba tloaelo sena se tla bontšoa ka tsela e latelang.

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

Mokhoa o mong ke ho tsebisa moqapi esale pele hore meaho ea boleng ba bohlokoa e kanna ea se ke ea lumellana. aligned(1). Ho ARM u ka ba le phello e tšoanang finyella le ho sebelisa tšobotsi e pakiloeng. Ha re nahana hore e boetse e thusa ho ntlafatsa sebaka se hapiloeng ke sebopeho, mokhoa ona o bonahala o le molemo ho 'na, leha ho le joalo. приводит ho eketseha ha litšenyehelo tsa ts'ebetso ea phihlello ea data.

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

Lipotso tse fapaneng

Ho pheta-pheta sehlopha sa lirekoto, LMDB e fana ka tlhaloso ea cursor. Ha re shebeng mokhoa oa ho sebetsa le eona re sebelisa mohlala oa tafole e nang le metadata ea maru ea mosebelisi e seng e ntse e tloaelehile ho rona.

E le karolo ea ho bonts'a lethathamo la lifaele bukeng, hoa hlokahala ho fumana linotlolo tsohle tseo lifaele tsa ngoana le lifoldara li amanang le tsona. Likarolong tse fetileng re hlophisitse linotlolo NodeKey e le hore li laeloa haholo ke ID ea bukana ea motsoali. Ka hona, ka botekgeniki, mosebetsi oa ho khutlisa litaba tsa foldara o theohela ho beha sesupa moeling o kaholimo oa sehlopha sa linotlolo ka sehlomathiso se fanoeng ebe se pheta moeli o tlase.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Karolo e ka holimo e ka fumanoa ka ho toba ka lipatlisiso tse latellanang. Ho etsa sena, sesupa se behiloe qalong ea lenane lohle la linotlolo ho database mme se eketsoa ho fihlela senotlolo se nang le sekhetho sa buka ea motsoali se hlaha ka tlase ho sona. Mokhoa ona o na le mefokolo e 2 e hlakileng:

  1. Mokhoa o rarahaneng oa ho batla, le hoja, joalokaha o tsejoa, lifateng ka kakaretso le sefateng sa B haholo-holo o ka etsoa ka nako ea logarithmic.
  2. Ka lefeela, maqephe ohle a tlang pele ho e batloang a tlosoa faeleng ho ea mohopolong oa mantlha, o theko e boima haholo.

Ka lehlohonolo, LMDB API e fana ka mokhoa o sebetsang oa ho beha sesupo qalong.Ho etsa sena, o hloka ho hlahisa senotlolo seo boleng ba sona bo leng tlase ho kapa bo lekanang le senotlolo se teng moeling o kaholimo oa nako. Ka mohlala, mabapi le lenane la setšoantšo se ka holimo, re ka etsa senotlolo moo tšimo parentId e tla lekana le 2, 'me tse ling kaofela li tlatsitsoe ka li-zero. Konopo e joalo e tlatsitsoeng ka mokhoa o sa fellang e kentsoe tšebetsong mdb_cursor_get e bontshang tshebetso 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);

Haeba moeli o ka holimo oa sehlopha sa linotlolo o fumanoa, joale re o pheta-pheta ho fihlela re kopana kapa senotlolo se kopana le se seng. parentId, kapa linotlolo li ke ke tsa fela ho hang

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

Ho monate ke hore e le karolo ea ho pheta-pheta ho sebelisa mdb_cursor_get, ha re fumane senotlolo feela, empa hape le boleng. Haeba, e le hore u phethe maemo a sampole, u lokela ho hlahloba, har'a lintho tse ling, masimo a tsoang karolong ea bohlokoa ea tlaleho, joale a fumaneha haholo ntle le boitšisinyo bo eketsehileng.

4.3. Ho etsa mohlala oa likamano lipakeng tsa litafole

Ho fihlela joale, re khonne ho nahana ka likarolo tsohle tsa ho rala le ho sebetsa ka database ea tafole e le 'ngoe. Re ka re tafole ke sehlopha sa lirekoto tse hlophisitsoeng tse nang le mefuta e tšoanang ea li-key-value pairs. Haeba o bonts'a senotlolo e le khutlonnetsepa le boleng bo amanang le parallelepiped, o fumana setšoantšo sa pono sa database.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Leha ho le joalo, bophelong ba sebele ke ka seoelo ho ka khonehang ho phela ka tšollo ea mali e fokolang hakana. Hangata ho database ho hlokahala, pele, ho ba le litafole tse 'maloa,' me ea bobeli, ho etsa likhetho ho tsona ka tatellano e fapaneng le senotlolo sa mantlha. Karolo ena ea ho qetela e tobane le litaba tsa popo ea bona le khokahano ea bona.

Litafole tsa index

Sesebelisoa sa cloud se na le karolo ea "Gallery". E bonts'a litaba tsa media ho tsoa lerung lohle, tse hlophisitsoeng ka letsatsi. Ho kenya ts'ebetsong khetho e joalo hantle, haufi le tafole e kholo o hloka ho theha e 'ngoe ka mefuta e mecha ea linotlolo. Li tla ba le tšimo e nang le letsatsi leo faele e entsoeng ka lona, ​​​​e tla sebetsa e le mokhoa oa mantlha oa ho hlopha. Hobane linotlolo tse ncha li bua ka data e tšoanang le linotlolo tse tafoleng e kholo, li bitsoa linotlolo tsa index. Setšoantšong se ka tlase li totobatsoa ka lamunu.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

E le ho arola linotlolo tsa litafole tse fapaneng ho tse ling ka har'a database e le 'ngoe, ho ile ha eketsoa tafole ea sebaka sa tekheniki ho tsona kaofela. Ka ho etsa hore e be eona ntho ea bohlokoa ka ho fetisisa bakeng sa ho hlopha, re tla finyella ka lihlopha tsa linotlolo pele ka litafole, le ka har'a litafole - ho ea ka melao ea rona.

Senotlolo sa index se supa data e ts'oanang le senotlolo sa mantlha. Ts'ebetso e otlolohileng ea thepa ena ka ho ikopanya le eona kopi ea karolo ea bohlokoa ea senotlolo sa mantlha ha e ea nepahala ho latela maikutlo a 'maloa:

  1. Mabapi le sebaka se nkiloeng, metadata e ka ba e ruileng haholo.
  2. Ho latela pono ea ts'ebetso, kaha ha u nchafatsa metadata ea node, u tla tlameha ho e ngola hape u sebelisa linotlolo tse peli.
  3. Ho ea ka pono ea tšehetso ea khoutu, haeba re lebala ho ntlafatsa lintlha bakeng sa e 'ngoe ea linotlolo, re tla fumana phoso e sa tloaelehang ea ho se lumellane ha data polokelong.

Ka mor'a moo, re tla tšohla mokhoa oa ho felisa mefokolo ena.

Ho hlophisa likamano lipakeng tsa litafole

Mohlala o loketse hantle bakeng sa ho hokahanya tafole ea index le tafole e kholo "key as value". Joalokaha lebitso la eona le bontša, karolo ea bohlokoa ea rekoto ea index ke kopi ea bohlokoa ba bohlokoa. Mokhoa ona o felisa mefokolo eohle e boletsoeng ka holimo e amanang le ho boloka kopi ea karolo ea bohlokoa ea tlaleho ea mantlha. Litsenyehelo feela ke hore ho fumana boleng ka senotlolo sa index, o hloka ho etsa lipotso tse 2 ho database ho fapana le e le 'ngoe. Ka mokhoa o hlophisitsoeng, schema ea database e hlahisoang e shebahala tjena.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Mokhoa o mong oa ho hlophisa likamano lipakeng tsa litafole ke "notlolo e sa hlokahaleng". Bohlokoa ba eona ke ho eketsa litšoaneleho tse ling ho senotlolo, tse hlokahalang eseng bakeng sa ho hlopha, empa bakeng sa ho bopa senotlolo se amanang.Ka ts'ebelisong ea Cloud Mail.ru ho na le mehlala ea 'nete ea ts'ebeliso ea eona, leha ho le joalo, e le ho qoba ho qoela ka botebo. moelelo oa meralo e ikhethileng ea iOS, ke tla fana ka mohlala o iqapetsoeng, empa mohlala o hlakileng haholoanyane

Basebelisi ba mobile ba Cloud ba na le leqephe le bonts'ang lifaele le lifoldara tsohle tseo mosebelisi a li arolelaneng le batho ba bang. Kaha ho na le lifaele tse joalo tse fokolang, 'me ho na le mefuta e mengata e fapaneng ea tlhahisoleseding e khethehileng mabapi le phatlalatso e amanang le bona (ke mang ea fuoeng phihlelo, ka litokelo life, joalo-joalo), ho ke ke ha utloahala ho imetsa karolo ea bohlokoa ea rekota tafoleng e kholo le eona. Leha ho le joalo, haeba u batla ho hlahisa lifaele tse joalo ntle le marang-rang, u ntse u hloka ho li boloka kae-kae. Tharollo ea tlhaho ke ho etsa tafole e arohaneng bakeng sa eona. Setšoantšong se ka tlase, senotlolo sa eona se ngotsoe ka "P", 'me "propname" ea "propname" e ka nkeloa sebaka ke "litaba tsa sechaba".

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Metadata eohle e ikhethang, molemong oa ho boloka tafole e ncha e entsoe, e behiloe karolong ea bohlokoa ea rekoto. Ka nako e ts'oanang, ha u batle ho kopitsa lintlha tse mabapi le lifaele le lifoldara tse seng li bolokiloe tafoleng e kholo. Sebakeng seo, data e sa hlokahaleng e eketsoa konopo ea "P" ka mokhoa oa "node ID" le masimo a "timestamp". Ka lebaka la bona, o ka etsa senotlolo sa index, moo o ka fumanang senotlolo sa mantlha, seo qetellong o ka fumanang metadata ea node.

Qetello

Re hlahloba sephetho sa ho kenngwa tshebetsong ha LMDB ka tsela e ntle. Ka mor'a moo, palo ea li-freezes tsa kopo e fokotsehile ka 30%.

Ho khanya le ho futsaneha ha database ea bohlokoa ea LMDB lits'ebetsong tsa iOS

Liphetho tsa mosebetsi o entsoeng li ile tsa utloahala ho feta sehlopha sa iOS. Hajoale, e 'ngoe ea likarolo tsa mantlha tsa "Files" ts'ebelisong ea Android le eona e se e fetohetse ho sebelisa LMDB, mme likarolo tse ling li tseleng. Puo ea C, eo lebenkele la bohlokoa la bohlokoa le sebelisoang ho eona, e bile thuso e ntle ho qala ho theha moralo oa kopo ho potoloha sethala sa C ++. Ho ile ha sebelisoa jenereithara ea khoutu ho hokahanya laebrari ea C++ e hlahisitsoeng ka khoutu ea sethala ho Objective-C le Kotlin. Djinni ho tsoa ho Dropbox, empa eo ke pale e fapaneng ka ho felletseng.

Source: www.habr.com

Eketsa ka tlhaloso