Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Tamin'ny fararano 2019, nisy hetsika nandrasana hatry ny ela tao amin'ny ekipa Mail.ru Cloud iOS. Ny angon-drakitra lehibe ho an'ny fitahirizana maharitra ny fanjakana fampiharana dia nanjary hafahafa ho an'ny tontolo finday Tahiry Memory-Mapped Database (LMDB). Eo ambanin'ny fanapahana, asaina ny sainao amin'ny famerenana amin'ny antsipiriany amin'ny fizarana efatra. Voalohany, andeha isika hiresaka momba ny antony mahatonga ny safidy tsy misy dikany sy sarotra toy izany. Avy eo, andeha isika hiroso amin'ny fandinihana trozona telo ao anatin'ny rafitry ny LMDB: rakitra misy sarintany fahatsiarovana, hazo B +, fomba fanaovana kopia amin'ny fanoratana amin'ny fampiharana transactional sy multiversioning. Farany, ho an'ny tsindrin-tsakafo - ny ampahany azo ampiharina. Ao anatin'izany dia hojerentsika ny fomba famolavolana sy fampiharana schema fototra miaraka amin'ny latabatra maromaro, anisan'izany ny index iray, eo an-tampon'ny API sanda manan-danja ambany.​

afa-po

  1. Fanentanana amin'ny fanatanterahana
  2. Fametrahana LMDB
  3. Trozona telo LMDB
    3.1. Trozona #1. rakitra misy sarintany fahatsiarovana
    3.2. Trozona #2. B+-hazo
    3.3. Trozona #3. kopia amin'ny fanoratana
  4. Fandrafetana tetika angona eo an-tampon'ny API manan-danja
    4.1. abstractions fototra
    4.2. Modeling latabatra
    4.3. Modeling fifandraisana eo amin'ny latabatra

1. Fanentanana amin'ny fanatanterahana

Indray mandeha isan-taona, tamin'ny taona 2015, dia nikarakara ny fakana ny metrika izahay, impiry ny fahatarana ny fifandraisana amin'ny fampiharana anay. Tsy nataontsika fotsiny izany. Mihabetsaka hatrany ny fitarainana momba ny zava-misy fa indraindray ny fampiharana dia mijanona tsy mamaly ny fihetsiky ny mpampiasa: tsy voatsindry ny bokotra, tsy mihodina ny lisitra, sns. Momba ny mekanika fandrefesana NOTANTARAIN'I ao amin'ny AvitoTech, ka ny filaharan'ny isa ihany no omeko eto.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Lasa ranonorana mangatsiaka ho anay ny valin'ny fandrefesana. Hita fa betsaka kokoa noho ny hafa ny olana ateraky ny fanamainana. Raha, alohan'ny hahatsapana an'io zava-misy io, ny tondro ara-teknika lehibe momba ny kalitao dia tsy misy fianjerana, dia aorian'ny fifantohana Nitady tetika hafa indray amin'ny freeze.

Efa nanorina dashboard misy fiatoana ary rehefa lany hamaroan'isa и kalitao famakafakana ny anton'izy ireo, ny fahavalo lehibe lasa mazava - mavesatra raharaham-barotra lojika manatanteraka ao amin'ny kofehy lehibe ny fampiharana. Fihetseham-po voajanahary ho an'ity fahafaham-baraka ity dia ny faniriana mirehitra hanosika azy ho any amin'ny reniranon'ny asa. Ho an'ny famahana ny olana amin'ity olana ity, dia nampiasa maritrano misy kofehy maromaro mifototra amin'ny mpilalao maivana izahay. Nanokana ny fampifanarahana azy ho an'ny tontolon'ny iOS aho kofehy roa ao amin'ny twitter iombonana ary lahatsoratra momba ny Habré. Ao anatin'ny tantara amin'izao fotoana izao, tiako ny hanantitrantitra ireo lafin'ny fanapahan-kevitra izay nisy fiantraikany tamin'ny fisafidianana ny tahiry.​

Ny modelin'ny mpilalao amin'ny fandaminana rafitra dia mihevitra fa ny multithreading no lasa fototry ny faharoa. Ny zavatra maodely ao anatiny dia tia mamakivaky ny sisin'ny kofehy. Ary tsy manao izany indraindray sy any amin'ny toerana sasany, fa saika tsy tapaka sy na aiza na aiza.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny angon-drakitra dia iray amin'ireo singa fehizoro amin'ny kisary aseho. Ny tena asany dia ny fampiharana ny lamina macro angon-drakitra iombonana. Raha ao amin'ny tontolon'ny orinasa dia ampiasaina mba handaminana ny angon-drakitra synchronization eo amin'ny serivisy, dia raha ny maritrano mpilalao sarimihetsika, data eo anelanelan'ny kofehy. Noho izany, mila angon-drakitra toy izany izahay, izay miasa miaraka amin'ny tontolo misy kofehy maromaro dia tsy miteraka olana na dia kely aza. Amin'ny ankapobeny, midika izany fa ny zavatra azo avy amin'izany dia tsy maintsy ho azo antoka farafaharatsiny, ary tsy azo ovaina mihitsy. Araka ny fantatrao, ity farany dia azo ampiasaina miaraka amin'ny kofehy maromaro nefa tsy mampiasa karazana hidin-trano, izay misy fiantraikany tsara amin'ny fampisehoana.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOSNy lafin-javatra manan-danja faharoa izay nisy fiantraikany tamin'ny fisafidianana ny angon-drakitra dia ny API rahonay. Nahazo aingam-panahy avy amin'ny fomba fiasa git amin'ny fampifanarahana. Tahaka azy no nokendrenay API voalohany an-tserasera, izay toa tsy mety amin'ny mpanjifa rahona. Noheverina fa indray mandeha ihany izy ireo no hamoaka ny toetry ny rahona manontolo, ary avy eo ny fampifanarahana amin'ny ankamaroan'ny tranga dia hitranga amin'ny alàlan'ny fanovana mihodina. Indrisy, io fahafahana io dia mbola ao amin'ny faritra teorika ihany, ary amin'ny fampiharana, ny mpanjifa dia tsy nianatra niasa tamin'ny patch. Misy antony maromaro mahatonga izany, izay, mba tsy hanemorana ny fampidirana, dia hiala amin'ny fononteny izahay. Ankehitriny dia mahaliana kokoa ny valin'ny lesona momba ny zava-mitranga rehefa nilaza ny API hoe "A" ary tsy nilaza ny "B" ny mpanjifany.

Noho izany, raha alainao sary an-tsaina ny git, izay, rehefa manatanteraka baiko misintona, fa tsy mampihatra patch amin'ny snapshot eo an-toerana, dia mampitaha ny toerany feno amin'ny mpizara iray manontolo, dia hanana hevitra marina tsara momba ny fomba fampifanarahana ianao. mitranga amin'ny mpanjifa rahona. Mora ny maminavina fa amin'ny fampiharana azy dia ilaina ny manolotra hazo DOM roa ho fahatsiarovana miaraka amin'ny meta-information momba ny mpizara rehetra sy ny rakitra eo an-toerana. Raha ny fandehany fa raha misy mpampiasa mitahiry rakitra 500 arivo ao amin'ny rahona, dia ilaina ny mamerina sy mamotika hazo roa miaraka amin'ny 1 tapitrisa nodes. Fa ny node tsirairay dia fitambarana misy sarin'ny subobjects. Amin'ity tranga ity, ny valin'ny profiling dia nampoizina. Hita fa na dia tsy nandinika ny algorithm fampiraisana aza, ny fomba famoronana sy ny famotehana ireo zavatra kely be dia be dia mitentina denaria tsara tarehy. ny scripts mpampiasa. Vokatr'izany, amboary ny fepetra manan-danja faharoa amin'ny fisafidianana angon-drakitra - ny fahafahana mampihatra ny asa CRUD tsy misy fizarana zavatra mavitrika.

Ny fepetra hafa dia mahazatra kokoa, ary ny lisitra feno dia toy izao manaraka izao.

  1. Fiarovana ny kofehy.
  2. Multiprocessing. Voatonona amin'ny faniriana hampiasa ny ohatra angon-drakitra mitovy amin'ny fampifanarahana ny fanjakana tsy eo anelanelan'ny kofehy ihany, fa eo anelanelan'ny fampiharana lehibe sy ny fanitarana iOS.
  3. Ny fahafahana maneho ireo singa voatahiry ho zavatra tsy azo ovaina.​
  4. Tsy fahampian'ny fizarana mavitrika ao anatin'ny asa CRUD.
  5. Fanohanana Transaction ho an'ny fananana fototra asidraTeny fototra: atomika, tsy miovaova, mitoka-monina ary azo itokisana.
  6. Hafainganam-pandeha amin'ny tranga malaza indrindra.

Miaraka amin'ireo fepetra takiana ireo, ny SQLite dia safidy tsara ary mbola safidy tsara. Na izany aza, tao anatin'ny fandalinana ny safidy hafa, dia nahita boky iray aho "Manomboka amin'ny LevelDB". Teo ambany fitarihany, nisy benchmark iray nosoratana izay mampitaha ny hafainganam-pandehan'ny asa amin'ny angon-drakitra samihafa amin'ny toe-javatra tena rahona. Nihoatra noho ny nantenaina indrindra ny vokatra. Amin'ny tranga malaza indrindra - ny fahazoana cursor amin'ny lisitry ny rakitra rehetra sy ny lisitry ny rakitra rehetra ho an'ny lahatahiry iray - ny LMDB dia nivadika ho avo 10 heny noho ny SQLite. Niharihary ny safidy.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

2. Fametrahana LMDB

LMDB dia tranomboky, tena kely (andalana 10K ihany) izay mampihatra ny sosona fototra ambany indrindra amin'ny angon-drakitra - fitehirizana.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny kisary etsy ambony dia mampiseho fa ny fampitahana ny LMDB amin'ny SQLite, izay mametraka ambaratonga ambony kokoa, dia amin'ny ankapobeny dia tsy marina kokoa noho ny SQLite miaraka amin'ny Core Data. Rariny kokoa raha mitanisa motera fitahirizana mitovy amin'ny mpifaninana mitovy aminy - BerkeleyDB, LevelDB, Sophia, RocksDB, sns. Misy fivoarana mihitsy aza ny LMDB miasa ho singa maotera fitahirizana ho an'ny SQLite. Ny fanandramana voalohany toy izany tamin'ny 2012 LANY mpanoratra LMDB Howard Chu. vokatra tena nahaliana tokoa ka noraisin'ireo mpankafy OSS ny hetsika nataony, ary nahita ny fitohizan'izany teo anatrehan'ny LumoSQL. Tamin'ny Janoary 2020 ny mpanoratra ity tetikasa ity dia Den Shearer aseho ao amin'ny LinuxConfAu.

Ny tena fampiasana ny LMDB dia toy ny motera ho an'ny angon-drakitra fampiharana. Ny tranomboky dia manana ny endriny amin'ny mpamorona OpenLDAP, izay tena tsy afa-po tamin'ny BerkeleyDB ho fototry ny tetikasany. Miala amin'ny tranomboky manetry tena btree, Howard Chu dia afaka namorona iray amin'ireo safidy malaza indrindra amin'izao androntsika izao. Natokana ho an'ity tantara ity ny tatitra nataony, ary koa ny rafitra anatiny ao amin'ny LMDB. "The Lightning Memory-Mapped Database". Leonid Yuriev (aka yleo) avy amin'ny Positive Technologies tamin'ny lahateniny tao amin'ny Highload 2015 "Ny motera LMDB dia tompon-daka manokana". Ao anatin'izany dia miresaka momba ny LMDB izy ao anatin'ny tontolon'ny asa mitovy amin'ny fampiharana ny ReOpenLDAP, ary ny LevelDB dia efa nandalo fanakianana fampitahana. Vokatry ny fampiharana, ny Positive Technologies aza dia nahazo fork mivoatra mavitrika MDBX miaraka amin'ny endri-javatra tena matsiro, optimizations ary fanamboarana bug.

Ny LMDB dia matetika ampiasaina ho toy ny fitahirizana ihany koa. Ohatra, ny navigateur Mozilla Firefox nisafidy izany ho an'ny filana maromaro, ary, manomboka amin'ny version 9, Xcode tiany ny SQLite mba hitahiry indexes.

Ny motera ihany koa dia tratra tao amin'ny tontolon'ny fampandrosoana finday. Ny soritry ny fampiasana azy dia mety ho mahita amin'ny mpanjifa iOS ho an'ny Telegram. Nandeha lavidavitra kokoa ny LinkedIn ary nisafidy ny LMDB ho fitahirizana default ho an'ny rafitra caching data ao an-toerana, Rocket Data, momba izay NOTANTARAIN'I ao amin'ny lahatsoratra iray tamin'ny 2016.

Ny LMDB dia nahomby tamin'ny ady ho an'ny toerana misy masoandro ao amin'ny niche navelan'ny BerkeleyDB taorian'ny tetezamita teo ambany fifehezan'ny Oracle. Ny trano famakiam-boky dia tiana noho ny hafainganam-pandehany sy ny fahamendrehany, na dia raha oharina amin'ny karazana azy manokana aza. Araka ny fantatrao, tsy misy sakafo antoandro maimaim-poana, ary tiako ny hamafisina ny fifampiraharahana izay tsy maintsy atrehinao rehefa misafidy eo amin'ny LMDB sy SQLite. Ny kisary etsy ambony dia mampiseho mazava ny fomba hahatratrarana ny hafainganam-pandeha ambony. Voalohany, tsy mandoa sosona fanampiny amin'ny abstraction an-tampon'ny fitahirizana kapila izahay. Mazava ho azy, amin'ny maritrano tsara dia mbola tsy afaka manao izany ianao raha tsy misy azy ireo, ary tsy maintsy hiseho ao amin'ny fehezan-dalàna fampiharana izy ireo, saingy ho manify kokoa izy ireo. Tsy hanana endri-javatra izay tsy takian'ny fampiharana manokana izy ireo, ohatra, fanohanana fanontaniana amin'ny fiteny SQL. Faharoa, azo atao tsara ny mampihatra ny sarintany amin'ny hetsika fampiharana amin'ny fangatahana fitahirizana kapila. Raha SQLite amin’ny asako dia avy amin'ny salan'isa ilaina amin'ny fampiharana antonony, avy eo ianao, amin'ny maha-mpamorona fampiharana anao, dia mahafantatra tsara ny toe-javatra enta-mavesatra lehibe. Ho an'ny vahaolana mamokatra kokoa, dia tsy maintsy mandoa ny vidin'ny vidiny ho an'ny fampandrosoana ny vahaolana voalohany sy ny fanohanana manaraka.

3. Trozona telo LMDB

Rehefa avy nijery ny LMDB avy amin'ny mason'ny vorona, tonga ny fotoana hirosoana lalindalina kokoa. Ny fizarana telo manaraka dia hatokana amin'ny famakafakana ireo trozona lehibe izay iorenan'ny rafitra fitahirizana:

  1. Ny rakitra voarakitra an-tsarintany ho toy ny rafitra miasa amin'ny kapila sy ny fampifanarahana ny rafitra angon-drakitra anatiny.
  2. B+-tree ho toy ny fandaminana ny firafitry ny angona voatahiry.
  3. Copy-on-write ho fomba iray hanomezana fananana ACID transactional sy multiversioning.

3.1. Trozona #1. rakitra misy sarintany fahatsiarovana

Ny rakitra voarakitra fahatsiarovana dia singa ara-javakanto manan-danja izay miseho amin'ny anaran'ny tahiry. Ny olana momba ny caching sy ny fampifanarahana ny fidirana amin'ny fampahalalana voatahiry dia miankina tanteraka amin'ny rafitra miasa. Tsy misy cache ao anatiny ny LMDB. Fanapahan-kevitra avy amin'ny mpanoratra izany, satria ny famakiana angon-drakitra mivantana avy amin'ny rakitra voarakitra dia ahafahanao manapaka zoro maro amin'ny fampiharana ny motera. Ity ambany ity ny lisitra feno ny sasany amin'izy ireo.

  1. Ny fitazonana ny firindran'ny angon-drakitra ao amin'ny fitahirizana rehefa miasa miaraka aminy amin'ny dingana maromaro dia lasa andraikitry ny rafitra miasa. Ao amin'ny fizarana manaraka, io mekanika io dia resahina amin'ny antsipiriany sy miaraka amin'ny sary.
  2. Ny tsy fisian'ny cache dia manamaivana tanteraka ny LMDB amin'ny overhead mifandray amin'ny fizarana mavitrika. Ny famakiana angon-drakitra amin'ny fampiharana dia mametraka ny tondro mankany amin'ny adiresy marina amin'ny fitadidiana virtoaly ary tsy misy hafa. Toa ny nofinofy, fa ao amin'ny loharano fitehirizana, ny antso rehetra calloc dia mifantoka amin'ny fiasan'ny fanamafisana ny tahiry.
  3. Ny tsy fisian'ny cache dia midika ihany koa ny tsy fisian'ny hidin-trano mifandray amin'ny synchronization mba hidirana amin'izy ireo. Ireo mpamaky, izay misy isa tsy mety misy amin'ny fotoana iray ihany, dia tsy mahita mutex iray amin'ny lalana mankany amin'ny angona. Noho izany, ny hafainganam-pandehan'ny famakiana dia manana scalability linear mety indrindra amin'ny resaka isan'ny CPU. Ao amin'ny LMDB, ny asa fanovana ihany no arindra. Tsy misy afa-tsy mpanoratra iray isaky ny mandeha.
  4. Ny kely indrindra amin'ny caching sy ny lojika synchronization dia mamonjy ny kaody amin'ny karazana fahadisoana be pitsiny mifandray amin'ny fiasana amina tontolo misy kofehy maromaro. Nisy fanadihadiana roa mahaliana momba ny angona tamin'ny fihaonambe Usenix OSDI 2014: "Tsy noforonina mitovy daholo ny rafitra rakitra rehetra: amin'ny fahasarotan'ny famoronana rindranasa mifanaraka amin'ny crash" и Fampijaliana angona mba hahafinaritra sy hahazoana tombony. Avy amin'izy ireo ianao dia afaka mahazo vaovao momba ny fahatokisana tsy mbola nisy toy ny LMDB, ary ny fampiharana saika tsy misy tsininy ny fananan'ny ACID amin'ny fifanakalozana, izay mihoatra azy amin'ny SQLite mitovy.
  5. Ny minimalisma an'ny LMDB dia mamela ny fanehoana ny kaody ao amin'ny milina ao amin'ny cache L1 an'ny processeur miaraka amin'ny toetran'ny hafainganam-pandeha.

Indrisy anefa, amin'ny iOS, ny rakitra voarakitra fahatsiarovana dia tsy toy ny rosy araka izay irinay. Raha miresaka momba ny tsy fahampiana mifandray amin'izy ireo, dia ilaina ny mitadidy ny fitsipika ankapobeny amin'ny fampiharana an'io mekanika io amin'ny rafitra miasa.

Fampahalalana ankapobeny momba ny rakitra voarakitra an-tsary

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOSMiaraka amin'ny fampiharana azo tanterahana tsirairay, ny rafitra fandidiana dia mampifandray sampana iray antsoina hoe dingana. Ny dingana tsirairay dia omena adiresy isan-karazany, izay ametrahany izay rehetra ilainy hiasa. Ny adiresy ambany indrindra dia misy fizarana misy kaody sy angona ary loharanon-kaody mafy. Manaraka izany dia ny sakana mitombo miakatra amin'ny habaka adiresy mavitrika, fantatra amin'ny anarana hoe heap. Ahitana ny adiresin'ny sampana izay miseho mandritra ny fiasan'ny programa. Eo an-tampony dia ny faritra fitadidiana ampiasain'ny stack fampiharana. Na mitombo na mihena, izany hoe, ny habeny dia manana toetra mavitrika. Mba tsy hifanosika sy hifanelingelina ny stack sy heap, dia misaraka amin'ny faran'ny toerana misy ny adiresy izy ireo.Misy lavaka eo anelanelan'ireo fizarana mavitrika roa eo ambony sy ambany. Ny adiresy ao amin'ity fizarana afovoany ity dia ampiasain'ny rafitra miasa mba hampifandray ireo sampana isan-karazany amin'ny dingana. Indrindra indrindra, afaka manao sarintany ny adiresin'ny tohin'ny iray amin'ny rakitra iray ao anaty kapila izy. Ny rakitra toy izany dia antsoina hoe rakitra misy sarintany fahatsiarovana.​

Lehibe ny habaka adiresy natokana ho an'ny dingana iray. Ara-teorika, ny isan'ny adiresy dia voafetra ihany amin'ny haben'ny tondro, izay voafaritra amin'ny halalin'ny rafitra. Raha 1-in-1 no omena azy ny fitadidiana ara-batana, dia handrava ny RAM manontolo ny dingana voalohany, ary tsy hisy fanontaniana momba ny multitasking.

Na izany aza, fantatsika avy amin'ny traikefa fa ny rafitra fandidiana maoderina dia afaka mampandeha dingana maro araka izay tianao amin'ny fotoana iray ihany. Izany dia azo atao noho ny zava-misy fa manokana fitadidiana be dia be amin'ny dingana amin'ny taratasy ihany, fa raha ny tena izy dia mitondra any amin'ny tena fitadidiana ara-batana ihany ny ampahany izay takiana eto sy ankehitriny. Noho izany, ny fahatsiarovana mifandray amin'ny dingana dia antsoina hoe virtoaly.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny rafitra miasa dia mandamina ny fitadidiana virtoaly sy ara-batana ho pejy misy habe iray. Raha vantany vao misy pejy iray amin'ny fitadidiana virtoaly dia takiana, ny rafitra fandidiana dia mampiditra azy ao amin'ny fitadidiana ara-batana ary mametraka fifandraisana eo amin'izy ireo ao anaty latabatra manokana. Raha tsy misy slot maimaim-poana, dia adika amin'ny kapila ny iray amin'ireo pejy voapetraka teo aloha, ary maka ny toerany ilay nangatahana. Io fomba fiasa io, izay hiverenantsika ato ho ato, dia antsoina hoe swapping. Ny sary etsy ambany dia mampiseho ny dingana voalaza. Eo amboniny, ny pejy A misy adiresy 0 dia nopetahana ary napetraka teo amin'ny pejy fitadidiana lehibe misy adiresy 4. Izany zava-misy izany dia hita taratra tao amin'ny tabilaon'ny taratasim-panoratana ao amin'ny sela 0.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Miaraka amin'ny rakitra misy sarintany fahatsiarovana, mitovy tanteraka ny tantara. Raha ny lojika, dia heverina ho mitohy sy tanteraka ao amin'ny habaka adiresy virtoaly izy ireo. Na izany aza, miditra amin'ny pejy fitadidiana ara-batana isaky ny pejy izy ireo ary amin'ny fangatahana fotsiny. Ny fanovana ny pejy toy izany dia ampifandraisina amin'ny rakitra ao anaty kapila. Noho izany, afaka manao rakitra I / O ianao, miasa amin'ny bytes amin'ny fitadidiana fotsiny - ny fanovana rehetra dia hafindra ho azy avy amin'ny kernel rafitra miasa mankany amin'ny rakitra voalohany.​

Ny sary etsy ambany dia mampiseho ny fomba fampifanarahan'ny LMDB ny toerany rehefa miasa miaraka amin'ny angona avy amin'ny dingana samihafa. Amin'ny alalan'ny fanaovana sari-tany ny fahatsiarovana virtoaly amin'ny dingana samihafa amin'ny rakitra iray ihany, dia adidy amin'ny rafitra fiasana mba hampifanaraka ny blocs sasany amin'ny adiresin'izy ireo amin'ny tsirairay, izay ijerena ny LMDB.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny zava-dehibe iray dia ny LMDB dia manova ny rakitra angon-drakitra amin'ny alàlan'ny alàlan'ny mekanika antso an-tariby, ary ny rakitra dia aseho amin'ny fomba vakiana fotsiny. Ity fomba fiasa ity dia misy fiantraikany roa lehibe.

Ny vokatra voalohany dia mahazatra amin'ny rafitra miasa rehetra. Ny votoatiny dia ny manampy fiarovana amin'ny fahasimbana tsy nahy amin'ny angon-drakitra amin'ny alàlan'ny code diso. Araka ny fantatrao, ny toromarika azo tanterahina amin'ny dingana iray dia malalaka amin'ny fidirana angon-drakitra na aiza na aiza ao amin'ny habaka adiresiny. Amin'izay fotoana izay ihany, araka ny tsaroantsika, ny fanehoana rakitra amin'ny fomba mamaky-manoratra dia midika fa ny fampianarana rehetra dia afaka manova azy koa ho fanampin'izany. Raha diso izy manao izany, miezaka, ohatra, ny tena hanova ny singa array amin'ny tondro tsy misy, dia amin'izany fomba izany dia afaka manova tsy nahy ny rakitra voasoritra amin'ity adiresy ity, izay hitarika amin'ny kolikoly amin'ny angon-drakitra. Raha aseho amin'ny fomba vakiana fotsiny ilay rakitra, dia ny fikasana hanova ny habaka adiresy mifanaraka amin'izany dia hitarika amin'ny fianjeran'ny programa miaraka amin'ny famantarana. SIGSEGV, ary ny rakitra dia hijanona ho tsy misy dikany.

Ny vokatra faharoa dia efa voafaritra manokana amin'ny iOS. Na ny mpanoratra na ny loharano hafa dia tsy milaza mazava an'io, fa raha tsy misy izany dia tsy mety ny LMDB amin'ny fandehanana amin'ity rafitra fiasa finday ity. Ny fizarana manaraka dia natokana ho amin'ny fandinihana izany.

Ny mari-pamantarana manokana momba ny rakitra voarakitra fahatsiarovana ao amin'ny iOS

Tamin'ny taona 2018, nisy tatitra mahafinaritra tao amin'ny WWDC iOS Memory Deep Dive. Milaza izy io fa ao amin'ny iOS ny pejy rehetra hita ao amin'ny fitadidiana ara-batana dia an'ny iray amin'ireo karazany 3: maloto, voatsindry ary madio.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny fitadidiana madio dia fitambaran-pejy azo avadika soa aman-tsara amin'ny fitadidiana ara-batana. Ny angon-drakitra ao anatiny dia azo averina alaina avy amin'ny loharano niaviany raha ilaina. Ny rakitra voarakitra an-tsarintany vakiana fotsiny dia tafiditra ao anatin'ity sokajy ity. IOS dia tsy matahotra ny hamoaka ny pejy voasoritra amin'ny fisie avy amin'ny fitadidiana na oviana na oviana, satria azo antoka fa mifanaraka amin'ny rakitra ao anaty kapila izy ireo.

Ny pejy novaina rehetra dia miditra ao anaty fitadidiana maloto, na aiza na aiza misy azy ireo tany am-boalohany. Indrindra indrindra, hosokajiana amin'izany fomba izany ihany koa ireo rakitra voarakitra an-tsarintany novaina tamin'ny fanoratana amin'ny fahatsiarovana virtoaly mifandray amin'izy ireo. Sokafy ny LMDB misy saina MDB_WRITEMAP, rehefa avy nanao fanovana tamin'izany ianao dia afaka mahita ny tenanao manokana.​

Raha vantany vao manomboka maka fitadidiana ara-batana be loatra ny fampiharana iray dia manindry ny pejiny maloto ny iOS. Ny fanangonana ny fitadidiana ipetrahan'ny pejy maloto sy voatsindry dia ilay antsoina hoe dian-tongotra fitadidiana ny fampiharana. Rehefa tonga amin'ny sandan'ny tokonam-baravarana iray izy dia tonga aorian'ilay dingana ny daemon rafitra mpamono OOM ary manafoana azy an-keriny. Izany no mampiavaka ny iOS raha oharina amin'ny rafitra fandidiana desktop. Mifanohitra amin'izany kosa, ny fampidinana ny dian-tongotra fitadidiana amin'ny alàlan'ny famadihana pejy avy amin'ny fitadidiana ara-batana mankany amin'ny kapila dia tsy omena ao amin'ny iOS. Angamba ny fomba fifindran'ny pejy amin'ny kapila sy miverina dia mandany angovo loatra ho an'ny fitaovana finday, na ny iOS dia mitahiry ny loharanon'ny fanoratana sela amin'ny SSD drive, na angamba ny mpamorona dia tsy afa-po tamin'ny fahombiazan'ny rafitra, izay misy ny zava-drehetra. nivadika tsy tapaka. Na izany na tsy izany dia mbola mitoetra ny zava-misy.

Ny vaovao tsara, efa voalaza teo aloha, dia ny LMDB dia tsy mampiasa ny rafitra mmap hanavao ny rakitra amin'ny alàlan'ny default. Manaraka izany dia sokajian'ny iOS ho fahatsiarovana madio ny angon-drakitra navoaka ary tsy mandray anjara amin'ny dian-tongotra fitadidiana. Azo hamarinina izany amin'ny alàlan'ny fitaovana Xcode antsoina hoe VM Tracker. Ny pikantsary eto ambany dia mampiseho ny toetry ny fitadidiana virtoaly amin'ny fampiharana iOS Cloud mandritra ny fandidiana. Tany am-piandohana, tranga LMDB 2 no natomboka tao. Ny voalohany dia navela hanao sarintany ny rakitra ho 1GiB fahatsiarovana virtoaly, ny faharoa - 512MiB. Na dia eo aza ny zava-misy fa ny fitahirizana dia samy manana ny habetsaky ny fahatsiarovana ny mponina, tsy misy amin'izy ireo mandray anjara amin'ny habe maloto.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Tonga izao ny vaovao ratsy. Noho ny mekanika swap ao amin'ny rafitra fiasan'ny desktop 64-bit, ny dingana tsirairay dia afaka maka toerana virtoaly virtoaly betsaka araka izay ahafahan'ny habaka malalaka ao amin'ny kapila mafy ahafahana mifanakalo azy. Ny fanoloana swap amin'ny famatrarana ao amin'ny iOS dia mampihena be ny haavon'ny teorika. Ankehitriny ny fizotran'ny fiainana rehetra dia tsy maintsy miditra ao amin'ny fahatsiarovana lehibe (vakio ny RAM), ary izay rehetra tsy mety dia iharan'ny fampitsaharana an-tery. Voatonona toy ny eo ambony tatitra, ary ao antontan-taratasy ofisialy. Vokatr'izany, ny iOS dia mametra mafy ny habetsaky ny fahatsiarovana azo omena amin'ny alàlan'ny mmap. Eto eto azonao jerena ny fetra empirika momba ny habetsaky ny fitadidiana izay azo omena amin'ny fitaovana samihafa amin'ny fampiasana ity antso an-tariby ity. Amin'ny modely maoderina indrindra amin'ny finday, iOS dia lasa malala-tanana amin'ny 2 gigabytes, ary amin'ny dikan-teny ambony amin'ny iPad - amin'ny 4. Amin'ny fampiharana, mazava ho azy, tsy maintsy mifantoka amin'ny modely fitaovana tohanana tanora indrindra ianao, izay tena mampalahelo ny zava-drehetra. Mbola ratsy kokoa aza, raha jerena ny toetry ny fitadidiana ny fampiharana ao amin'ny VM Tracker, dia ho hitanao fa ny LMDB dia lavitra ny hany iray milaza ny fitadidiana misy sarintany. Ny ampahany tsara dia lanin'ny mpizara rafitra, rakitra loharano, rafi-tsary ary biby mpiremby kely hafa.

Vokatry ny andrana tao amin'ny Cloud, dia tonga tamin'ireto soatoavina marimaritra iraisana ireto ny fitadidiana natolotry ny LMDB: 384 megabytes ho an'ny fitaovana 32-bit ary 768 ho an'ny 64-bit. Rehefa lany io boky io, dia manomboka mameno ny kaody ny asa fanovana rehetra MDB_MAP_FULL. Hitanay ny lesoka toy izany amin'ny fanaraha-maso anay, saingy kely dia kely izany ka azo atao tsinontsinona amin'izao fotoana izao.

Ny antony tsy mazava ho an'ny fanjifana fahatsiarovana tafahoatra amin'ny fitahirizana dia mety ho fifampiraharahana maharitra. Mba hahatakarana ny fomba ifandraisan'ireo tranga roa ireo, dia hanampy antsika handinika ireo trozona LMDB roa ambiny izany.

3.2. Trozona #2. B+-hazo

Raha te haka tahaka ny latabatra eo an-tampon'ny fivarotana sanda manan-danja dia tsy maintsy misy ireto asa manaraka ireto ao amin'ny API-ny:

  1. Mampiditra singa vaovao.
  2. Mitadiava singa misy fanalahidy nomena.
  3. Famafana singa iray.
  4. Avereno amin'ny elanelana manan-danja amin'ny filaharan'izy ireo.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOSNy rafitra angon-drakitra tsotra indrindra izay afaka mampihatra mora foana ny asa efatra dia hazo fikarohana mimari-droa. Ny node tsirairay dia fanalahidy iray izay mizara ny ampahany manontolo amin'ny fanalahidin'ny ankizy ho zana-kazo roa. Eo ankavia dia ireo izay kely noho ny ray aman-dreny, ary eo ankavanana - ireo izay lehibe kokoa. Ny fahazoana lakile voalamina dia vita amin'ny alalan'ny iray amin'ireo traversal hazo mahazatra

Ny hazo binary dia manana lesoka fototra roa izay manakana azy ireo tsy hahomby amin'ny maha firafitry ny angona kapila. Voalohany, tsy azo antoka ny haavon'ny fifandanjana. Misy risika be dia be ny fahazoana hazo izay mety hiovaova be ny haavon'ny sampana samihafa, izay mampitombo be ny fahasarotan'ny algorithm amin'ny fikarohana raha oharina amin'ny zavatra andrasana. Faharoa, ny habetsahan'ny fifamatorana misy eo amin'ny nodes dia manakana ny hazo mimari-droa ao amin'ny fitadidiana. Vokatr'izany, na dia ny fandehanana tsotra amin'ireo node mifanakaiky amin'ny hazo iray aza dia mety mitaky fitsidihana pejy mitovy. Olana izany na dia miresaka momba ny fahombiazan'ny hazo binary ho toy ny rafitra angon-drakitra ao anaty fitadidiana aza isika, satria tsy mora ny manodina pejy tsy tapaka ao amin'ny cache processeur. Rehefa tonga amin'ny fampiakarana matetika ireo pejy mifandraika amin'ny node avy amin'ny kapila, dia tena ratsy ny zava-drehetra. trangan-javatra mampalahelo.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOSNy hazo B, izay fivoaran'ny hazo mimari-droa, dia mamaha ireo olana voalaza ao amin'ny andalana teo aloha. Voalohany, mampifandanja ny tena izy ireo. Faharoa, ny node tsirairay dia mizara ny fitambaran'ny fanalahidin'ny ankizy tsy ho 2, fa ao amin'ny sobika voafaritry ny M, ary ny isa M dia mety ho lehibe, amin'ny filaharana an-jatony na an'arivony.

Noho izany:

  1. Ny node tsirairay dia manana fanalahidy efa voabaiko marobe ary tena ambany ny hazo.
  2. Ny hazo dia mahazo ny fananan'ny toerana ao amin'ny fitadidiana, satria ny fanalahidy mifanakaiky dia mifanakaiky amin'ny node iray na mifanila aminy.
  3. Mampihena ny isan'ny node fitaterana rehefa midina ny hazo mandritra ny asa fikarohana.
  4. Mampihena ny isan'ny node kendrena vakiana ho an'ny fangataham-panontaniana, satria ny tsirairay amin'izy ireo dia efa misy lakile voalamina marobe.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny LMDB dia mampiasa karazany iray amin'ny hazo B antsoina hoe hazo B+ hitahiry angona. Ny kisary etsy ambony dia mampiseho ireo karazana node telo misy azy:

  1. Eo an-tampony no misy ny fakany. Izy io dia tsy misy afa-tsy ny foto-kevitry ny angon-drakitra ao anaty tahiry iray. Ao anatin'ny ohatra LMDB tokana, azonao atao ny mamorona angon-drakitra marobe izay mizara ny habaka adiresy virtoaly voatanisa. Ny tsirairay amin'izy ireo dia manomboka amin'ny fakany.
  2. Ao amin'ny ambaratonga ambany indrindra dia ny ravina (ravina). Izy ireo ary izy ireo ihany no mirakitra ireo mpivady manan-danja voatahiry ao anaty angon-drakitra. Raha ny marina, izany no mampiavaka ny B+-hazo. Raha ny hazo B mahazatra dia mitahiry ny ampahany amin'ny sanda amin'ny node amin'ny ambaratonga rehetra, dia eo amin'ny ambany indrindra ihany ny fiovan'ny B +. Rehefa avy nametraka an'io zava-misy io isika, amin'ity manaraka ity dia hiantsoana ny zana-kazo ampiasaina ao amin'ny LMDB ho B-hazo tsotra.
  3. Eo anelanelan'ny faka sy ny raviny, dia misy ambaratonga ara-teknika 0 na mihoatra miaraka amin'ny node navigation (sampana). Ny andraikitr'izy ireo dia ny mizara ny lakile voafantina eo amin'ny ravina.

Amin'ny lafiny ara-batana, ny nodes dia singa fitadidiana efa voafaritra mialoha. Ny haben'izy ireo dia isa maromaro amin'ny haben'ny pejy fitadidiana ao amin'ny rafitra fiasana, izay noresahintsika tetsy ambony. Ny rafitra node dia aseho eto ambany. Ny lohapejy dia misy meta-information, ny tena mibaribary indrindra, ohatra, dia ny checksum. Manaraka izany dia misy fampahalalana momba ny offsets, miaraka amin'ireo sela misy angona. Ny anjara asan'ny angon-drakitra dia mety ho fanalahidy, raha miresaka momba ny navigation nodes isika, na mpivady sanda manan-danja iray manontolo amin'ny tranga ravina. Azonao atao ny mamaky bebe kokoa momba ny firafitry ny pejy ao amin'ny asa. "Tombanana ny fivarotana manan-danja avo lenta".

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Rehefa avy nikarakara ny atiny anatiny amin'ny node pejy isika dia hisolo tena ny hazo LMDB B amin'ny fomba tsotsotra amin'ity endrika manaraka ity.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny pejy misy node dia alamina amin'ny kapila. Ny pejy misy isa ambony dia hita any amin'ny faran'ny rakitra. Ilay antsoina hoe pejy meta (pejy meta) dia misy fampahalalana momba ny offset, izay azo ampiasaina hahitana ny fakan'ny hazo rehetra. Rehefa misokatra ny rakitra iray, ny LMDB dia mijery ny pejin'ny rakitra isaky ny pejy manomboka amin'ny farany ka hatrany am-piandohana amin'ny fitadiavana pejy meta manan-kery ary mahita ny angon-drakitra efa misy amin'ny alàlan'izany.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ankehitriny, manana hevitra momba ny rafitra lojika sy ara-batana amin'ny fandaminana angon-drakitra, dia afaka manohy mandinika ny trozona fahatelo an'ny LMDB isika. Miaraka amin'ny fanampiany ny fanovana rehetra amin'ny fitahirizana dia mitranga ara-barotra sy mitokana, manome ny angon-drakitra manontolo koa ny fananana multiversion.

3.3. Trozona #3. kopia amin'ny fanoratana

Ny fiasan'ny hazo B sasany dia mitaky fanovana maromaro amin'ny node. Ohatra iray ny manampy fanalahidy vaovao amin'ny node izay efa nahatratra ny fahafahany ambony indrindra. Amin'ity tranga ity, ilaina, voalohany, ny manasaraka ny node ho roa, ary faharoa, ny manampy rohy mankany amin'ny node zaza voahodina vaovao ao amin'ny ray aman-dreniny. Tena mampidi-doza io fomba fiasa io. Raha toa ka noho ny antony (fianjerana, fahatapahan-jiro, sns.) Ampahany amin'ny fiovana amin'ny andiany ihany no mitranga, dia hijanona amin'ny toe-javatra tsy mifanaraka ny hazo.

Vahaolana nentim-paharazana iray amin'ny fanaovana fandeferana amin'ny angon-drakitra dia ny manampy rafitra angon-drakitra mifototra amin'ny kapila fanampiny, ny log de transaction, fantatra ihany koa amin'ny anarana hoe write-ahead log (WAL), eo akaikin'ny B-tree. Izy io dia rakitra iray, amin'ny faran'izay, alohan'ny fanovana ny B-tree mihitsy, dia voasoratra ny asa natao. Noho izany, raha tsikaritra ny kolikoly amin'ny angon-drakitra mandritra ny fandinihan-tena, ny angon-drakitra dia manadihady ny diary mba hanadiovana ny tenany.

LMDB dia nisafidy fomba hafa ho toy ny rafitra fandeferana ny fahadisoana, izay antsoina hoe kopia amin'ny fanoratana. Ny votoatiny dia ny hoe raha tokony hanavao ny angon-drakitra amin'ny pejy efa misy izy, dia mandika azy tanteraka aloha ary manao ny fanovana rehetra efa ao amin'ny kopia.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Fanampin'izay, mba hahazoana ny angon-drakitra nohavaozina dia ilaina ny manova ny rohy mankany amin'ny node izay efa tonga amin'ny daty ao amin'ny node ray aman-dreny mifandraika amin'izany. Koa satria mila ovaina ihany koa ho amin'izany, dia adika mialoha ihany koa. Ny dingana dia mitohy miverimberina hatrany amin'ny fakany. Ny angon-drakitra ao amin'ny pejy meta no ovaina farany.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Raha mianjera tampoka ny dingana mandritra ny fomba fanavaozana, dia na pejy meta vaovao dia tsy hatsangana, na tsy hosoratana amin'ny kapila mandra-pahatongan'ny farany, ary ho diso ny fanamarinana azy. Amin'ny iray amin'ireo tranga roa ireo dia tsy ho tratra ny pejy vaovao ary tsy hisy fiantraikany ny pejy taloha. Izany dia manafoana ny filan'ny LMDB hanoratra mialoha ny diary mba hihazonana ny fitovian'ny angona. Amin'ny ankapobeny, ny firafitry ny fitahirizana angon-drakitra ao amin'ny kapila, voalaza etsy ambony, dia miara-miasa amin'ny asany. Ny tsy fisian'ny diarin'ny fifampiraharahana mazava dia iray amin'ireo endri-javatra amin'ny LMDB, izay manome hafainganam-pandeha mamaky angon-drakitra avo lenta.​

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny fananganana vokatr'izany, antsoina hoe append-only B-tree, dia manome ny fitokana-monina sy ny multiversioning. Ao amin'ny LMDB, ny fifampiraharahana misokatra tsirairay dia manana fakan-kazo mifandraika amin'izany. Raha mbola tsy vita ny fifampiraharahana, ny pejin'ny hazo mifandray aminy dia tsy hovana na hampiasaina amin'ny dikan-teny vaovao. Noho izany, afaka miasa mandritra ny fotoana tianao ianao miaraka amin'ny fitambaran'ny angona mifandraika amin'ny fotoana nanokafana ny fifampiraharahana, na dia mbola misy fanavaozana mavitrika aza ny fitahirizana amin'izao fotoana izao. Izany no fototry ny multiversioning, mahatonga ny LMDB ho loharanom-angona mety tsara ho an'ny malalantsika UICollectionView. Rehefa nanokatra fifampiraharahana ianao, dia tsy mila mampitombo ny dian-tongotra fitadidiana ny fampiharana, manindrona haingana ny angon-drakitra amin'izao fotoana izao ho ao anaty rafitra fitadidiana sasany, matahotra ny tsy hisy na inona na inona. Ity endri-javatra ity dia manavaka ny LMDB amin'ny SQLite mitovy, izay tsy afaka mirehareha amin'ny fitokanana tanteraka toy izany. Rehefa nanokatra fifampiraharahana roa tamin'ny farany ary namafa rakitra iray tao anatin'ny iray amin'izy ireo, dia tsy azo atao intsony ny rakitra iray ao anatin'ny iray sisa tavela.

Ny sisiny amin'ny vola madinika dia ny fanjifana fahatsiarovana virtoaly mety ho ambony kokoa. Ny slide dia mampiseho ny endriky ny rafitry ny angon-drakitra raha toa ka ovaina miaraka amin'ny fifampiraharahana 3 misokatra misokatra mijery ny dikan-teny samihafa amin'ny angona. Satria ny LMDB dia tsy afaka mampiasa indray nodes izay azo tratrarina avy amin'ny fakany mifandray amin'ny fifanakalozana tena izy, ny fitehirizana dia tsy manan-tsafidy afa-tsy ny mametraka faka fahefatra hafa ao amin'ny fitadidiana ary indray mandeha indray clone ireo pejy novaina eo ambaniny.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Eto dia tsy ho tafahoatra ny mitadidy ny fizarana amin'ny rakitra voarakitra fahatsiarovana. Toa tsy tokony hanelingelina antsika loatra ny fanjifana fanampiny amin'ny fitadidiana virtoaly, satria tsy mandray anjara amin'ny dian'ny fitadidiana ny fampiharana izany. Na izany aza, tamin'izany fotoana izany dia voamarika fa ny iOS dia tena mahiratra amin'ny fizarana azy, ary tsy afaka manome faritra 1 terabyte LMDB amin'ny server na desktop avy amin'ny soroky ny tompony ary tsy mieritreritra an'io endri-javatra io mihitsy. Raha azo atao dia tokony hiezaka ny hitazona ny androm-piainan'ny fifanakalozana ho fohy araka izay azo atao.

4. Famolavolana tetika angon-drakitra eo an-tampon'ny API manan-danja

Andao atomboka amin'ny famakiana ny API amin'ny fijerena ireo abstractions fototra nomen'ny LMDB: tontolo iainana sy angon-drakitra, fanalahidy sy soatoavina, fifanakalozana ary cursors.

Fanamarihana momba ny lisitry ny kaody

Ny asa rehetra ao amin'ny LMDB public API dia mamerina ny vokatry ny asany amin'ny endrika kaody diso, fa amin'ny lisitra manaraka rehetra dia nesorina ny taratasiny noho ny fahafoizana. fork C++ fonosana lmdbxx, izay misy lesoka miseho ho C++ exceptions.

Amin'ny maha fomba haingana indrindra hampifandraisana ny LMDB amin'ny tetikasa iOS na macOS, dia manolotra ny CocoaPod-ko aho POSLMDB.

4.1. abstractions fototra

TONTOLO IAINANA

rafitra MDB_env dia ny fitahirizana ny fanjakana anatiny ao amin'ny LMDB. Fianakaviana misy fonctions misy prefix mdb_env ahafahanao manamboatra ny sasany amin'ireo toetrany. Amin'ny tranga tsotra indrindra, ny fanombohana ny motera dia toy izao.

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

Ao amin'ny rindranasa Mail.ru Cloud dia nanova ny soatoavina default ho an'ny masontsivana roa ihany izahay.

Ny voalohany dia ny haben'ny habaka adiresy virtoaly izay misy ny rakitra fitahirizana sari-tany. Indrisy anefa, na dia amin'ny fitaovana iray ihany aza, ny sanda manokana dia mety miovaova be avy amin'ny mihazakazaka mankany amin'ny mihazakazaka. Mba hijerena an'io endri-javatra an'ny iOS io dia misafidy ny habetsaky ny fitahirizana ambony indrindra izahay. Manomboka amin'ny sanda iray, misesy antsasany ka hatramin'ny asa mdb_env_open tsy hamerina valiny afa-tsy ENOMEM. Ao amin'ny teoria, misy fomba mifanohitra - aloha manome fahatsiarovana kely indrindra ho an'ny motera, ary avy eo, rehefa misy fahadisoana. MDB_MAP_FULL, ampitomboy izany. Na izany aza, sarotra kokoa izany. Ny antony dia ny fomba fametahana fahatsiarovana amin'ny fampiasana ny fiasa mdb_env_set_map_size manafoana ny enti-manana rehetra (cursors, transactions, keys and values) azo avy amin'ny motera teo aloha. Ny kaonty amin'ny fiodinan'ny hetsika toy izany ao amin'ny fehezan-dalàna dia hitarika ho amin'ny fahasarotana lehibe. Na izany aza, raha tena tianao ny fahatsiarovana virtoaly, dia mety ho antony iray hijerena ny sampana efa lasa lavitra izany. MDBX, izay ao anatin'ireo endri-javatra nambara dia misy ny "fanitsiana ny haben'ny angon-drakitra mandeha ho azy".

Ny mari-pamantarana faharoa, ny sandan'ny default izay tsy mifanaraka aminay, dia mifehy ny mekanika hiantohana ny fiarovana ny kofehy. Indrisy anefa, farafaharatsiny ao amin'ny iOS 10, misy olana amin'ny fanohanana fitehirizana eo an-toerana. Noho izany antony izany, amin'ny ohatra etsy ambony, dia misokatra amin'ny saina ny tahiry MDB_NOTLS. Ankoatra izany, dia ilaina ihany koa fork C++ wrapper lmdbxxhanapaka ny fari-piainana miaraka amin'ity toetra ity.

angona

Ny angon-drakitra dia ohatra miavaka amin'ny hazo B izay noresahintsika etsy ambony. Ny fanokafana azy dia ao anatin'ny fifampiraharahana iray, izay toa hafahafa kely amin'ny voalohany.

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

Raha ny marina, ny fifampiraharahana ao amin'ny LMDB dia orinasa fitahirizana fa tsy angon-drakitra manokana. Ity foto-kevitra ity dia ahafahanao manao hetsika atomika amin'ireo singa hita ao amin'ny tahiry samihafa. Amin'ny teôlôjia, izany dia manokatra ny mety hisian'ny modeling latabatra amin'ny endrika angon-drakitra samihafa, saingy tamin'ny fotoana iray dia nandeha tamin'ny fomba hafa aho, izay voalaza amin'ny antsipiriany etsy ambany.

Fanalahidy sy soatoavina

rafitra MDB_val modely ny foto-kevitry ny fanalahidy sy ny sanda. Ny tahiry dia tsy manana hevitra momba ny semantika. Ho azy, ny zavatra hafa dia andian-bytes amin'ny habe nomena. Ny habe lehibe indrindra dia 512 bita.

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

Mampiasa comparator ny magazay mba handaminana ny lakile amin'ny filaharana miakatra. Raha tsy soloinao amin'ny anao manokana izany, dia ny default no hampiasaina, izay manasokajy azy ireo byte-by-byte amin'ny filaharan'ny lexicographic.​

varotra

Ny fitaovana fifampiraharahana dia voafaritra amin'ny antsipiriany ao toko teo aloha, ka eto dia haveriko amin'ny andalana fohy ny fananany fototra:

  1. Fanohanana ny fananana fototra rehetra asidraTeny fototra: atomika, tsy miovaova, mitoka-monina ary azo itokisana. Tsy azoko atao ny manamarika fa amin'ny resaka faharetana amin'ny macOS sy iOS dia misy bug raikitra ao amin'ny MDBX. Afaka mamaky bebe kokoa ao amin'izy ireo ianao README.
  2. Ny fomba fiasa amin'ny multithreading dia nofaritan'ny tetika "mpanoratra tokana / mpamaky marobe". Mifampisakanana ny mpanoratra, fa tsy manakana ny mpamaky. Ny mpamaky dia tsy manakana ny mpanoratra na ny tsirairay.
  3. Fanohanana amin'ny fifampiraharaham-barotra.
  4. Fanohanana multiversion.

Ny multiversioning ao amin'ny LMDB dia tena tsara ka tiako ny hampiseho izany amin'ny asa. Ny kaody etsy ambany dia mampiseho fa ny fifampiraharahana tsirairay dia miara-miasa amin'ny dikan-tenin'ny angon-drakitra mifandraika amin'ny fotoana nanokafana azy, ary mitoka-monina tanteraka amin'ny fanovana rehetra manaraka. Ny fanombohana ny fitehirizam-bokatra sy ny fampidirana ny firaketana fitsapana ho azy dia tsy mahaliana, noho izany dia avela eo ambanin'ny mpandroba ireo fombafomba ireo.

Manampy fidirana andrana

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

Raha azo atao, manoro hevitra aho hanandrana ny fika mitovy amin'ny SQLite ary jereo izay mitranga.

Ny multiversioning dia mitondra tombony tena tsara amin'ny fiainan'ny mpamorona iOS. Amin'ny fampiasana an'io fananana io dia azonao atao ny manitsy mora foana ny tahan'ny fanavaozam-baovao loharanon'ny angona ho an'ny endrika efijery mifototra amin'ny fiheveran'ny mpampiasa traikefa. Ohatra, andeha horaisintsika ny endri-javatra toy izany amin'ny fampiharana Mail.ru Cloud toy ny fandefasana votoaty avy amin'ny galerian'ny media system. Miaraka amin'ny fifandraisana tsara, ny mpanjifa dia afaka manampy sary maromaro isan-tsegondra amin'ny mpizara. Raha manavao ianao aorian'ny fampidinana tsirairay UICollectionView miaraka amin'ny votoatin'ny haino aman-jery ao amin'ny rahon'ny mpampiasa, afaka manadino momba ny 60 fps sy ny horonan-taratasy milamina ianao mandritra ity dingana ity. Mba hisorohana ny fanavaozam-baovao matetika amin'ny efijery dia mila mametra ny tahan'ny fiovan'ny angona amin'ny fototra ianao UICollectionViewDataSource.

Raha toa ka tsy manohana multiversioning ny angon-drakitra ary mamela anao hiasa afa-tsy amin'ny toe-javatra misy ankehitriny, dia mba hamoronana snapshot data maharitra, dia mila mandika izany ianao na amin'ny rafitra angon-drakitra ao anaty fitadidiana na amin'ny latabatra vonjimaika. Ny iray amin'ireo fomba fiasa ireo dia tena lafo. Raha ny fitahirizana ao anaty fitadidiana, dia samy mahazo ny vidin'ny fitadidiana vokatry ny fitehirizana zavatra namboarina sy ny vidin'ny fotoana mifandraika amin'ny fiovan'ny ORM tafahoatra. Raha ny latabatra vonjimaika dia fahafinaretana lafo kokoa izany, izay tsy misy dikany afa-tsy amin'ny tranga tsy misy dikany.

Ny multiversioning LMDB dia mamaha ny olana amin'ny fitazonana loharanon-drakitra marin-toerana amin'ny fomba tena kanto. Ampy fotsiny ny manokatra transaction ary voila - mandra-pahavitantsika azy dia azo antoka fa ho raikitra ny angon-drakitra. Ny lojikan'ny taham-panavaozana azy dia eo am-pelatanan'ny sosona fanolorana tanteraka, tsy misy loharanon-karena manan-danja.

cursors

Ny cursors dia manome mekanika ho an'ny famerimberenana mirindra amin'ireo mpivady sanda manan-danja amin'ny alàlan'ny fandehanana amin'ny hazo B. Raha tsy misy azy ireo dia tsy ho azo atao ny manao modely amin'ny fomba mahomby ireo latabatra ao amin'ny angon-drakitra, izay hitodika amin'izao fotoana izao.

4.2. Modeling latabatra

Ny fananana fibaikoana fototra dia ahafahanao manamboatra abstraction ambony indrindra toy ny latabatra eo an-tampon'ny abstractions fototra. Andeha hodinihintsika ity dingana ity amin'ny ohatra amin'ny latabatra lehibe amin'ny mpanjifa rahona, izay misy ny fampahalalana momba ny rakitra sy ny lahatahiry rehetra an'ny mpampiasa.

Skema tabilao

Ny iray amin'ireo toe-javatra mahazatra izay tokony hanamafisana ny firafitry ny latabatra misy hazo fampirimana dia ny fisafidianana ireo singa rehetra hita ao anatin'ny lahatahiry iray. Lisitry ny fifanarahana. Mba hampiharana azy eo an-tampon'ny fitahirizana sanda manan-danja, dia ilaina ny mandamina ny fanalahidin'ny rakitra sy ny lahatahiry amin'ny fomba izay atambatra amin'ny alàlan'ny lahatahiry ray aman-dreny. Ho fanampin'izany, mba hampisehoana ny votoatin'ny lahatahiry amin'ny endrika mahazatra amin'ny mpampiasa Windows (folder aloha, avy eo ny rakitra, samy alaina araka ny abidia), dia ilaina ny mampiditra ny saha fanampiny mifanaraka amin'izany ao amin'ny fanalahidy.

Ny sary etsy ambany dia mampiseho ny fomba, mifototra amin'ny asa, ny fanehoana ny lakile amin'ny maha-andian-bytes azy. Voalohany, apetraka ny bita misy ny anaran'ny lahatahiry (mena), avy eo amin'ny karazana (maitso), ary efa eo amin'ny rambony misy anarana (manga). ny fomba ilaina. Ny fanalahidin'ny filaharana miaraka amin'ny prefix mena mitovy dia manome antsika ny soatoavina mifandraika amin'izy ireo amin'ny filaharan'izy ireo tokony haseho ao amin'ny interface interface (ankavanana), tsy mila fanodinana fanampiny.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Fanalahidy sy soatoavina serial

Misy fomba maro hanaovana serializing zavatra manerana izao tontolo izao. Koa satria tsy nanana fepetra hafa afa-tsy ny hafainganam-pandeha izahay, dia nisafidy ny haingana indrindra ho anay izahay - fanariam-pahatsiarovana misy ohatra amin'ny firafitry ny fiteny C. Noho izany, ny fanalahidin'ny singa lahatahiry dia azo atao modely amin'ny rafitra manaraka. NodeKey.

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

Mamonjy NodeKey amin'ny fitahirizana mila amin'ny zavatra MDB_val apetraho eo amin'ny adiresin'ny fiantombohan'ny rafitra ny tondro mankany amin'ny angon-drakitra, ary kajy ny habeny miaraka amin'ny fiasa sizeof.

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

Ao amin'ny toko voalohany momba ny fepetra fisafidianana ny angon-drakitra, dia nilaza aho fa ny fampihenana ny famatsiam-bola mavitrika ho ampahany amin'ny fiasan'ny CRUD ho singa manan-danja amin'ny fisafidianana. Function Code serialize dia mampiseho ny fomba, amin'ny trangan'ny LMDB, azo ialana tanteraka izy ireo rehefa ampidirina ao amin'ny angon-drakitra ny rakitra vaovao. Ny andian-bytes miditra avy amin'ny mpizara dia ovaina voalohany ho rafitra stack, ary avy eo dia ariana kely ao anaty fitahirizana. Noho ny tsy fisian'ny fizarana mavitrika ao anatin'ny LMDB dia afaka mahazo toe-javatra mahafinaritra ianao amin'ny alàlan'ny fenitry ny iOS - ampiasao ny fitadidiana stack fotsiny mba hiasa miaraka amin'ny angona hatrany amin'ny tambajotra mankany amin'ny kapila!

Manafatra fanalahidy miaraka amin'ny fampitahana binary

Ny fifandraisan'ny filaharana fototra dia omen'ny fiasa manokana antsoina hoe comparator. Koa satria ny motera dia tsy mahalala na inona na inona momba ny semantika amin'ny bytes misy azy, ny comparator default dia tsy manan-tsafidy afa-tsy ny mandamina ny fanalahidy amin'ny filaharan'ny lexicographic, mampiasa ny fampitahana byte-by-byte azy. Ny fampiasana azy handaminana rafitra dia mitovy amin'ny fiharatra amin'ny famaky sokitra. Na izany aza, amin'ny tranga tsotra dia hitako fa azo ekena io fomba io. Ny safidy dia voalaza etsy ambany, fa eto aho dia hanamarika ireo rakes roa miparitaka eny an-dalana.

Ny zavatra voalohany tokony hotadidina dia ny fanehoana fahatsiarovana ireo karazana data primitive. Noho izany, amin'ny fitaovana Apple rehetra dia voatahiry amin'ny endrika ny fari-piadidiana integer Endian kely. Midika izany fa ho eo ankavia ny byte faran'izay manan-danja indrindra, ary tsy ho afaka hanasokajy ny isa amin'ny fampitahana byte-by-byte ianao. Ohatra, ny fiezahana hanao izany miaraka amin'ny andiana isa 0 ka hatramin'ny 511 dia hiteraka vokatra manaraka.

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

Mba hamahana ity olana ity dia tsy maintsy tehirizina ao amin'ny lakile amin'ny endrika mety amin'ny comparator byte ny isa. Ny asa avy amin'ny fianakaviana dia hanampy amin'ny fanatanterahana ny fanovana ilaina. hton* (manokana htons ho an'ny isa roa-byte avy amin'ny ohatra).

Ny endrika maneho tady amin'ny fandaharana dia iray manontolo, araka ny fantatrao Tantara. Raha toa ny semantika amin'ny tady, ary koa ny encoding ampiasaina hanehoana azy ireo ao amin'ny fitadidiana, dia manoro hevitra fa mety misy mihoatra ny iray byte isaky ny tarehin-tsoratra, dia tsara kokoa ny miala avy hatrany ny hevitra mampiasa fampitahana default.

Ny zavatra faharoa tokony hotadidina dia fitsipika fampifanarahana struct field compiler. Noho izy ireo dia azo amboarina ao anatin'ny fitadidiana eo anelanelan'ny saha ireo bytes misy sanda fako, izay, mazava ho azy, manapaka ny fanasokajiana byte. Mba hanafoanana ny fako, dia tsy maintsy manambara ny saha amin'ny filaharana voafaritra tsara ianao, mitadidy ny fitsipika fampifanarahana, na mampiasa ny toetra ao amin'ny fanambarana rafitra. packed.

Filaharana fototra amin'ny fampitahana ivelany

Ny lojika fampitahana fototra dia mety hivadika ho sarotra loatra ho an'ny fampitahana binary. Iray amin'ireo antony maro ny fisian'ny sehatra ara-teknika ao anatin'ireo rafitra. Hasehoko an-tsary ny fisehoan'izy ireo amin'ny ohatry ny fanalahidy efa mahazatra antsika ho an'ny singa lahatahiry.

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

Noho ny fahatsorany rehetra, amin'ny ankamaroan'ny tranga dia mandany fitadidiana be loatra. Ny lohatenin'ny buffer dia 256 bytes, na dia eo ho eo aza ny anaran'ny rakitra sy ny lahatahiry dia zara raha mihoatra ny 20-30 tarehintsoratra.

Ny iray amin'ireo teknika manara-penitra amin'ny fanatsarana ny haben'ny rakitra dia ny manapaka azy hifanaraka amin'ny habeny. Ny tena maha-izy azy dia ny votoatin'ny saha miovaova-lavany rehetra dia voatahiry ao anaty buffer amin'ny faran'ny rafitra, ary ny halavany dia voatahiry amin'ny fari-piainana samihafa.Mifanaraka amin'io fomba fiasa io, ny fanalahidy NodeKey dia miova amin'ny fomba manaraka.

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

Fanampin'izay, mandritra ny serialization, tsy voalaza ho ny haben'ny data sizeof ny rafitra manontolo, ary ny haben'ny saha rehetra dia raikitra ny halavany miampy ny haben'ny ampahany tena ampiasaina amin'ny buffer.

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

Vokatry ny refactoring dia nahazo tahiry lehibe izahay tao amin'ny toerana misy ny fanalahidy. Na izany aza, noho ny sehatra ara-teknika nameLength, ny fampitahana binary default dia tsy mety amin'ny fampitahana fototra. Raha tsy soloinay amin'ny anay izany, dia ny halavan'ny anarana no laharam-pahamehana kokoa amin'ny fanasokajiana noho ny anarana.

Ny LMDB dia mamela ny angon-drakitra tsirairay hanana ny asa fampitahana fototra. Izany dia atao amin'ny fampiasana ny asa mdb_set_compare hentitra alohan'ny hanokafana. Noho ny antony mazava dia tsy azo ovaina mandritra ny androm-piainany ny angon-drakitra. Ao amin'ny fampidirana, ny comparator dia mahazo fanalahidy roa amin'ny endrika binary, ary amin'ny famoahana dia mamerina ny vokatry ny fampitahana: latsaky ny (-1), lehibe noho (1) na mitovy (0). Pseudocode ho an'ny NodeKey toa izany.

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

Raha toa ka mitovy karazana ny fanalahidy rehetra ao amin'ny angon-drakitra, dia ara-dalàna ny mandefa tsy misy fepetra ny fanehoana byte azy amin'ny karazana rafitra fampiharana ny fanalahidy. Misy nuance iray eto, fa hodinihina ambany kely ao amin'ny fizarana "Reading Records".

Serialization sanda

Miaraka amin'ny fanalahidin'ny rakitra voatahiry, ny LMDB dia miasa mafy. Izy ireo dia ampitahaina amin'ny tsirairay ao anatin'ny rafitry ny fampiharana fampiharana rehetra, ary ny fanatanterahana ny vahaolana manontolo dia miankina amin'ny hafainganam-pandehan'ny comparator. Ao amin'ny tontolo idealy, ny fampitahana binary default dia tokony ho ampy mba hampitahana ny fanalahidy, fa raha tena tsy maintsy mampiasa ny anao manokana ianao, dia tokony ho haingana araka izay tratra ny fomba fametahana ny fanalahidy ao anatiny.

Ny angon-drakitra dia tsy liana manokana amin'ny sanda-ampahan'ny rakitra (value). Ny fiovam-pony avy amin'ny fanehoana byte ho zavatra iray dia mitranga raha tsy efa takian'ny fehezan-dalàna fampiharana izany, ohatra, mba hampisehoana azy eo amin'ny efijery. Satria zara raha mitranga izany, dia tsy dia manakiana loatra ny fepetra takiana amin'ny hafainganan'ity fomba fiasa ity, ary amin'ny fampiharana azy dia malalaka kokoa isika hifantoka amin'ny fanamorana. NSKeyedArchiver.

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

Na izany aza, misy fotoana izay zava-dehibe ny fampisehoana. Ohatra, rehefa mitahiry meta-information momba ny firafitry ny fisie an'ny rahona mpampiasa, dia mampiasa ny fanariam-pahatsiarovana zavatra mitovy. Ny tena zava-dehibe amin'ny asa famoronana ny solontena serialised dia ny zava-misy fa ny singa ao amin'ny lahatahiry dia modely amin'ny ambaratonga ambony.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ho an'ny fampiharana azy amin'ny fiteny C, ny sehatra manokana amin'ny mpandova dia esorina amin'ny rafitra samihafa, ary ny fifandraisany amin'ny fototra iray dia voafaritra amin'ny alàlan'ny sehatry ny karazana sendika. Ny tena votoatin'ny sendikà dia voafaritra amin'ny alàlan'ny karazana toetra ara-teknika.

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

Manampy sy manavao ny fidirana

Azo ampidirina ao amin'ny magazay ny lakile sy ny sanda serialised. Ho an'izany dia ampiasaina ny asa mdb_put.

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

Eo amin'ny sehatry ny fanamafisana dia azo avela na voarara ny fitahirizana rakitra maromaro miaraka amin'ny fanalahidy iray ihany. Raha vokatry ny hadisoana ao amin'ny kaody ihany no mety hitranga ny fraying, dia azonao atao ny miantoka azy io amin'ny alàlan'ny famaritana ny saina. NOOVERWRITE.

Famakiana rakitsoratra

Ny fiasan'ny famakiana rakitsoratra ao amin'ny LMDB dia mdb_get. Raha asehon'ny rafitra efa nariana teo aloha ny mpivady sanda manan-danja, dia toy izao ity fomba fiasa ity.

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

Ny lisitra aseho dia mampiseho fa ny serialization amin'ny alàlan'ny fanariam-pamokarana dia ahafahanao manala ny fizarana mavitrika tsy rehefa manoratra, fa rehefa mamaky angon-drakitra. Avy amin'ny dikantenin'i function teo amin'i Wikibolana anglisy mdb_get ny pointer dia mijery tsara ny adiresy fahatsiarovana virtoaly izay itahirizan'ny angon-drakitra ny fanehoana byte ny zavatra. Raha ny marina dia mahazo karazana ORM izahay, saika maimaim-poana manome angon-drakitra mamaky haingana be. Miaraka amin'ny hatsaran'ny fomba fiasa rehetra, ilaina ny mitadidy endri-javatra maromaro mifandraika amin'izany.

  1. Ho an'ny fifampiraharahana vakiana fotsiny, ny tondro mankany amin'ny rafitry ny sanda dia azo antoka fa tsy manankery raha tsy mandra-pikatona ny varotra. Araka ny nomarihina teo aloha, ny pejin'ny hazo-B izay itoeran'ilay zavatra, noho ny fitsipiky ny kopia amin'ny fanoratana, dia tsy miova raha toa ka misy fifampiraharahana iray farafaharatsiny manondro azy ireo. Mandritra izany fotoana izany, raha vantany vao vita ny fifampiraharahana farany mifandraika amin'izy ireo, dia azo ampiasaina indray ireo pejy ho an'ny angona vaovao. Raha ilaina ho an'ny zavatra mba ho tafavoaka velona amin'ny fifanakalozana izay namorona azy ireo, dia mbola tsy maintsy adika.
  2. Ho an'ny fifampiraharahana amin'ny famakiana, ny tondro mankany amin'ny sandan'ny rafitra aterak'izany dia tsy manan-kery raha tsy amin'ny fomba fanovana voalohany (manoratra na mamafa angona).
  3. Na dia ny rafitra NodeValue tsy feno, fa voatetika (jereo ny fizarana "Fametrahana fanalahidy amin'ny fampitahana ivelany"), amin'ny alàlan'ny fanondro, azonao atao ny miditra mora foana ny sahany. Ny tena zava-dehibe dia tsy ny dereference izany!
  4. Na izany na tsy izany dia azonao atao ny manova ny rafitra amin'ny alàlan'ny tondro voaray. Ny fanovana rehetra dia tsy maintsy atao amin'ny alàlan'ny fomba mdb_put. Na izany aza, miaraka amin'ny faniriana rehetra hanao izany dia tsy hahomby izany, satria ny faritra fitadidiana izay misy an'io rafitra io dia voapetaka amin'ny fomba vakiana fotsiny.
  5. Avereno amboarina ny rakitra iray mankany amin'ny habaka adiresin'ny dingana iray mba, ohatra, hampitombo ny haben'ny fitahirizana ambony indrindra amin'ny fampiasana ilay fiasa mdb_env_set_map_size manafoana tanteraka ny fifampiraharahana rehetra sy ny sampana mifandraika amin'ny ankapobeny ary ny tondro mamaky zavatra manokana.

Farany, ny endri-javatra iray hafa dia tena mamitaka ka tsy mifanaraka amin'ny teboka iray fotsiny ny fampahafantarana ny tena maha izy azy. Ao amin'ny toko momba ny hazo B, dia nanome kisary momba ny fandaminana ny pejiny ho fitadidiana aho. Manaraka izany fa ny adiresin'ny fiandohan'ny buffer miaraka amin'ny angona serialised dia mety ho tsy misy dikany. Noho izany, ny tondro ho azy ireo, azo ao amin`ny rafitra MDB_val ary mazàna tsy mifanandrify amin'ny fanondro amin'ny rafitra iray. Mandritra izany fotoana izany, ny maritrano amin'ny chips sasany (raha ny iOS, izany no armv7) dia mitaky ny adiresin'ny angon-drakitra rehetra ho maromaro amin'ny haben'ny teny milina, na, amin'ny teny hafa, ny bikan'ny rafitra. (ho an'ny armv7, ity dia 32 bit). Amin'ny teny hafa, fandidiana toy ny *(int *foo)0x800002 amin'izy ireo dia ampitoviana amin'ny fandosirana ary mitarika ho amin'ny famonoana miaraka amin'ny didim-pitsarana EXC_ARM_DA_ALIGN. Misy fomba roa hialana amin'ny loza mampalahelo toy izany.

Ny voalohany dia ny mandika ny angon-drakitra amin'ny rafitra efa fantatra mialoha. Ohatra, amin'ny fampitahana mahazatra, dia ho hita toy izao manaraka izao izany.

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

Ny fomba iray hafa dia ny fampahafantarana mialoha ny mpanangom-bokatra fa ny rafitra misy fanalahidy sy sanda dia mety tsy hifanaraka amin'ny fampiasana toetra iray. aligned(1). Amin'ny ARM dia mety hisy vokany mitovy HITENENANA MISOSA ary mampiasa ny toetra feno entana. Raha jerena fa manampy amin'ny fanatsarana ny habaka ipetrahan'ny rafitra ihany koa izany, dia toa tiako kokoa io fomba io, na dia eo aza izany. приводит hampitombo ny vidin'ny asa fidirana amin'ny angona.

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

Fanontaniana isan-karazany

Mba hamerenana amin'ny vondrona rakitsoratra iray dia manome abstraction cursor ny LMDB. Andeha hojerentsika ny fomba fiasa amin'izany amin'ny fampiasana ny ohatra amin'ny latabatra misy metadata rahona mpampiasa efa mahazatra antsika.

Ao anatin'ny fampisehoana lisitry ny rakitra ao amin'ny lahatahiry iray, dia mila mitady ny fanalahidy rehetra mifandray amin'ny rakitra sy lahatahiry zanany ianao. Ao amin'ny fizarana teo aloha dia nalahatray ny fanalahidy NodeKey mba hanafatra azy ireo voalohany amin'ny ID lahatahiry ray aman-dreniny. Araka izany, ara-teknika, ny asa amin'ny fahazoana ny votoatin'ny lahatahiry iray dia ahena amin'ny fametrahana ny cursor eo amin'ny sisin-tany ambony amin'ny vondron'ny fanalahidy misy prefix nomena, arahin'ny famerenana mankany amin'ny sisintany ambany.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Azonao atao ny mahita ny sisiny ambony "eo amin'ny handrina" amin'ny alàlan'ny fikarohana misesy. Mba hanaovana izany, ny cursor dia apetraka eo am-piandohan'ny lisitry ny fanalahidy manontolo ao amin'ny angon-drakitra ary avy eo dia ampitomboina mandra-pisehony eo ambanin'ilay fanalahidy miaraka amin'ny lisitry ny lahatahiry. Ity fomba fiasa ity dia manana lesoka 2 mazava tsara:

  1. Ny fahasarotan'ny tsipika amin'ny fikarohana, na dia, araka ny fantatrao, amin'ny hazo amin'ny ankapobeny ary amin'ny hazo B manokana, dia azo atao amin'ny fotoana logaritma izany.
  2. Zava-poana, ny pejy rehetra alohan'ny tiana dia atsangana avy amin'ny rakitra mankany amin'ny fitadidiana fototra, izay lafo be.

Soa ihany fa ny LMDB API dia manome fomba mahomby hametrahana ny cursor voalohany. Mba hanaovana izany dia mila mamorona fanalahidy iray izay fantatra fa kely kokoa na mitovy amin'ny fanalahidy hita eo amin'ny sisiny ambony amin'ny elanelana. Ohatra, mifandray amin'ny lisitra eo amin'ny sary etsy ambony, dia afaka manao fanalahidy izay ny saha parentId ho mitovy amin'ny 2, ary ny ambiny rehetra dia feno aotra. Ny fanalahidy feno ampahany toy izany dia omena amin'ny fampidirana ny asa mdb_cursor_get milaza asa 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);

Raha hita ny sisiny ambony amin'ny vondron'ny fanalahidy, dia averinay izany mandra-pihaona na ny fanalahidy amin'ny hafa. parentId, na tsy ho lany mihitsy ny lakile.​

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

Inona no mahafinaritra, amin'ny maha-ampahany amin'ny fampiasana mdb_cursor_get, tsy ny fanalahidy ihany no azontsika, fa ny sandany ihany koa. Raha, mba hanatanterahana ny fepetra fifantenana, dia ilaina ny manamarina, ankoatry ny zavatra hafa, ny saha avy amin'ny sandan'ny ampahany amin'ny rakitsoratra, dia azo idirana amin'ny tenany izy ireo raha tsy misy fihetsika fanampiny.

4.3. Modeling fifandraisana eo amin'ny latabatra

Hatramin'izao, nahavita nandinika ny lafiny rehetra amin'ny famolavolana sy ny fiasana miaraka amin'ny angon-drakitra misy tabilao tokana izahay. Azontsika atao ny milaza fa ny latabatra dia fitambarana rakitsoratra voasokajy ahitana tsiroaroa manan-danja mitovy karazana. Raha asehonao ny lakile ho toy ny mahitsizoro ary ny sanda mifandraika amin'izany ho toy ny boaty, dia mahazo sary an-tsary momba ny angon-drakitra ianao.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Na izany aza, amin'ny tena fiainana dia zara raha azo atao amin'ny ra kely. Matetika ao anaty angon-drakitra dia ilaina, voalohany, manana latabatra maromaro, ary faharoa, manao safidy ao anatin'izy ireo amin'ny filaharana tsy mitovy amin'ny fanalahidy fototra. Ity fizarana farany ity dia natokana ho an'ny olana momba ny famoronana sy ny fifandraisany.

Tabilao fanondro

Ny fampiharana rahona dia manana fizarana "Gallery". Mampiseho ny votoatin'ny haino aman-jery avy amin'ny rahona manontolo izy io, nalahatra araka ny daty. Ho an'ny fampiharana tsara indrindra amin'ny safidy toy izany, eo akaikin'ny latabatra lehibe dia mila mamorona iray hafa miaraka amin'ny karazana fanalahidy vaovao ianao. Hisy saha misy ny daty namoronana ny rakitra izy ireo, izay ho toy ny fepetra fanasokajiana voalohany. Satria ireo fanalahidy vaovao dia manondro ny angon-drakitra mitovy amin'ny fanalahidy ao amin'ny tabilao fototra, dia antsoina hoe fanalahidin'ny index. Asongadina amin'ny loko volomparasy izy ireo eo amin'ny sary etsy ambany.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Mba hanasarahana ny fanalahidin'ny latabatra samy hafa ao anatin'ny angon-drakitra iray ihany, dia nisy tableId ara-teknika fanampiny nampiana azy rehetra. Amin'ny fanaovana azy io ho laharam-pahamehana indrindra amin'ny fanasokajiana, dia havondrontsika amin'ny latabatra aloha ny lakile, ary efa ao anatin'ny latabatra - araka ny fitsipikay manokana.​

Ny fanalahidin'ny fanondro dia manondro angona mitovy amin'ny fanalahidy fototra. Ny fampiharana mivantana an'io fananana io amin'ny fampifandraisana azy ny dika mitovy amin'ny ampahany amin'ny sanda amin'ny lakile voalohany dia ambany indrindra amin'ny fomba fijery maromaro indray mandeha:

  1. Raha jerena amin'ny fomba fijerin'ny habaka, ny metadata dia mety ho manankarena.
  2. Avy amin'ny fomba fijery fampisehoana, satria rehefa manavao ny metadata node dia tsy maintsy manoratra fanalahidy roa ianao.
  3. Avy amin'ny fomba fijery ny fanohanan'ny kaody, na izany aza, raha hadinontsika ny manavao ny angon-drakitra ho an'ny iray amin'ireo fanalahidy, dia hahazo bug ankolaka ny tsy fitovian'ny data ao amin'ny fitahirizana.

Hodinihintsika avy eo ny fomba hanafoanana ireo lesoka ireo.

Fandaminana ny fifandraisana eo amin'ny latabatra

Ny lamina dia mety tsara amin'ny fampifandraisana latabatra fanondro amin'ny lehibe "key as value". Araka ny lazain'ny anarany, ny ampahany amin'ny sanda amin'ny rakitsoratra fanondroana dia dika mitovy amin'ny sanda fototra fototra. Ity fomba fiasa ity dia manafoana ny tsy fahampiana rehetra voatanisa etsy ambony mifandraika amin'ny fitehirizana ny dika mitovy amin'ny sanda amin'ny rakitsoratra voalohany. Ny hany sarany dia ny hahazoana ny sanda amin'ny alàlan'ny fanalahidin'ny index, mila manao fanontaniana 2 amin'ny angon-drakitra ianao fa tsy iray. Araka ny skéma dia toy izao manaraka izao ny schema database.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Fomba iray hafa amin'ny fandaminana ny fifandraisana eo amin'ny latabatra dia "key redundant". Ny votoatiny dia ny manampy toetra fanampiny amin'ny fanalahidy, izay tsy ilaina amin'ny fanasokajiana, fa amin'ny famerenana indray ny fanalahidy mifandraika. tontolon'ny rafitra iOS manokana, hanome ohatra foronina aho, saingy azo takarina kokoa.

Manana pejy mampiseho ny rakitra sy lahatahiry rehetra nozarain'ny mpampiasa tamin'ny olon-kafa ny mpanjifan'ny finday rahona. Koa satria vitsy ny rakitra toy izany, ary be dia be ny fampahalalana manokana momba ny dokam-barotra mifandray amin'izy ireo (izay omena ny fidirana, inona ny zo, sns.), dia tsy mitombina ny manavesatra azy amin'ny ampahany amin'ny sandan'ny. ny fidirana ao amin'ny latabatra lehibe. Na izany aza, raha te-hampiseho rakitra toy izany ivelan'ny aterineto ianao, dia mbola mila mitahiry azy any amin'ny toerana iray. Vahaolana voajanahary dia ny famoronana latabatra mitokana ho azy. Ao amin'ny kisary etsy ambany, ny fanalahidiny dia misy "P", ary ny toerana misy ny "propname" dia azo soloina amin'ny sanda manokana "fampahalalam-baovao".

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Ny metadata tsy manam-paharoa rehetra, izay namoronana ny latabatra vaovao, dia nafindra tany amin'ny ampahany sanda amin'ny rakitra. Amin'izay fotoana izay ihany koa dia tsy te-hanao dika mitovy ny angon-drakitra momba ny rakitra sy ny lahatahiry efa voatahiry ao amin'ny latabatra lehibe aho. Raha ny tokony ho izy, ny angona mihoa-pampana dia ampiana amin'ny famaha "P" amin'ny endriky ny saha "node ID" sy "timestamp". Misaotra azy ireo, afaka manamboatra fanalahidin'ny index ianao, izay ahafahanao mahazo ny fanalahidy fototra, izay, amin'ny farany, azonao atao ny mahazo ny metadata amin'ny node.

Famaranana

Manombana tsara ny vokatry ny fampiharana ny LMDB izahay. Taorian'izany dia nihena 30% ny isan'ny fampiharana.

Ny famirapiratana sy ny fahantran'ny angon-drakitra manan-danja LMDB amin'ny fampiharana iOS

Nahita valiny ivelan'ny ekipa iOS ny vokatry ny asa vita. Amin'izao fotoana izao, ny iray amin'ireo fizarana "File" lehibe ao amin'ny fampiharana Android dia nivadika tamin'ny fampiasana LMDB, ary ny ampahany hafa dia efa mandeha. Ny fiteny C, izay ametrahana ny fitahirizana sanda manan-danja, dia fanampiana tsara mba hahatonga ny fampiharana hamatotra azy amin'ny sehatra amin'ny fiteny C ++. Ho an'ny fifandraisana tsy misy fotony amin'ny tranomboky C ++ vokarina miaraka amin'ny kaody sehatra ao amin'ny Objective-C sy Kotlin, dia nampiasaina ny mpamorona kaody. Djinni avy amin'ny Dropbox, saingy tantara hafa izany.

Source: www.habr.com

Add a comment