Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

As t-fhoghar 2019, thachair tachartas ris an robh dùil o chionn fhada ann an sgioba Mail.ru Cloud iOS. Tha am prìomh stòr-dàta airson stòradh seasmhach de staid tagraidh air fàs gu math annasach don t-saoghal gluasadach Stòr-dàta le mapa cuimhne dealanach (LMDB). Fon gearradh tha sinn a’ tabhann lèirmheas mionaideach dhut ann an ceithir pàirtean. An toiseach, bruidhnidh sinn mu na h-adhbharan airson a leithid de roghainn nach eil cho duilich agus cho duilich. An uairsin gluaisidh sinn air adhart gus beachdachadh air na trì colbhan aig cridhe ailtireachd LMDB: faidhlichean le mapa cuimhne, B + -tree, dòigh-obrach leth-bhreac-air-sgrìobhadh airson gnìomhachd agus ioma-thionndadh a chuir an gnìomh. Mu dheireadh, airson milseag - am pàirt practaigeach. An seo seallaidh sinn air mar a dhealbhaicheas agus a chuireas sinn an gnìomh sgeama stòr-dàta le grunn chlàran, a’ gabhail a-steach clàr-amais a h-aon, a bharrachd air an API aig ìre ìosal le luach iuchrach.

Clàr-innse

  1. Spreagadh airson buileachadh
  2. Suidheachadh LMDB
  3. Trì colbhan de LMDB
    3.1. muc-mhara #1. Faidhlichean le mapa cuimhne
    3.2. muc-mhara #2. B+ - craobh
    3.3. muc-mhara #3. Dèan lethbhreac-air-sgrìobhadh
  4. A’ dealbhadh sgeama dàta a bharrachd air an API prìomh luach
    4.1. Geàrr-chunntasan bunaiteach
    4.2. Modaladh clàr
    4.3. Modail dàimh eadar bùird

1. Spreagadh airson buileachadh

Aon bhliadhna ann an 2015, ghabh sinn an trioblaid a bhith a’ tomhas dè cho tric sa bhios eadar-aghaidh an tagraidh againn a’ crìonadh. Rinn sinn seo airson adhbhar. Tha sinn air gearanan fhaighinn nas trice gum bi an aplacaid uaireannan a’ stad bho bhith a’ freagairt gnìomhan luchd-cleachdaidh: chan urrainnear putanan a bhrùthadh, cha bhith liostaichean a’ gluasad, msaa. Mu mechanics tomhais a dh'innis air AvitoTech, mar sin an seo chan eil mi a’ toirt seachad ach òrdugh nan àireamhan.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Thàinig toraidhean an tomhais gu bhith na fhras fuar dhuinn. Thionndaidh e a-mach gu bheil tòrr a bharrachd dhuilgheadasan air adhbhrachadh le reothadh na gin eile. Mas e mus do thuig thu an fhìrinn seo bha am prìomh chomharra teicnigeach càileachd gun thubaist, an uairsin às deidh an fhòcas ghluais air reothadh saor.

An dèidh togail deas-bhòrd le reothadh agus an dèidh caitheamh cainneachdail и càileachd mion-sgrùdadh air na h-adhbharan aca, dh'fhàs am prìomh nàmhaid soilleir - loidsig gnìomhachas trom air a chuir gu bàs ann am prìomh snàithlean an tagraidh. B’ e am freagairt nàdarra don tàmailt seo miann làidir a ghluasad gu sruthan obrach. Gus an duilgheadas seo fhuasgladh gu riaghailteach, chaidh sinn gu ailtireachd ioma-snàthainn stèidhichte air cleasaichean aotrom. Thug mi seachad e airson an atharrachadh airson saoghal iOS dà snàthainn air Twitter coitcheann agus artaigil air Habré. Mar phàirt den aithris làithreach, tha mi airson cuideam a chuir air na taobhan sin den cho-dhùnadh a thug buaidh air taghadh an stòr-dàta.

Tha am modail cleasaiche de bhuidheann siostam a’ gabhail ris gur e multithreading an dàrna bunait aige. Is toil le modailean a tha ann a dhol thairis air crìochan sruthan. Agus bidh iad a 'dèanamh seo chan ann uaireannan agus an seo agus an sin, ach cha mhòr daonnan agus anns a h-uile àite

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha an stòr-dàta mar aon de na pàirtean clach-oisinn anns an diagram a tha air a thaisbeanadh. Is e a phrìomh obair am macropattern a chuir an gnìomh Stòr-dàta Co-roinnte. Ma tha e air a chleachdadh anns an t-saoghal iomairt gus sioncronadh dàta a chuir air dòigh eadar seirbheisean, an uairsin a thaobh ailtireachd cleasaiche - dàta eadar snàithleanan. Mar sin, bha feum againn air stòr-dàta nach adhbhraicheadh ​​eadhon glè bheag de dhuilgheadasan nuair a bha sinn ag obair leis ann an àrainneachd ioma-snàithleach. Gu sònraichte, tha seo a 'ciallachadh gum feum na stuthan a gheibhear bhuaithe a bhith co-dhiù sàbhailte ann an snàithlean, agus gu tur neo-ghluasadach. Mar a tha fios agad, faodar an tè mu dheireadh a chleachdadh aig an aon àm bho ghrunn snàithleanan gun a bhith a ’dol gu glasadh sam bith, aig a bheil buaidh buannachdail air coileanadh.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOSB’ e an dàrna feart cudromach a thug buaidh air an roghainn stòr-dàta an API sgòthan againn. Chaidh a bhrosnachadh leis an dòigh sioncronaidh a chaidh a chleachdadh le git. Coltach ris, bha sinn ag amas air offline-first API, a tha a’ coimhead nas freagarraiche airson teachdaichean sgòthan. Bhathar a’ gabhail ris nach biodh iad a’ pumpadh a-mach làn staid na sgòth ach aon turas, agus an uairsin bhiodh sioncronadh anns a’ mhòr-chuid de chùisean a’ tachairt tro bhith a’ sgaoileadh atharrachaidhean. Gu mì-fhortanach, chan eil an cothrom seo fhathast ach anns an raon teòiridheach, agus chan eil luchd-dèiligidh air ionnsachadh mar a bhith ag obair le pìosan ann an cleachdadh. Tha grunn adhbharan amas ann airson seo, agus, gus nach cuir sinn dàil air an ro-ràdh, fàgaidh sinn camagan. A-nis, is e an rud a tha gu math nas inntinniche na co-dhùnaidhean fiosraichte bhon leasan mu na thachras nuair a bhios API ag ràdh “A” agus nach eil an neach-cleachdaidh aige ag ràdh “B”.

Mar sin, ma smaoinicheas tu air git, a tha, nuair a bhios tu a’ cur an gnìomh àithne tarraing, an àite a bhith a’ cur a-steach pìosan gu dealbh ionadail, a’ dèanamh coimeas eadar a làn staid agus an làn staid frithealaiche, bidh beachd gu math ceart agad air mar a tha sioncronadh a’ tachairt san sgòth. luchd-dèiligidh. Tha e furasta a thomhas airson a chuir an gnìomh, feumaidh tu dà chraobh DOM a riarachadh mar chuimhneachan le meata-fhiosrachadh mu na faidhlichean frithealaiche agus ionadail gu lèir. Tha e a ’tionndadh a-mach ma tha neach-cleachdaidh a’ stòradh 500 mìle faidhle san sgòth, an uairsin gus a shioncronachadh feumar dà chraobh ath-chruthachadh agus a sgrios le 1 millean nodan. Ach is e cruinneachadh a th’ anns gach nód anns a bheil graf de chuspairean. Anns an t-solas seo, bha dùil ri toraidhean pròifil. Thionndaidh e a-mach, eadhon gun a bhith a 'toirt aire don algairim co-aonaidh, gu bheil an dearbh dhòigh-obrach airson a bhith a' cruthachadh agus a 'sgrios àireamh mhòr de rudan beaga a' cosg sgillinn gu math. de sgriobtaichean cleachdaiche. Mar thoradh air an sin, bidh sinn a’ suidheachadh an dàrna slat-tomhais cudromach ann a bhith a’ taghadh stòr-dàta - an comas gnìomhachd CRUD a chuir an gnìomh gun riarachadh fiùghantach de nithean.

Tha riatanasan eile nas traidiseanta agus tha an liosta gu lèir mar a leanas.

  1. Sàbhailteachd snàithlean.
  2. Ioma-phròiseasadh. Air a dhearbhadh leis a 'mhiann an aon eisimpleir stòr-dàta a chleachdadh gus staid a shioncronachadh chan ann a-mhàin eadar snàithleanan, ach cuideachd eadar am prìomh iarrtas agus leudachaidhean iOS.
  3. Comas nithean air an stòradh a riochdachadh mar nithean nach gabh atharrachadh
  4. Gun riarachadh fiùghantach taobh a-staigh gnìomhachd CRUD.
  5. Taic gnìomh airson feartan bunaiteach ACID: atomachd, cunbhalachd, iomallachd agus earbsachd.
  6. Luas air na cùisean as mòr-chòrdte.

Leis an t-seata riatanasan seo, bha agus tha SQLite fhathast na dheagh roghainn. Ach, mar phàirt den sgrùdadh air roghainnean eile, thàinig mi tarsainn air leabhar "Tòiseachadh le LevelDB". Fo a ceannas, chaidh slat-tomhais a sgrìobhadh a’ dèanamh coimeas eadar astar na h-obrach le diofar stòran-dàta ann an suidheachaidhean fìor sgòthan. Chaidh an toradh thairis air na bha sinn an dùil. Anns na cùisean as mòr-chòrdte - a’ faighinn cursair air liosta eagraichte de na faidhlichean gu lèir agus liosta eagraichte de na faidhlichean gu lèir airson eòlaire sònraichte - thionndaidh LMDB a-mach gu bhith 10 tursan nas luaithe na SQLite. Dh'fhàs an roghainn follaiseach.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

2. Suidheachadh LMDB

Is e leabharlann glè bheag a th’ ann an LMDB (dìreach sreathan 10K) a bhios a’ buileachadh an ìre bhunaiteach as ìsle de stòran-dàta - stòradh.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha an diagram gu h-àrd a 'sealltainn nach eil coimeas eadar LMDB agus SQLite, a tha cuideachd a' cur an gnìomh ìrean nas àirde, nas ceart na SQLite le Core Data. Bhiodh e na bu chothromaiche na h-aon einnseanan stòraidh a ghairm mar cho-fharpaisich co-ionann - BerkeleyDB, LevelDB, Sophia, RocksDB, msaa. Tha eadhon leasachaidhean ann far a bheil LMDB ag obair mar phàirt einnsean stòraidh airson SQLite. Bha a’ chiad deuchainn mar seo ann an 2012 seachad le LMDB Howard Chu. Toraidhean thionndaidh e a-mach cho inntinneach gun deach an iomairt aige a thogail le luchd-dealasach OSS, agus lorg e gun leanadh e anns an neach LumoSQL. Anns an Fhaoilleach 2020, b’ e ùghdar a’ phròiseict seo Den Shearer air a thaisbeanadh e aig LinuxConfAu.

Tha LMDB air a chleachdadh sa mhòr-chuid mar einnsean airson stòran-dàta tagraidh. Tha an leabharlann mar thoradh air an luchd-leasachaidh OpenLDAP, a bha gu math mì-riaraichte le BerkeleyDB mar bhunait don phròiseact aca. A 'tòiseachadh bho leabharlann beag b chraoibh, Bha Howard Chu comasach air aon de na roghainnean eile as mòr-chòrdte den ùine againn a chruthachadh. Thug e seachad an aithisg fìor fhionnar aige don sgeulachd seo, a bharrachd air structar a-staigh LMDB. "An Stòr-dàta le mapa Cuimhne Lightning". Chaidh deagh eisimpleir de bhith a’ faighinn thairis air goireas stòraidh a cho-roinn le Leonid Yuryev (aka yleo) bho Positive Technologies san aithisg aige aig Highload 2015 “Tha an einnsean LMDB na churaidh sònraichte”. Ann, tha e a’ bruidhinn air LMDB ann an co-theacsa gnìomh coltach ri bhith a’ buileachadh ReOpenLDAP, agus tha LevelDB air a bhith fo ùmhlachd càineadh coimeasach mu thràth. Mar thoradh air a’ bhuileachadh, bha eadhon forc a bha a’ leasachadh gu gnìomhach aig Positive Technologies MDBX le feartan fìor bhlasta, optimizations agus ceartachaidhean bug.

Bidh LMDB gu tric air a chleachdadh mar stòradh mar a tha. Mar eisimpleir, brabhsair Mozilla Firefox thagh e airson grunn fheumalachdan, agus, a’ tòiseachadh bho dhreach 9, Xcode b' fheàrr a SQLite airson clàran-amais a stòradh.

Tha an einnsean cuideachd air a comharra a dhèanamh ann an saoghal leasachadh gluasadach. Faodaidh comharran air a chleachdadh a bhith lorg anns a’ chliant iOS airson Telegram. Chaidh LinkedIn eadhon nas fhaide agus thagh e LMDB mar an stòradh bunaiteach airson am frèam tasgadan dàta dachaigh Rocket Data, mu dheidhinn dh'innis anns an artaigil aige ann an 2016.

Tha LMDB gu soirbheachail a 'sabaid airson àite sa ghrèin anns an àite a dh' fhàg BerkeleyDB an dèidh dha tighinn fo smachd Oracle. Tha an leabharlann air a ghràdhachadh airson cho luath agus cho earbsach 'sa tha e, eadhon an taca ri a co-aoisean. Mar a tha fios agad, chan eil lòin an-asgaidh ann, agus bu mhath leam cuideam a chuir air a’ mhalairt-malairt a dh’ fheumas tu a bhith agad nuair a thaghas tu eadar LMDB agus SQLite. Tha an dealbh gu h-àrd a’ sealltainn gu soilleir mar a gheibhear àrdachadh air astar. An toiseach, cha bhith sinn a’ pàigheadh ​​airson sreathan de tharraing a bharrachd a bharrachd air stòradh diosc. Tha e soilleir nach urrainn dha deagh ailtireachd a dhèanamh às an aonais, agus tha e do-sheachanta gun nochd iad anns a’ chòd tagraidh, ach bidh iad tòrr nas seòlta. Cha bhi feartan annta nach eil riatanach le tagradh sònraichte, mar eisimpleir, taic airson ceistean sa chànan SQL. San dàrna h-àite, bidh e comasach mapadh gnìomhachd tagraidh a chuir an gnìomh air iarrtasan gu stòradh diosc. Ma tha SQLite anns an obair agam stèidhichte air feumalachdan staitistigeil cuibheasach tagradh cuibheasach, an uairsin bidh thu fhèin, mar leasaiche tagraidh, gu math mothachail air na prìomh shuidheachaidhean eallach obrach. Airson fuasgladh nas cinneasaiche, feumaidh tu taga prìs nas àirde a phàigheadh ​​an dà chuid airson leasachadh a’ chiad fhuasglaidh agus airson a thaic às deidh sin.

3. Trì colbhan LMDB

An dèidh sùil a thoirt air an LMDB bho shealladh eun, bha an t-àm ann a dhol nas doimhne. Bidh na trì earrannan a tha ri thighinn an cois mion-sgrùdadh air na prìomh cholbhan air a bheil an ailtireachd stòraidh na laighe:

  1. Faidhlichean le mapa cuimhne mar dhòigh air obrachadh le diosc agus sioncronadh structaran dàta a-staigh.
  2. B + - craobh mar bhuidheann de structar dàta a tha air a stòradh.
  3. Dèan lethbhreac-air-sgrìobhadh mar dhòigh-obrach gus togalaichean malairt ACID agus ioma-thionndadh a thoirt seachad.

3.1. muc-mhara #1. Faidhlichean le mapa cuimhne

Tha faidhlichean le mapa cuimhne nan eileamaid ailtireil cho cudromach is gu bheil iad eadhon a’ nochdadh ann an ainm an stòr. Tha cùisean a thaobh tasgadh agus sioncronadh ruigsinneachd air fiosrachadh a tha air a stòradh gu tur air fhàgail aig an t-siostam obrachaidh. Chan eil caches ann fhèin ann an LMDB. Is e co-dhùnadh mothachail a tha seo leis an ùghdar, leis gu bheil leughadh dàta gu dìreach bho fhaidhlichean mapa a ’toirt cothrom dhut tòrr oiseanan a ghearradh ann am buileachadh an einnsean. Gu h-ìosal tha liosta fada bho bhith iomlan de chuid dhiubh.

  1. Bidh e an urra ris an t-siostam obrachaidh cumail suas cunbhalachd dàta anns an stòradh nuair a bhios tu ag obair còmhla ris bho ghrunn phròiseasan. Anns an ath earrann, seo meacanaig air a dheasbad gu mionaideach agus le dealbhan.
  2. Tha dìth caches gu tur a’ cur às do LMDB bhon chosgais a bharrachd co-cheangailte ri riarachadh fiùghantach. Tha leughadh dàta ann an cleachdadh a’ ciallachadh a bhith a’ suidheachadh puing don t-seòladh cheart ann an cuimhne bhrìgheil agus gun dad a bharrachd. Tha e coltach ri ficsean saidheans, ach anns a’ chòd stòr stòraidh tha a h-uile gairm gu calloc stèidhichte anns a’ ghnìomh rèiteachaidh stòraidh.
  3. Tha dìth caches cuideachd a’ ciallachadh nach eil glasan ann co-cheangailte ri sioncronadh an ruigsinneachd. Chan eil luchd-leughaidh, agus faodaidh àireamh neo-riaghailteach de luchd-leughaidh a bhith ann aig an aon àm, a bhith a 'coinneachadh ri aon mutex air an t-slighe chun an dàta. Air sgàth seo, tha scalability sreathach air leth math aig an astar leughaidh stèidhichte air an àireamh de CPUan. Ann an LMDB, chan eil ach obrachaidhean atharrachaidh air an sioncronadh. Chan fhaod ach aon sgrìobhadair a bhith aig aon àm.
  4. Bidh co-dhiù loidsig caching agus sioncronaidh a’ cur às don t-seòrsa mhearachdan a tha gu math toinnte co-cheangailte ri bhith ag obair ann an àrainneachd ioma-snàithleach. Bha dà sgrùdadh stòr-dàta inntinneach aig co-labhairt Usenix OSDI 2014: "Chan eil a h-uile siostam faidhle air a chruthachadh co-ionann: air cho iom-fhillte 'sa tha e a bhith a' cruthachadh thagraidhean le tubaist" и "Stòr-dàta tortadh airson spòrs is prothaid". Bhon iad faodaidh tu fiosrachadh a chruinneachadh mu gach cuid earbsachd LMDB nach fhacas a-riamh agus buileachadh cha mhòr gun smal air togalaichean malairt ACID, a tha nas fheàrr na an fheadhainn aig SQLite.
  5. Tha minimalism LMDB a’ leigeil le riochdachadh inneal a chòd a bhith air a shuidheachadh gu tur ann an tasgadan L1 den phròiseasar leis na feartan astair a tha ri thighinn.

Gu mì-fhortanach, ann an iOS, le faidhlichean le mapa cuimhne, chan eil a h-uile dad cho sgòthach sa bu mhath leinn. Gus bruidhinn mu na h-uireasbhaidhean a tha co-cheangailte riutha ann an dòigh nas mothachail, feumar cuimhneachadh air na prionnsabalan coitcheann airson an dòigh seo a chur an gnìomh ann an siostaman obrachaidh.

Fiosrachadh coitcheann mu fhaidhlichean le mapa cuimhne

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOSLeis a h-uile tagradh a bhios a’ ruith, bidh an siostam obrachaidh a’ ceangal eintiteas ris an canar pròiseas. Tha raon de sheòlaidhean faisg air làimh air a thoirt do gach pròiseas anns am bi e a’ cur a h-uile càil a dh’ fheumas e airson obrachadh. Aig na seòlaidhean as ìsle tha earrannan le còd agus dàta agus goireasan le còd cruaidh. An uairsin thig bloc a tha a’ sìor fhàs de dh’ àite seòlaidh fiùghantach, a tha aithnichte dhuinn fon chrann ainm. Tha seòlaidhean nam buidhnean ann a nochdas rè obrachadh a’ phrògraim. Aig a’ mhullach tha an raon cuimhne a bhios stac an tagraidh a’ cleachdadh. Bidh e an dara cuid a 'fàs no a' dèanamh cùmhnant; ann am faclan eile, tha nàdar fiùghantach aig a mheud. Gus casg a chuir air a’ chruach agus an tiùrr bho bhith a’ putadh agus a’ cur a-steach air a chèile, tha iad suidhichte aig diofar chinn den àite seòlaidh. Tha toll eadar an dà roinn fiùghantach aig a’ mhullach agus aig a’ bhonn. Bidh an siostam obrachaidh a’ cleachdadh seòlaidhean anns an earrainn mheadhanach seo gus grunn bhuidhnean a cheangal ris a’ phròiseas. Gu sònraichte, faodaidh e seata leantainneach de sheòlaidhean a cheangal ri faidhle air an diosc. Canar clàr-cuimhne ri faidhle mar seo

Tha an t-àite seòlaidh a chaidh a shònrachadh don phròiseas fìor mhòr. Gu teòiridheach, tha an àireamh de sheòlaidhean cuingealaichte a-mhàin le meud a 'phuing, a tha air a dhearbhadh le comas bit an t-siostaim. Nam biodh cuimhne corporra air a mhapadh dha 1-gu-1, bhiodh a’ chiad phròiseas a’ togail suas an RAM gu lèir, agus cha bhiodh bruidhinn air ioma-obair sam bith.

Ach, bhon eòlas againn tha fios againn gum faod siostaman obrachaidh an latha an-diugh nas urrainn dhaibh de phròiseasan a chuir an gnìomh aig an aon àm. Tha seo comasach air sgàth gu bheil iad a-mhàin a 'riarachadh mòran cuimhne gu pròiseasan air pàipear, ach ann an da-rìribh bidh iad a' luchdachadh a-steach don phrìomh chuimhne corporra a-mhàin am pàirt a tha air a bheil iarrtas an seo agus an-dràsta. Mar sin, canar brìgheil ris a’ chuimhne a tha co-cheangailte ri pròiseas.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Bidh an siostam obrachaidh ag eagrachadh cuimhne brìgheil is corporra gu duilleagan de mheud sònraichte. Cho luath ‘s a tha iarrtas air duilleag sònraichte de chuimhne brìgheil, bidh an siostam obrachaidh ga luchdachadh a-steach do chuimhne corporra agus gan maidseadh ann an clàr sònraichte. Mura h-eil sliotan an-asgaidh ann, thèid aon de na duilleagan a chaidh a luchdachadh roimhe a chopaigeadh chun diosc, agus bidh an tè air a bheil iarrtas a’ gabhail àite. Canar suaipeadh ris a’ mhodh-obrach seo, air an till sinn a dh’ aithghearr. Tha an dealbh gu h-ìosal a’ sealltainn a’ phròiseas a tha air a mhìneachadh. Air, chaidh duilleag A le seòladh 0 a luchdachadh agus a chuir air a’ phrìomh dhuilleag cuimhne le seòladh 4. Bha an fhìrinn seo ri fhaicinn sa chlàr conaltraidh ann an àireamh cealla 0.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha an sgeulachd dìreach mar an ceudna le faidhlichean air am mapadh gu cuimhne. Gu loidsigeach, tha còir aca gu leantainneach agus gu tur suidhichte anns an àite seòlaidh brìgheil. Ach, bidh iad a’ dol a-steach duilleag cuimhne corporra a rèir duilleag agus dìreach ma thèid an iarraidh. Tha atharrachadh nan duilleagan sin air a shioncronachadh leis an fhaidhle air diosc. San dòigh seo, faodaidh tu faidhle I/O a dhèanamh le bhith dìreach ag obair le bytes mar chuimhneachan - thèid a h-uile atharrachadh a ghluasad gu fèin-ghluasadach le kernel an t-siostaim obrachaidh chun fhaidhle stòr.
Default
Tha an dealbh gu h-ìosal a’ sealltainn mar a bhios LMDB a’ sioncronadh a staid nuair a bhios e ag obair leis an stòr-dàta bho dhiofar phròiseasan. Le bhith a’ mapadh cuimhne bhrìgheil diofar phròiseasan chun an aon fhaidhle, tha sinn de facto mar fhiachaibh air an t-siostam obrachaidh blocaichean sònraichte de na h-àiteachan seòlaidh aca a shioncronachadh le chèile, far a bheil LMDB a’ coimhead.
Default

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Is e nuance cudromach gu bheil LMDB, gu bunaiteach, ag atharrachadh am faidhle dàta tro inneal gairm an t-siostam sgrìobhaidh, agus a’ taisbeanadh am faidhle fhèin ann am modh leughaidh a-mhàin. Tha dà bhuaidh chudromach aig an dòigh-obrach seo.

Tha a 'chiad thoradh cumanta airson a h-uile siostam-obrachaidh. Is e a bhunait dìon a chuir ris an aghaidh milleadh gun dùil air an stòr-dàta le còd ceàrr. Mar a tha fios agad, tha stiùireadh so-ghnìomhaichte pròiseas saor gus faighinn gu dàta bho àite sam bith san àite seòlaidh aige. Aig an aon àm, mar a chuimhnich sinn, tha a bhith a’ taisbeanadh faidhle ann am modh leughadh-sgrìobhaidh a’ ciallachadh gum faod stiùireadh sam bith atharrachadh cuideachd. Ma nì i seo le mearachd, a’ feuchainn, mar eisimpleir, ri ath-sgrìobhadh a dhèanamh air eileamaid rèite aig clàr-amais nach eil idir ann, faodaidh i gun fhiosta am faidhle a tha air a mhapadh chun t-seòladh seo atharrachadh, a bheir gu coirbeachd san stòr-dàta. Ma tha am faidhle air a thaisbeanadh ann am modh leughaidh a-mhàin, ma thèid oidhirp air an àite seòlaidh co-fhreagarrach atharrachadh, thig crìoch èiginneach air a’ phrògram le comharra SIGSEGV, agus fuirichidh am faidhle slàn.

Tha an dàrna buil mar-thà sònraichte do iOS. Chan eil an t-ùghdar no tobraichean sam bith eile a’ toirt iomradh soilleir air, ach às aonais cha bhiodh LMDB freagarrach airson a ruith air an t-siostam obrachaidh gluasadach seo. Tha an ath earrann air a chuimseachadh air a bheachdachadh.

Feartan sònraichte de fhaidhlichean le mapa cuimhne ann an iOS

Bha aithisg sgoinneil aig WWDC ann an 2018 "Ios Memory Deep Dive". Tha e ag innse dhuinn, ann an iOS, gu bheil a h-uile duilleag a tha suidhichte ann an cuimhne corporra mar aon de 3 seòrsaichean: salach, teann agus glan.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha cuimhne ghlan na chruinneachadh de dhuilleagan a dh’ fhaodar a luchdachadh gun phian bho chuimhne corporra. Faodar an dàta anns a bheil iad ath-luchdachadh mar a dh’ fheumar bho na stòran tùsail aige. Tha faidhlichean le mapa cuimhne le leughadh a-mhàin san roinn seo. chan eil eagal air iOS na duilleagan a tha air am mapadh gu faidhle a luchdachadh bhon chuimhne aig àm sam bith, oir tha iad cinnteach gum bi iad air an sioncronachadh leis an fhaidhle air diosc.
Default
Bidh a h-uile duilleag atharraichte a’ tighinn gu crìch ann an cuimhne shalach, ge bith càite an robh iad an toiseach. Gu sònraichte, bidh faidhlichean le mapa cuimhne air an atharrachadh le bhith a’ sgrìobhadh chun chuimhne bhrìgheil co-cheangailte riutha air an seòrsachadh san dòigh seo. A’ fosgladh LMDB le bratach MDB_WRITEMAP, às deidh dhut atharrachaidhean a dhèanamh air, faodaidh tu seo a dhearbhadh gu pearsanta

Cho luath ‘s a thòisicheas tagradh a’ gabhail cus cuimhne corporra, bidh iOS a ’toirt ùmhlachd dha teannachadh duilleag salach. Tha an cuimhne iomlan a tha air a chleachdadh le duilleagan salach agus teann a’ dèanamh suas lorg-coise cuimhne ris an canar an tagradh. Cho luath ‘s a ruigeas e luach stairsneach sònraichte, thig deamhan siostam marbhadh OOM às deidh a’ phròiseas agus thig e gu crìch gu làidir. Is e seo cho sònraichte ‘s a tha iOS an taca ri siostaman obrachaidh deasg. An coimeas ri sin, chan eil lughdachadh lorg-coise cuimhne le bhith ag atharrachadh dhuilleagan bho chuimhne corporra gu diosc air a thoirt seachad ann an iOS. Chan urrainnear na h-adhbharan a thomhas ach aig. Is dòcha gu bheil an dòigh-obrach airson duilleagan a ghluasad gu dian gu diosc agus air ais a’ caitheamh cus lùth airson innealan gluasadach, no bidh iOS a’ sàbhaladh goireas ath-sgrìobhadh cheallan air draibhearan SSD, no is dòcha nach robh na dealbhadairean riaraichte le coileanadh iomlan an t-siostaim, far a bheil a h-uile càil daonnan air an iomlaid. Biodh sin mar a dh’ fhaodadh e, tha an fhìrinn fhathast na fhìrinn.

Is e an deagh naidheachd, a chaidh ainmeachadh roimhe, nach bi LMDB gu bunaiteach a’ cleachdadh an inneal mmap gus faidhlichean ùrachadh. Tha seo a 'ciallachadh gu bheil an dàta a tha air a thaisbeanadh air a chomharrachadh le iOS mar chuimhne glan agus nach eil e a' cur ri lorg cuimhne. Faodaidh tu seo a dhearbhadh le bhith a’ cleachdadh inneal Xcode ris an canar VM Tracker. Tha an dealbh-sgrìn gu h-ìosal a’ sealltainn staid cuimhne brìgheil iOS an aplacaid Cloud rè obrachadh. Aig an toiseach, chaidh 2 eisimpleir LMDB a thòiseachadh ann. Chaidh cead a thoirt don chiad fhear am faidhle aige a thaisbeanadh air 1GiB de chuimhne mas-fhìor, an dàrna fear - 512MiB. A dh 'aindeoin gu bheil an dà stòradh ann an ìre sònraichte de chuimhne luchd-còmhnaidh, chan eil gin dhiubh a' cur ri meud salach.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Agus a-nis tha an t-àm ann airson droch naidheachd. Taing don uidheamachd suaip ann an siostaman obrachaidh deasg 64-bit, faodaidh gach pròiseas na h-uimhir de dh’ àite seòlaidh brìgheil a ghabhail a-steach agus a tha an àite diosc cruaidh an-asgaidh airson an iomlaid a dh’ fhaodadh a bhith ann. Le bhith a’ cuir an àite suaip le teannachadh ann an iOS gu mòr a’ lughdachadh na h-ìre as àirde teòiridheach. A-nis feumaidh a h-uile pròiseas beò a dhol a-steach don phrìomh chuimhne (leugh RAM), agus feumaidh a h-uile duine nach eil iomchaidh a thighinn gu crìch. Tha seo air ainmeachadh mar anns an iomradh gu h-àrd aithisg, agus a-staigh sgrìobhainnean oifigeil. Mar thoradh air an sin, tha iOS gu mòr a’ cuingealachadh na tha de chuimhne ri fhaighinn airson a riarachadh tro mmap. Seo an seo Faodaidh tu coimhead air crìochan empirigeach na h-ìre de chuimhne a dh’ fhaodadh a bhith air a riarachadh air diofar innealan a ’cleachdadh a’ ghairm siostam seo. Air na modalan fònaichean sgairteil as ùire, tha iOS air fàs fialaidh le 2 gigabytes, agus air na dreachan as àirde den iPad - le 4. Ann an cleachdadh, gu dearbh, feumaidh tu fòcas a chuir air na modalan inneal le taic as ìsle, far a bheil a h-uile dad gu math brònach. Nas miosa buileach, le bhith a’ coimhead air staid cuimhne an tagraidh ann an VM Tracker, gheibh thu a-mach gu bheil LMDB fada bhon aon fhear a tha ag ràdh gu bheil e air a mhapadh le cuimhne. Bithear ag ithe pìosan math air falbh le luchd-riarachaidh siostaim, faidhlichean stòrais, frèaman ìomhaighean, agus creachadairean eile nas lugha.

Stèidhichte air toraidhean deuchainnean anns an Cloud, thàinig sinn gu na luachan co-rèiteachaidh a leanas airson a 'chuimhne a chaidh a riarachadh le LMDB: megabytes 384 airson innealan 32-bit agus 768 airson innealan 64-bit. Às deidh an tomhas-lìonaidh seo a chleachdadh, tòisichidh gnìomhachd atharrachaidh sam bith a’ tighinn gu crìch leis a ’chòd MDB_MAP_FULL. Bidh sinn a’ faicinn a leithid de mhearachdan nar sgrùdadh, ach tha iad beag gu leòr airson gun tèid an dearmad aig an ìre seo.

Faodaidh adhbhar neo-fhollaiseach airson cus caitheamh cuimhne leis an stòradh a bhith na ghnothaichean fad-ùine. Gus tuigse fhaighinn air mar a tha an dà iongantas seo ceangailte, bidh sinn air ar cuideachadh le bhith a’ beachdachadh air an dà cholbh a tha air fhàgail den LMDB.

3.2. muc-mhara #2. B+ - craobh

Gus aithris a dhèanamh air bùird a bharrachd air stòradh prìomh luach, feumaidh na h-obraichean a leanas a bhith an làthair anns an API aige:

  1. A’ cuir a-steach eileamaid ùr.
  2. Lorg eileamaid le iuchair shònraichte.
  3. A 'toirt air falbh eileamaid.
  4. Dèan aithris thairis air amannan iuchraichean san òrdugh anns a bheil iad air an òrdachadh.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOSIs e craobh sgrùdaidh dà-chànanach an structar dàta as sìmplidh as urrainn na ceithir gnìomhachdan a chuir an gnìomh gu furasta. Tha gach aon de na nodan aige a’ riochdachadh iuchair a tha a’ roinn an fho-sheata iomlan de iuchraichean cloinne gu dà fho-chraobh. Air an taobh chlì tha an fheadhainn a tha nas lugha na am pàrant, agus air an làimh dheis tha an fheadhainn a tha nas motha. Tha a bhith a’ faighinn seata iuchraichean òrdaichte air a choileanadh tro aon de na slighean craoibhe clasaigeach

Tha dà locht bunaiteach aig craobhan binary a tha gan casg bho bhith èifeachdach mar structar dàta stèidhichte air diosc. An toiseach, tha an ìre de chothromachadh aca do-chreidsinneach. Tha cunnart mòr ann a bhith a 'faighinn chraobhan anns am faod àirde nan geugan eadar-dhealaichte a bhith gu math eadar-dhealaichte, a tha gu mòr a' dèanamh nas miosa air iom-fhillteachd algorithmach an rannsachaidh an coimeas ris na thathar a 'sùileachadh. San dàrna h-àite, tha pailteas de cheanglaichean eadar nodan a’ toirt air falbh craobhan dà-chànanach na sgìre mar chuimhneachan.Faodar nodan dlùth (a thaobh ceanglaichean eatorra) a shuidheachadh air duilleagan gu tur eadar-dhealaichte ann an cuimhne bhrìgheil. Mar thoradh air an sin, is dòcha gum feum eadhon tionndadh sìmplidh de ghrunn nodan faisg air làimh ann an craobh tadhal air àireamh coimeasach de dhuilleagan. Tha seo na dhuilgheadas eadhon nuair a bhios sinn a 'bruidhinn mu èifeachdas craobhan dà-chànanach mar structar dàta cuimhne, oir chan eil e na thlachd saor a bhith a' cuairteachadh dhuilleagan ann an tasglann a 'phròiseasair gu cunbhalach. Nuair a thig e gu bhith a’ toirt air ais duilleagan co-cheangailte ri nodan bhon diosc gu tric, bidh an suidheachadh a’ fàs gu tur dòrainneach.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOSBidh craobhan B, mar mean-fhàs de chraobhan dà-chànanach, a’ fuasgladh nan duilgheadasan a chaidh ainmeachadh sa pharagraf roimhe. An toiseach, tha iad fèin-chothromachadh. San dàrna h-àite, bidh gach aon de na nodan aca a’ sgaradh an t-seata de iuchraichean cloinne chan ann a-steach do 2, ach ann an fo-sheataichean òrdaichte M, agus faodaidh an àireamh M a bhith gu math mòr, air òrdugh grunn cheudan, no eadhon mìltean.

Mar sin:

  1. Anns gach nód tha àireamh mhòr de iuchraichean a chaidh òrdachadh mar-thà agus tha na craobhan gu math goirid.
  2. Bidh a’ chraobh a’ faighinn seilbh na sgìre mar chuimhneachan, leis gu bheil iuchraichean a tha faisg air luach suidhichte gu nàdarra ri taobh a chèile air na h-aon nodan no na nodan faisg air làimh.
  3. Tha an àireamh de nodan gluasaid nuair a thig craobh sìos rè obair sgrùdaidh air a lughdachadh.
  4. Tha an àireamh de nodan targaid a chaidh a leughadh tro cheistean raon air a lughdachadh, leis gu bheil àireamh mhòr de iuchraichean òrdaichte anns gach fear dhiubh mu thràth.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Bidh LMDB a’ cleachdadh atharrachadh air a’ chraobh-B ris an canar craobh B+ airson dàta a stòradh. Tha an dealbh gu h-àrd a’ sealltainn nan trì seòrsaichean nodan a tha ann:

  1. Aig a 'mhullach tha am freumh. Chan eil e a’ tighinn gu buil nas motha na bun-bheachd stòr-dàta taobh a-staigh taigh-bathair. Taobh a-staigh aon eisimpleir LMDB, faodaidh tu grunn stòran-dàta a chruthachadh a bhios a’ roinn àite seòladh brìgheil mapaichte. Bidh gach fear dhiubh a 'tòiseachadh bhon fhreumh aige fhèin.
  2. Aig an ìre as ìsle tha na duilleagan. Annta fhèin agus annta a-mhàin tha na paidhrichean prìomh luach a tha air an stòradh san stòr-dàta. Co-dhiù, is e seo cho sònraichte ‘s a tha craobhan B + -. Ma tha craobh-B cunbhalach a’ stòradh phàirtean ann an nodan de gach ìre, chan eil an atharrachadh B+ ach aig an ìre as ìsle. Às deidh dhuinn an fhìrinn seo a shuidheachadh, canaidh sinn tuilleadh ris an fho-sheòrsa den chraoibh a thathas a’ cleachdadh ann an LMDB dìreach mar chraobh B.
  3. Eadar na freumhan agus na duilleagan tha 0 no barrachd ìrean teignigeach le nodan seòlaidh (meur). Is e an obair aca an seata iuchraichean a roinn eadar na duilleagan.

Gu corporra, tha nodan nam blocaichean cuimhne de fhad ro-shuidhichte. Tha am meud aca mar iomadachd de mheud duilleagan cuimhne san t-siostam obrachaidh, air an do bhruidhinn sinn gu h-àrd. Tha structar na bodhaig air a shealltainn gu h-ìosal. Tha meta-fhiosrachadh anns a’ cheann-cinn, agus am fear as follaisiche dhiubh mar eisimpleir an checksum. An ath rud thig fiosrachadh mu na h-àireamhan anns a bheil na ceallan le dàta suidhichte. Faodaidh an dàta a bhith an dàrna cuid iuchraichean, ma tha sinn a’ bruidhinn air nodan seòlaidh, no paidhrichean luach-iuchrach gu lèir a thaobh dhuilleagan. Faodaidh tu barrachd a leughadh mu structar dhuilleagan san obair "Measadh air Stòran Prìomh Luach Àrd-choileanadh".

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

An dèidh dèiligeadh ri susbaint a-staigh nodan duilleag, bidh sinn a’ riochdachadh a’ chraobh-B LMDB ann an dòigh nas sìmplidhe san fhoirm a leanas.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha duilleagan le nodan air an suidheachadh ann an òrdugh air diosc. Tha duilleagan le àireamhan nas àirde suidhichte faisg air deireadh an fhaidhle. Air an duilleag meta ris an canar tha fiosrachadh mu na h-àiteachan far am faighear freumhan nan craobhan uile. Nuair a dh’ fhosglas tu faidhle, bidh LMDB a’ sganadh duilleag an fhaidhle le duilleag bho cheann gu toiseach a’ lorg duilleag meta dligheach agus troimhe lorgar na stòran-dàta a tha ann mu thràth.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

A-nis, le beachd air structar loidsigeach agus fiosaigeach eagrachadh dàta, is urrainn dhuinn gluasad air adhart gus beachdachadh air an treas colbh de LMDB. Is ann le a chuideachadh a bhios a h-uile atharrachadh stòraidh a’ tachairt gu gnìomhail agus leotha fhèin bho chèile, a’ toirt seilbh ioma-thionndaidh don stòr-dàta gu h-iomlan.

3.3. muc-mhara #3. Dèan lethbhreac-air-sgrìobhadh

Tha cuid de dh’ obraichean craobh-B a’ toirt a-steach sreath de dh’ atharrachaidhean air na nodan aige. Tha aon eisimpleir a’ cur iuchair ùr ri nód a tha air a chomas as àirde a ruighinn mu thràth. Anns a 'chùis seo, tha e riatanach, an toiseach, an nód a roinn ann an dà, agus san dàrna h-àite, ceangal a chur ris an nód leanabh ùr anns a' phàrant aige. Faodaidh am modh-obrach seo a bhith gu math cunnartach. Mura tachair airson adhbhar air choireigin (tubaist, briseadh cumhachd, msaa) ach pàirt de na h-atharrachaidhean bhon t-sreath, bidh an craobh fhathast ann an staid neo-chunbhalach.

Is e aon fhuasgladh traidiseanta airson stòr-dàta a bhith a’ fulang le lochdan structar dàta a bharrachd air diosc a chur ri taobh a’ chraoibh-B - log malairt, ris an canar cuideachd log sgrìobhaidh air adhart (WAL). Is e faidhle a th’ ann aig an deireadh far a bheil an obair a thathar an dùil air a sgrìobhadh gu teann mus atharraichear a’ chraobh-B fhèin. Mar sin, ma lorgar coirbeachd dàta rè fèin-bhreithneachadh, bidh an stòr-dàta a’ co-chomhairleachadh leis a’ log gus a chuir ann an òrdugh.

Tha LMDB air dòigh eadar-dhealaichte a thaghadh mar inneal fulangas locht, ris an canar copy-on-write. Is e an t-adhbhar a th 'ann, an àite a bhith ag ùrachadh dàta air duilleag a tha ann mar-thà, gu bheil e an-toiseach ga lethbhreacadh gu tur agus a' dèanamh a h-uile atharrachadh air an leth-bhreac.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

An ath rud, gus am bi an dàta ùraichte ri fhaighinn, feumar an ceangal atharrachadh ris an nód a tha air a thighinn gu bhith na phàrant gnàthach. Leis gu feum e cuideachd atharrachadh airson seo, tha e cuideachd air a chopaigeadh ro-làimh. Tha am pròiseas a 'leantainn air adhart gu cunbhalach fad na slighe chun a' bhunait. Is e an rud mu dheireadh a dh’ atharraicheas an dàta air an duilleag meta

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Ma thuiteas am pròiseas gu h-obann tron ​​​​mhodh ùrachaidh, an uairsin cha tèid duilleag meta ùr a chruthachadh, no cha tèid a sgrìobhadh gu diosc gu tur, agus bidh an sgrùdadh aige ceàrr. Anns an dà chùis seo, cha bhith e furasta faighinn a-mach air duilleagan ùra, ach cha bhi buaidh air seann fheadhainn. Tha seo a’ cur às don fheum air LMDB clàr ro-làimh a sgrìobhadh gus cunbhalachd dàta a chumail suas. Gu dearbh, tha structar stòradh dàta air an diosc a chaidh a mhìneachadh gu h-àrd aig an aon àm a’ gabhail ris a dhleastanas. Is e dìth log malairt soilleir aon de na feartan aig LMDB a bheir seachad astar leughaidh dàta àrd

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha an dealbhadh a thig às, ris an canar B-tree a-mhàin, gu nàdarrach a’ toirt iomallachd malairt agus ioma-dreach. Ann an LMDB, tha gach gnothach fosgailte co-cheangailte ri freumh craoibhe a tha iomchaidh an-dràsta. Gus an tèid an gnothach a chrìochnachadh, cha tèid duilleagan na craoibhe co-cheangailte ris atharrachadh no ath-chleachdadh gu bràth airson dreachan ùra den dàta. Mar sin, faodaidh tu obrachadh cho fada ‘s as toil leat leis an dearbh sheata dàta a bha buntainneach aig an àm chaidh an gnothach fhosgladh, eadhon ged a tha an stòradh fhathast ag ùrachadh gu gnìomhach aig an àm seo. Is e seo brìgh ioma-thionndaidh, a’ dèanamh LMDB na fhìor thùs dàta airson ar leannan UICollectionView. Às deidh malairt fhosgladh, chan eil feum air lorg cuimhne an tagraidh àrdachadh le bhith a’ pumpadh a-mach dàta gnàthach gu sgiobalta a-steach do structar cuimhneachaidh air choreigin, air eagal ’s nach bi dad air fhàgail. Tha am feart seo a 'dèanamh eadar-dhealachadh air LMDB bhon aon SQLite, nach urrainn a bhith a' bòstadh a leithid de iomallachd iomlan. Às deidh dà ghnothach fhosgladh anns an fhear mu dheireadh agus clàr sònraichte a dhubhadh às taobh a-staigh aon dhiubh, cha bhith e comasach tuilleadh an aon chlàr fhaighinn taobh a-staigh an dàrna fear a tha air fhàgail.

Is e taobh flip den bhuinn an caitheamh a dh’ fhaodadh a bhith gu math nas àirde de chuimhne brìgheil. Tha an sleamhnag a’ sealltainn cò ris a bhios structar an stòr-dàta coltach ma thèid atharrachadh aig an aon àm le 3 gnothaichean leughaidh fosgailte a’ coimhead air dreachan eadar-dhealaichte den stòr-dàta. Leis nach urrainn dha LMDB nodan ath-chleachdadh bho fhreumhan co-cheangailte ri gnothaichean gnàthach, chan eil roghainn aig a’ bhùth ach an ceathramh freumh eile a riarachadh mar chuimhneachan agus a-rithist clonadh na duilleagan atharraichte fodha.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

An seo bhiodh e feumail an earrann air faidhlichean le mapa cuimhne a thoirt air ais. Tha e coltach nach bu chòir caitheamh a bharrachd de chuimhne bhrìgheil mòran dragh a chuir oirnn, leis nach eil e a’ cur ri lorg cuimhne an tagraidh. Ach, aig an aon àm, chaidh a thoirt fa-near gu bheil iOS gu math làidir ann a bhith ga riarachadh, agus chan urrainn dhuinn, mar air frithealaiche no deasg, roinn LMDB de 1 terabyte a thoirt seachad agus gun a bhith a’ smaoineachadh mun fheart seo idir. Ma ghabhas e dèanamh, bu chòir dhut feuchainn ri beatha nan gnothaichean a dhèanamh cho goirid 'sa ghabhas.

4. Dealbhadh sgeama dàta a bharrachd air an API prìomh luach

Feuch an tòisich sinn ar mion-sgrùdadh API le bhith a’ coimhead air na geàrr-chunntasan bunaiteach a thug LMDB seachad: àrainneachd agus stòran-dàta, iuchraichean is luachan, gnothaichean agus cursors.

Nota mu chlàran còd

Bidh a h-uile gnìomh anns an API LMDB poblach a’ tilleadh toradh na h-obrach aca ann an cruth còd mearachd, ach anns a h-uile liosta às deidh sin tha an dearbhadh aige air fhàgail a-mach air sgàth giorrad. ​ Ann an cleachdadh, chleachd sinn eadhon ar cuid fhèin gus eadar-obrachadh leis an stòr forc C ++ pasgain lmdbxx, anns a bheil mearachdan air an toirt gu buil mar eisgeachdan C ++.

Mar an dòigh as luaithe air LMDB a cheangal ri pròiseact airson iOS no macOS, tha mi a’ moladh mo CocoaPod POSLMDB.

4.1. Abstractions Bunaiteach

Àrainneachd

structar MDB_env a tha na stòras de staid a-staigh an LMDB. Teaghlach gnìomh ro-shuidhichte mdb_env a 'leigeil leat cuid de na feartan aige a rèiteachadh. Anns a 'chùis as sìmplidh, tha toiseach tòiseachaidh einnsean a' coimhead mar seo.

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

Anns an tagradh Mail.ru Cloud, dh’ atharraich sinn na luachan bunaiteach de dìreach dà pharamadair.

Is e a’ chiad fhear meud an àite seòlaidh brìgheil ris a bheil am faidhle stòraidh air a mhapadh. Gu mì-fhortanach, eadhon air an aon inneal, faodaidh an luach sònraichte atharrachadh gu mòr bho ruith gu ruith. Gus am feart seo de iOS a ghabhail a-steach, tha an ìre stòraidh as àirde air a thaghadh gu dinamach. A 'tòiseachadh bho luach sònraichte, tha e air a ghearradh ann an leth gus an tèid an gnìomh mdb_env_open cha till toradh eadar-dhealaichte bho ENOMEM. Ann an teòiridh, tha cuideachd an taobh eile - an toiseach a 'riarachadh a' char as lugha de chuimhne air an einnsean, agus an uair sin, nuair a gheibhear mearachdan, MDB_MAP_FULL, àrdaich e. Ach, tha e tòrr nas dorra. Is e an t-adhbhar gu bheil an dòigh-obrach airson ath-riarachadh cuimhne (remap) a 'cleachdadh a' ghnìomh mdb_env_set_map_size a’ neo-dhligheachadh a h-uile eintiteas (cursors, malairt, iuchraichean agus luachan) a fhuaireadh roimhe bhon einnsean. Le bhith a’ toirt aire don tionndadh seo de thachartasan anns a’ chòd thig e gu bhith na dhuilgheadas mòr. Ma tha, ge-tà, cuimhne mas-fhìor glè chudromach dhut, is dòcha gur e adhbhar a tha seo airson sùil nas mionaidiche a thoirt air a’ phloc a chaidh fada air adhart MDBX, far am measg nam feartan a chaidh ainmeachadh tha “atharrachadh meud stòr-dàta fèin-ghluasadach air-the-fly”.

Tha an dàrna paramadair, nach robh a luach bunaiteach a 'freagairt oirnn, a' riaghladh na h-innealan gus dèanamh cinnteach à sàbhailteachd snàithlean. Gu mì-fhortanach, tha duilgheadasan aig co-dhiù iOS 10 le taic airson stòradh ionadail snàithlean. Air an adhbhar seo, anns an eisimpleir gu h-àrd, tha an ionad-tasgaidh air fhosgladh leis a 'bhratach MDB_NOTLS. A bharrachd air an seo, bha e riatanach cuideachd forc C ++ clò-bhualadair lmdbxxgus caochladairean a ghearradh a-mach leis a’ ghnè seo agus ann.

Stòr-dàta

Tha an stòr-dàta na eisimpleir de chraobh B air leth, air an do bhruidhinn sinn gu h-àrd. Tha fosgladh a 'tachairt taobh a-staigh malairt, a dh' fhaodadh a bhith a 'coimhead beagan neònach an toiseach.

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

Gu dearbh, is e aonad stòraidh a th’ ann an gnothach ann an LMDB, chan e eintiteas stòr-dàta sònraichte. Leigidh am bun-bheachd seo leat gnìomhachd atamach a dhèanamh air buidhnean a tha suidhichte ann an diofar stòran-dàta. Ann an teòiridh, tha seo a 'fosgladh a' chomasachd a bhith a 'dealbhadh chlàran ann an cruth diofar stòran-dàta, ach aig aon àm ghabh mi slighe eadar-dhealaichte, air a mhìneachadh gu mionaideach gu h-ìosal.

Iuchraichean agus luachan

structar MDB_val modail a’ bhun-bheachd an dà chuid prìomh agus luach. Chan eil beachd sam bith aig an stòr air na semantics aca. Dhaibh, is e rudeigin eile dìreach sreath de bytes de mheud sònraichte. B' e 512 bytes an tomhas as àirde.

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

A’ cleachdadh coimeas, bidh an stòr a’ rèiteach na h-iuchraichean ann an òrdugh dìreadh. Mura cuir thu do chuid fhèin na àite, thèid am fear bunaiteach a chleachdadh, a bhios gan rèiteachadh byte-by-byte ann an òrdugh faclaireachd.

Gnìomhan

Tha an structar malairt air a mhìneachadh gu mionaideach ann an caibideil roimhe, mar sin an seo nì mi ath-aithris goirid air na prìomh fheartan aca:

  1. A’ toirt taic do gach togalach bunaiteach ACID: atomachd, cunbhalachd, iomallachd agus earbsachd. Chan urrainn dhomh cuideachadh ach thoir an aire gu bheil bug ann a thaobh seasmhachd air macOS agus iOS a chaidh a shuidheachadh ann am MDBX. Faodaidh tu barrachd a leughadh anns na cinn aca LEASACHADH.
  2. Tha an dòigh-obrach airson ioma-snàthainn air a mhìneachadh leis an sgeama “sgrìobhadair singilte / ioma-luchd-leughaidh”. Bidh sgrìobhadairean a' bacadh a chèile, ach na cuir bacadh air luchd-leughaidh. Cha chuir luchd-leughaidh bacadh air sgrìobhadairean no càch a chèile.
  3. Taic airson gnothaichean neadachaidh.
  4. Taic ioma-thionndaidh.

Tha ioma-thionndadh ann an LMDB cho math is gu bheil mi airson a shealltainn ann an gnìomh. Bhon chòd gu h-ìosal chì thu gu bheil gach gnothach ag obair le dìreach an dreach den stòr-dàta a bha an-dràsta aig an àm a chaidh fhosgladh, air a sgaradh gu tur bho gach atharrachadh às deidh sin. Chan eil a bhith a 'tòiseachadh air an stòradh agus a' cur clàr deuchainn ris a 'riochdachadh dad inntinneach, agus mar sin tha na deas-ghnàthan sin air am fàgail fon spoiler.

A 'cur a-steach inntrigeadh deuchainn

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

Tha mi a’ moladh gun fheuch thu an aon chleas le SQLite agus faicinn dè thachras.

Bheir Multiversion buannachdan gu math snog do bheatha leasaiche iOS. A’ cleachdadh an togalaich seo, is urrainn dhut gu furasta agus gu nàdarra ìre ùrachaidh an stòr dàta airson foirmean sgrion atharrachadh, stèidhichte air beachdachaidhean eòlas neach-cleachdaidh. Mar eisimpleir, gabhamaid feart den tagradh Mail.ru Cloud leithid fèin-luchdachadh susbaint bho ghailearaidh meadhanan an t-siostaim. Le deagh cheangal, bidh an neach-dèiligidh comasach air grunn dhealbhan gach diog a chur ris an fhrithealaiche. Ma bheir thu ùrachadh às deidh gach luchdachadh sìos UICollectionView le susbaint mheadhanan ann an sgòth an neach-cleachdaidh, faodaidh tu dìochuimhneachadh mu 60 fps agus scrollaidh rèidh tron ​​​​phròiseas seo. Gus casg a chuir air ùrachadh sgrion tric, feumaidh tu dòigh air choireigin cuingealachadh a dhèanamh air an ìre aig a bheil dàta ag atharrachadh anns a ’bhunait UICollectionViewDataSource.

Mura h-eil an stòr-dàta a 'toirt taic do ioma-thionndadh agus a' leigeil leat obrachadh a-mhàin leis an t-suidheachadh làithreach a th 'ann an-dràsta, an uairsin gus dealbh clàr-ama den dàta a chruthachadh feumaidh tu a chopaigeadh an dàrna cuid gu structar dàta cuimhne no gu clàr sealach. Tha gin de na dòighean-obrach sin gu math daor. A thaobh stòradh cuimhne, gheibh sinn cosgaisean an dà chuid mar chuimhneachan, air adhbhrachadh le bhith a’ stòradh stuthan togte, agus ann an ùine, co-cheangailte ri cruth-atharrachaidhean ORM nach eil feum. A thaobh a 'bhùird sealach, is e toileachas eadhon nas daoire a tha seo, a' dèanamh ciall a-mhàin ann an cùisean nach eil cho beag.

Tha fuasgladh ioma-thionndaidh LMDB a 'fuasgladh na duilgheadas a thaobh cumail suas stòr dàta seasmhach ann an dòigh gu math eireachdail. Tha e gu leòr dìreach airson malairt agus voila fhosgladh - gus an cuir sinn crìoch air, tha cinnt gum bi an seata dàta stèidhichte. Tha an loidsig airson an astar ùrachaidh aige a-nis gu tur ann an làmhan an ìre taisbeanaidh, gun cus ghoireasan cudromach.

Cursors

Bidh cursors a’ toirt seachad uidheamachd airson a bhith ag aithris gu òrdail thairis air paidhrichean prìomh luach tro bhith a’ dol thairis air craobhan B. Às an aonais, bhiodh e do-dhèanta na clàran san stòr-dàta a mhodail gu h-èifeachdach, air a bheil sinn a-nis a’ tionndadh.

4.2. Modaladh clàr

Leigidh seilbh prìomh òrdachadh dhut tarraing àrd-ìre a thogail leithid clàr a bharrachd air geàrr-chunntasan bunaiteach. Beachdaichidh sinn air a’ phròiseas seo a’ cleachdadh eisimpleir prìomh chlàr neach-dèiligidh sgòthan, a bhios a’ tasgadh fiosrachadh mu fhaidhlichean is phasganan an neach-cleachdaidh gu lèir.

Sgeama clàr

Is e aon de na suidheachaidhean cumanta far am bu chòir structar bùird le craobh pasgan a bhith air a dhealbhadh gus na h-eileamaidean uile a tha suidhichte taobh a-staigh eòlaire sònraichte a thaghadh. Liosta aidmheil. Gus a chuir an gnìomh a bharrachd air stòradh prìomh luach, feumar iuchraichean nam faidhlichean agus na pasganan a sheòrsachadh ann an dòigh a tha iad air an cruinneachadh a rèir am ballrachd anns an eòlaire phàrant. A bharrachd air an sin, gus susbaint an eòlaire a thaisbeanadh ann an cruth a tha eòlach air neach-cleachdaidh Windows (ciad phasganan, an uairsin faidhlichean, an dà chuid air an òrdachadh a rèir na h-aibideil), feumar na raointean a bharrachd co-fhreagarrach a thoirt a-steach don iuchair.

Tha an dealbh gu h-ìosal a’ sealltainn mar a dh’ fhaodadh, a rèir na h-obrach, riochdachadh iuchraichean ann an cruth sreath byte a bhith coltach. Tha na bytes le aithnichear an eòlaire phàrant (dearg) air an cur an toiseach, an uairsin leis an t-seòrsa (uaine) agus san earball leis an ainm (gorm). modh a tha dhìth. Le bhith a’ dol thairis air iuchraichean ann an sreath leis an aon ro-leasachan dearg a’ toirt dhuinn na luachan co-cheangailte riutha san òrdugh a bu chòir dhaibh a bhith air an taisbeanadh san eadar-aghaidh cleachdaiche (air an taobh cheart), gun a bhith feumach air post-giollachd a bharrachd.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Serialing Keys and Values

Chaidh mòran dhòighean air stuthan sreathach a chruthachadh san t-saoghal. Leis nach robh feum sam bith eile againn ach astar, thagh sinn an rud as luaithe a b’ urrainn dhuinn - cnap den chuimhne air a chleachdadh le eisimpleir de structar cànain C. Mar sin, faodar iuchair eileamaid eòlaire a dhealbhadh leis an structar a leanas NodeKey.

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

Gus a shàbhaladh NodeKey ann an stòradh a tha a dhìth san nì MDB_val suidhich am puing dàta gu seòladh toiseach an structair, agus obraich a-mach am meud leis a’ ghnìomh sizeof.

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

Anns a’ chiad chaibideil air slatan-tomhais taghaidh stòr-dàta, thug mi iomradh air a bhith a’ lughdachadh cuibhreannan fiùghantach taobh a-staigh gnìomhachd CRUD mar fheart taghaidh cudromach. Còd gnìomh serialize a’ sealltainn mar a thaobh LMDB faodar an seachnadh gu tur nuair a chuireas tu clàran ùra a-steach don stòr-dàta. Tha an raon byte a tha a’ tighinn a-steach bhon t-seirbheisiche air a thionndadh an-toiseach gu structaran stac, agus an uairsin bidh iad air an dumpadh gu sgiobalta gu stòradh. Leis nach eil cuibhreannan fiùghantach taobh a-staigh LMDB cuideachd, gheibh thu suidheachadh air leth a rèir inbhean iOS - cleachd dìreach cuimhne stac gus obrachadh le dàta air an t-slighe gu lèir bhon lìonra chun diosc!

Ag òrdachadh iuchraichean le coimeas binary

Tha an dàimh prìomh òrdugh air a shònrachadh le gnìomh sònraichte ris an canar coimeas. Leis nach eil fios aig an einnsean mu na semantics de na bytes a th’ annta, chan eil roghainn aig a’ choimpiutair àbhaisteach ach na h-iuchraichean a chuir air dòigh ann an òrdugh faclaireachd, a’ cleachdadh coimeas byte-by-byte. Tha a bhith ga chleachdadh airson structaran a chuir air dòigh coltach ri bearradh le tuagh gearraidh. Ach, ann an cùisean sìmplidh tha mi a 'faicinn an dòigh seo iomchaidh. Tha an roghainn eile air a mhìneachadh gu h-ìosal, ach an seo bheir mi fa-near dhà ràcan sgapte air an t-slighe seo.

Is e a’ chiad rud a chuimhnicheas an riochdachadh cuimhne de sheòrsan dàta prìomhadail. Mar sin, air a h-uile inneal Apple, tha caochladairean iomlan air an stòradh sa chruth Endian beag. Tha seo a’ ciallachadh gum bi am byte as cudromaiche air an taobh chlì, agus cha bhith e comasach àireamhan a sheòrsachadh a’ cleachdadh coimeas byte-by-byte. Mar eisimpleir, le bhith a’ feuchainn ri seo a dhèanamh le seata àireamhan bho 0 gu 511 bheir sin an toradh a leanas.

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

Gus an duilgheadas seo fhuasgladh, feumaidh na h-àireamhan iomlan a bhith air an stòradh san iuchair ann an cruth a tha freagarrach airson a’ choimeasadair byte-byte. Cuidichidh gnìomhan bhon teaghlach thu gus an cruth-atharrachadh riatanach a choileanadh hton* (gu sònraichte htons airson àireamhan dà-byte bhon eisimpleir).

Tha an cruth airson sreathan a riochdachadh ann am prògramadh, mar a tha fios agad, gu h-iomlan eachdraidh. Ma tha an semantics de shreathan, a bharrachd air a’ chòdachadh a thathar a’ cleachdadh airson an riochdachadh mar chuimhneachan, a’ moladh gum faodadh barrachd air aon byte a bhith ann airson gach caractar, tha e nas fheàrr am beachd a thrèigsinn sa bhad a bhith a’ cleachdadh coimeasair bunaiteach.

Is e an dàrna rud ri chumail nad inntinn prionnsabalan co-thaobhadh neach-cruinneachaidh raon structar. Air an sgàth sin, faodar bytes le luachan sgudail a chruthachadh mar chuimhneachan eadar raointean, a tha, gu dearbh, a ’briseadh seòrsachadh byte-byte. Gus cuir às do sgudal, feumaidh tu an dàrna cuid raointean ainmeachadh ann an òrdugh teann, a ’cumail cuimhne air riaghailtean co-thaobhadh, no am feart a chleachdadh anns an dearbhadh structair packed.

Ag òrdachadh iuchraichean le coimeas taobh a-muigh

Is dòcha gu bheil am prìomh loidsig coimeas ro iom-fhillte airson coimeasair binary. Is e aon de na h-adhbharan iomadach gu bheil raointean teicnigeach taobh a-staigh structaran. Seallaidh mi mar a thachair iad a’ cleachdadh an eisimpleir de iuchair airson eileamaid eòlaire air a bheil sinn eòlach mu thràth.

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

A dh’ aindeoin cho sìmplidh ‘s a tha e, sa mhòr-chuid de chùisean bidh e ag ithe cus cuimhne. Bidh am bufair airson an ainm a’ toirt suas 256 bytes, ged is ann ainneamh a bhios ainmean faidhle is pasgan a’ dol thairis air 20-30 caractar.

Is e aon de na dòighean àbhaisteach airson meud clàr a mheudachadh a bhith “ga ghearradh” chun fhìor mheud. Is e a bhunait gu bheil susbaint nan raointean fad caochlaideach air an stòradh ann am bufair aig deireadh an structair, agus tha na faid aca air an stòradh ann an caochladairean fa leth. A rèir an dòigh-obrach seo, is e an iuchair NodeKey air atharrachadh mar a leanas.

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

A bharrachd air an sin, nuair a thathar a’ sreathachadh, chan eil meud an dàta air a shònrachadh sizeof tha an structar gu lèir, agus meud nan raointean uile fad stèidhichte a bharrachd air meud a’ phàirt den bhufair a thathas a’ cleachdadh dha-rìribh.

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

Mar thoradh air an ath-leasachadh, fhuair sinn sàbhalaidhean mòra anns an àite anns an robh iuchraichean. Ach, air sgàth an raon theicnigeach nameLength, chan eil an coimeasair binary bunaiteach tuilleadh freagarrach airson prìomh choimeas. Mura cuir sinn an fheadhainn againn fhèin na àite, bidh fad an ainm na phrìomhachas nas àirde ann an òrdachadh na an t-ainm fhèin.

Tha LMDB a’ leigeil le gach stòr-dàta a phrìomh obair coimeas fhèin a bhith aige. Tha seo air a dhèanamh a 'cleachdadh an gnìomh mdb_set_compare dìreach mus fosgail e. Air adhbharan follaiseach, chan urrainnear atharrachadh fad beatha an stòr-dàta. Bidh an coimeas a’ faighinn dà iuchair ann an cruth binary mar chur-a-steach, agus aig an toradh tillidh e toradh a’ choimeas: nas lugha na (-1), nas motha na (1) no co-ionann ri (0). Pseudocode airson NodeKey coltas mar sin.

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

Cho fad ‘s a tha na h-iuchraichean uile san stòr-dàta den aon sheòrsa, tha e laghail an riochdachadh byte aca a thilgeil gu seòrsa prìomh structar an tagraidh. Tha aon nuance an seo, ach thèid a dheasbad gu h-ìosal anns an fho-earrann “Reading Records”.

Sreath de luachan

Bidh LMDB ag obair gu dian le iuchraichean chlàran a tha air an stòradh. Tha an coimeas ri chèile a’ tachairt taobh a-staigh frèam gnìomhachd gnìomhaichte sam bith, agus tha coileanadh an fhuasglaidh gu lèir an urra ri astar a’ choimeas. Ann an saoghal air leth freagarrach, bu chòir gum biodh an coimeasair binary bunaiteach gu leòr airson coimeas a dhèanamh eadar iuchraichean, ach nam biodh agad ri do chuid fhèin a chleachdadh, bu chòir an dòigh-obrach airson iuchraichean dì-shreathachadh ann a bhith cho luath sa ghabhas.

Chan eil ùidh shònraichte aig an stòr-dàta ann am pàirt luach a’ chlàir (luach). Bidh an tionndadh aige bho riochdachadh byte gu rud a’ tachairt dìreach nuair a tha feum air mar-thà leis a’ chòd tagraidh, mar eisimpleir, airson a thaisbeanadh air an sgrion. Leis gur ann ainneamh a thachras seo, chan eil na riatanasan astair airson a’ mhodh-obrachaidh seo cho èiginneach, agus ann a bhith ga bhuileachadh tha sinn fada nas saoire fòcas a chuir air goireasachd. NSKeyedArchiver.

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

Ach, tha amannan ann nuair a tha coileanadh fhathast cudromach. Mar eisimpleir, nuair a bhios sinn a’ sàbhaladh fiosrachadh mionaideach mu structar faidhle sgòth neach-cleachdaidh, bidh sinn a’ cleachdadh an aon dump cuimhne de nithean. Is e an rud as cudromaiche den obair a bhith a’ gineadh riochdachadh sreathach dhiubh gu bheil na h-eileamaidean de eòlaire air am modaladh le rangachd chlasaichean.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Gus a chuir an gnìomh ann an cànan C, tha raointean sònraichte de na h-oighrean air an cur ann an structaran fa leth, agus tha an ceangal ris a ’bhunait air a shònrachadh tro raon aonaidh seòrsa. Tha fìor shusbaint an aonaidh air a shònrachadh tron ​​​​t-seòrsa feart teicnigeach.

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

Cur ris agus ùrachadh clàran

Faodar an iuchair sreathach agus an luach a chur ris a 'bhùth. Gus seo a dhèanamh, cleachd an gnìomh mdb_put.

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

Aig an ìre rèiteachaidh, faodar an stòradh a cheadachadh no a thoirmeasg bho bhith a’ stòradh grunn chlàran leis an aon iuchair. Mura h-urrainn dha briseadh tachairt ach mar thoradh air mearachd sa chòd, faodaidh tu thu fhèin a dhìon bhuaithe le bhith a’ sònrachadh a’ bhratach NOOVERWRITE.

A 'leughadh innteartan

Gus clàran ann an LMDB a leughadh, cleachd an gnìomh mdb_get. Ma tha am paidhir prìomh luach air a riochdachadh le structaran a chaidh a dhumpadh roimhe, tha coltas mar seo air a’ mhodh-obrach seo.

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

Tha an liostadh a tha air a thaisbeanadh a’ sealltainn mar a tha sreathachadh tro dhump structar a’ leigeil leat faighinn cuidhteas cuibhreannan fiùghantach chan ann a-mhàin nuair a bhios tu a’ sgrìobhadh, ach nuair a bhios tu a’ leughadh dàta. Air tighinn bhon ghnìomh mdb_get bidh am puing a’ coimhead gu dìreach air an t-seòladh cuimhne brìgheil far a bheil an stòr-dàta a’ stòradh riochdachadh byte an nì. Gu dearbh, gheibh sinn seòrsa de ORM a bheir seachad astar leughaidh dàta fìor àrd cha mhòr an-asgaidh. A dh'aindeoin a h-uile bòidhchead an dòigh-obrach, feumar cuimhneachadh air grunn fheartan co-cheangailte ris.

  1. Airson malairt a tha furasta a leughadh a-mhàin, tha an comharra don structar luach cinnteach gum fuirich e dligheach dìreach gus an tèid an gnothach a dhùnadh. Mar a chaidh a ràdh na bu tràithe, tha duilleagan craoibhe B air a bheil nì suidhichte, le taing don phrionnsapal leth-bhreac-air-sgrìobhadh, fhathast gun atharrachadh fhad ‘s a tha co-dhiù aon ghnothach air an ainmeachadh. Aig an aon àm, cho luath ‘s a thig an gnothach mu dheireadh co-cheangailte riutha gu crìch, faodar na duilleagan ath-chleachdadh airson dàta ùr. Ma tha e riatanach gum mair nithean thairis air a’ ghnothach a chruthaich iad, feumar lethbhreac a dhèanamh dhiubh fhathast.
  2. Airson malairt readwrite, cha bhith an comharra don structar luach a thig às dligheach ach gus a’ chiad mhodh atharrachaidh (sgrìobhadh no cuir às do dhàta).
  3. Ged a tha an structar NodeValue gun a bhith làn-chuimseach, ach air a thàthadh (faic fo-earrann “Òrdachadh iuchraichean a’ cleachdadh coimeasair bhon taobh a-muigh”), faodaidh tu faighinn gu sàbhailte gu na raointean aige tron ​​​​chomharradh. Is e am prìomh rud gun a bhith ga mhealladh!
  4. Cha bu chòir an structar atharrachadh tron ​​​​chomharradh a fhuaireadh ann an suidheachadh sam bith. Feumar a h-uile atharrachadh a dhèanamh a-mhàin tron ​​​​dòigh-obrach mdb_put. Ach, ge bith dè cho cruaidh ‘s a tha thu airson seo a dhèanamh, cha bhith e comasach, leis gu bheil an raon cuimhne far a bheil an structar seo suidhichte air a mhapadh ann am modh leughaidh a-mhàin.
  5. Remap faidhle gu àite seòlaidh pròiseas airson adhbhar, mar eisimpleir, am meud stòraidh as motha a mheudachadh a’ cleachdadh a’ ghnìomh mdb_env_set_map_size gu tur neo-dhligheach a h-uile gnothach agus eintiteas co-cheangailte ris san fharsaingeachd agus a’ comharrachadh nithean sònraichte gu sònraichte.

Mu dheireadh, tha feart eile cho brùideil is nach eil a bhith a’ nochdadh a bhrìgh a’ freagairt air dìreach paragraf eile. Anns a 'chaibideil mun chraobh B, thug mi seachad diagram air mar a tha na duilleagan air an rèiteachadh mar chuimhneachan. Tha e a 'leantainn bho seo gum faod seòladh toiseach a' bhufair le dàta sreathach a bhith gu tur neo-riaghailteach. Air sgàth seo, fhuair iad an comharradh anns an structar MDB_val agus air a lughdachadh gu puing gu structar, tha e a’ tionndadh a-mach gu bheil e neo-ainmichte sa chùis choitcheann. Aig an aon àm, tha ailtireachd cuid de chips (ann an cùis iOS is e seo armv7) ag iarraidh gum bi seòladh dàta sam bith na iomad de mheud facal an inneil no, ann am faclan eile, meud beagan an t-siostaim ( airson armv7 tha e 32 bit). Ann am faclan eile, gnìomhachd mar *(int *foo)0x800002 orra tha e co-ionann ri teicheadh ​​​​agus a 'leantainn gu bàs le breithneachadh EXC_ARM_DA_ALIGN. Tha dà dhòigh air a leithid de dh 'ionnsaigh bhrònach a sheachnadh.

Tha a’ chiad fhear a’ dol sìos gu bhith a’ dèanamh lethbhreac tòiseachaidh de dhàta gu structar a tha follaiseach. Mar eisimpleir, air coimeasair àbhaisteach bidh seo ri fhaicinn mar a leanas.

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

Is e dòigh eile fios a chuir chun neach-cruinneachaidh ro-làimh gur dòcha nach bi structaran prìomh luach co-thaobhadh ri buadhan aligned(1). Air ARM faodaidh an aon bhuaidh a bhith agad a choileanadh agus a 'cleachdadh a' ghnè pacaichte. Leis gu bheil e cuideachd a 'cuideachadh le bhith a' dèanamh an fheum as fheàrr den àite anns a bheil an structar, tha an dòigh seo a 'coimhead nas fheàrr leam, ged a tha приводит gu àrdachadh ann an cosgais gnìomhachd ruigsinneachd dàta.

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

Ceistean raon

Gus aithris thairis air buidheann de chlàran, tha LMDB a’ toirt seachad tarraing cùrsair. Bheir sinn sùil air mar a dh’ obraicheas sinn leis a’ cleachdadh an eisimpleir de bhòrd le meata-dàta sgòthan luchd-cleachdaidh air a bheil sinn eòlach mu thràth.

Mar phàirt de bhith a’ taisbeanadh liosta de fhaidhlichean ann an eòlaire, feumar na h-iuchraichean gu lèir a lorg leis a bheil na faidhlichean cloinne agus na pasganan aige co-cheangailte. Anns na fo-roinnean roimhe seo chuir sinn na h-iuchraichean air dòigh NodeKey gus am bi iad air an òrdachadh sa mhòr-chuid le ID an eòlaire phàrant. Mar sin, gu teicnigeach, tha an obair a bhith a’ faighinn air ais susbaint pasgan a’ tighinn sìos gu bhith a’ cur an cursair air crìoch àrd a’ bhuidheann iuchraichean le ro-leasachan sònraichte agus an uairsin ag ath-aithris chun chrìoch as ìsle.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Faodar a’ chrìoch àrd a lorg gu dìreach le sgrùdadh sreath. Gus seo a dhèanamh, tha an cursair air a chuir aig toiseach liosta iomlan nan iuchraichean san stòr-dàta agus air a mheudachadh nas fhaide gus an nochd iuchair le aithnichear an eòlaire phàrant gu h-ìosal. Tha dà eas-bhuannachdan follaiseach aig an dòigh-obrach seo:

  1. Iom-fhillteachd sgrùdadh sreathach, ged, mar a tha fios, ann an craobhan san fharsaingeachd agus ann an craobh-B gu sònraichte faodar a dhèanamh ann an ùine logarithmach.
  2. Gu dìomhain, tha a h-uile duilleag air thoiseach air an fhear a thathar a 'sireadh air a thogail bhon fhaidhle chun phrìomh chuimhne, a tha gu math daor.

Gu fortanach, tha an API LMDB a 'toirt seachad dòigh èifeachdach air an cursair a shuidheachadh an toiseach Gus seo a dhèanamh, feumaidh tu iuchair a chruthachadh aig a bheil luach follaiseach nas lugha na no co-ionnan ris an iuchair a tha suidhichte aig crìoch àrd an eadar-ama. Mar eisimpleir, a thaobh an liosta anns an fhigear gu h-àrd, is urrainn dhuinn iuchair a dhèanamh anns a bheil an raon parentId bidh e co-ionann ri 2, agus tha an còrr air a lìonadh le neamhan. Tha iuchair mar seo air a lìonadh gu ìre air a thoirt don cuir a-steach gnìomh mdb_cursor_get a’ comharrachadh an obrachaidh 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);

Ma lorgar crìoch àrd buidheann iuchraichean, an uairsin bidh sinn ag ath-aithris thairis air gus an coinnich sinn no an coinnich an iuchair ri fear eile parentId, air neo cha ruith na h-iuchraichean a-mach idir

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

Is e an rud a tha math, mar phàirt den tionndadh a’ cleachdadh mdb_cursor_get, gum faigh sinn chan e a-mhàin an iuchair, ach cuideachd an luach. Ma tha, gus na cumhaichean samplachaidh a choileanadh, feumaidh tu sgrùdadh a dhèanamh, am measg rudan eile, na raointean bhon phàirt luach den chlàr, tha iad gu math ruigsinneach gun ghluasadan a bharrachd.

4.3. Modail dàimh eadar bùird

Roimhe seo, tha sinn air a bhith comasach beachdachadh air a h-uile taobh de dhealbhadh agus obrachadh le stòr-dàta aon-bhòrd. Faodaidh sinn a ràdh gur e clàr de chlàran a th’ ann an clàr anns a bheil an aon sheòrsa de chàraidean prìomh-luach. Ma sheallas tu iuchair mar cheart-cheàrnach agus an luach co-cheangailte ris mar phìob co-shìnte, gheibh thu diagram lèirsinneach den stòr-dàta.

Default

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Ach, ann am fìor bheatha is ann ainneamh a bhios e comasach faighinn seachad le cho beag dòrtadh fala. Gu math tric ann an stòr-dàta tha e riatanach, an toiseach, grunn chlàran a bhith agad, agus san dàrna àite, taghaidhean a dhèanamh annta ann an òrdugh eadar-dhealaichte bhon phrìomh iuchair. Tha an earrann mu dheireadh seo air a chuimseachadh air cùisean an cruthachaidh agus an eadar-cheangail.

Clàr-amais

Tha earrann “Gailearaidh” aig an tagradh sgòthan. Bidh e a’ taisbeanadh susbaint mheadhanan bhon sgòth gu lèir, air a sheòrsachadh a rèir ceann-latha. Gus an leithid de thaghadh a chuir an gnìomh gu dòigheil, ri taobh a ’phrìomh chlàr feumaidh tu fear eile a chruthachadh le seòrsa ùr de iuchraichean. Bidh raon annta leis a’ cheann-latha a chaidh am faidhle a chruthachadh, a bhios mar phrìomh shlat-tomhais seòrsachaidh. Leis gu bheil na h-iuchraichean ùra a’ toirt iomradh air an aon dàta ris na h-iuchraichean sa phrìomh chlàr, canar iuchraichean clàr-amais riutha. Anns an dealbh gu h-ìosal tha iad air an comharrachadh ann an orains.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Gus iuchraichean clàran eadar-dhealaichte a sgaradh bho chèile taobh a-staigh an aon stòr-dàta, chaidh clàr raon teignigeach a bharrachd a chuir ris a h-uile gin dhiubh. Le bhith ga dhèanamh na phrìomhachas as àirde airson a bhith a’ rèiteach, gheibh sinn cruinneachadh iuchraichean an toiseach le bùird, agus taobh a-staigh chlàran - a rèir ar riaghailtean fhèin.

Tha an iuchair clàr-amais a’ toirt iomradh air an aon dàta ris a’ phrìomh iuchair. Chan eil buileachadh dìreach den togalach seo tro bhith a’ ceangal ris leth-bhreac de phàirt luach na prìomh iuchair as fheàrr bho ghrunn bheachdan:

  1. A thaobh an fhànais a chaidh a thogail, faodaidh na meata-dàta a bhith gu math beairteach.
  2. Bho shealladh dèanadais, oir nuair a bhios tu ag ùrachadh meata-dàta nód, feumaidh tu ath-sgrìobhadh le bhith a’ cleachdadh dà iuchair.
  3. Bho thaobh taic còd, ma dhìochuimhnicheas sinn an dàta ùrachadh airson aon de na h-iuchraichean, gheibh sinn bug neo-sheasmhach de neo-chunbhalachd dàta anns an stòradh.

An ath rud, beachdaichidh sinn air mar a chuireas tu às do na h-easbhaidhean sin.

Eagrachadh dàimhean eadar bùird

Tha am pàtran gu math freagarrach airson a bhith a 'ceangal a' chlàr clàr-amais leis a 'phrìomh chlàr "iuchair mar luach". Mar a tha an t-ainm a’ moladh, is e leth-bhreac den phrìomh luach am pàirt luach den chlàr clàr-amais. Tha an dòigh-obrach seo a’ cur às do na h-eas-bhuannachdan gu h-àrd co-cheangailte ri bhith a’ stòradh leth-bhreac de phàirt luach a’ phrìomh chlàr. Is e an aon chosgais gus luach fhaighinn le iuchair clàr-amais, feumaidh tu 2 cheist a chuir chun stòr-dàta an àite aon. Gu sgeamaigeach, tha an sgeama stòr-dàta a thig às a’ coimhead mar seo.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Is e pàtran eile airson dàimhean a chuir air dòigh eadar bùird "iuchair gun fheum". Is e a bhunait buadhan a bharrachd a chuir ris an iuchair, a tha a dhìth chan ann airson a sheòrsachadh, ach airson an iuchair co-cheangailte ath-chruthachadh. ann an co-theacsa frèaman iOS sònraichte, bheir mi eisimpleir meallta, ach nas soilleire

Tha duilleag aig teachdaichean gluasadach Cloud a sheallas a h-uile faidhle agus pasgan a tha an neach-cleachdaidh air a roinn le daoine eile. Leis nach eil ach glè bheag de fhaidhlichean mar sin ann, agus gu bheil tòrr diofar sheòrsaichean fiosrachaidh sònraichte ann mu fhollaiseachd co-cheangailte riutha (cò a gheibh ruigsinneachd, dè na còraichean, msaa), cha bhith e reusanta uallach a thoirt don phàirt luach den clàraich sa phrìomh chlàr leis. Ach, ma tha thu airson na faidhlichean sin a thaisbeanadh far loidhne, feumaidh tu fhathast a stòradh an àiteigin. Is e fuasgladh nàdarra clàr air leth a chruthachadh dha. Anns an dealbh gu h-ìosal, tha an iuchair aige air a ro-leasachan le “P”, agus faodar an luach nas sònraichte “fiosrachadh poblach” a chuir an àite an neach-àite “propname”.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Tha a h-uile meata-dàta sònraichte, airson an stòradh a chaidh an clàr ùr a chruthachadh, air a chuir ann am pàirt luach a’ chlàir. Aig an aon àm, chan eil thu airson an dàta mu fhaidhlichean agus phasganan a tha air a stòradh sa phrìomh chlàr a dhùblachadh. An àite sin, thèid dàta gun fheum a chur ris an iuchair “P” ann an cruth nan raointean “node ID” agus “stampa-ama”. Taing dhaibh, faodaidh tu iuchair clàr-amais a thogail, às am faigh thu prìomh iuchair, às am faigh thu, mu dheireadh, meata-dàta nód.

Co-dhùnadh

Bidh sinn a’ dèanamh measadh dearbhach air toraidhean buileachadh LMDB. Às deidh sin, chaidh an àireamh de reothadh tagraidh sìos 30%.

Deàrrsadh agus bochdainn stòr-dàta prìomh luach LMDB ann an tagraidhean iOS

Bha toraidhean na h-obrach a chaidh a dhèanamh a 'dol nas fhaide na sgioba iOS. An-dràsta, tha aon de na prìomh earrannan “Faidhlichean” san tagradh Android cuideachd air tionndadh gu bhith a’ cleachdadh LMDB, agus tha pàirtean eile air an t-slighe. Bha an cànan C, anns a bheil an stòr prìomh luach air a bhuileachadh, na chuideachadh math gus frèam tagraidh a chruthachadh timcheall air tar-àrd-ùrlar ann an C ++. Chaidh gineadair còd a chleachdadh gus an leabharlann C ++ a thàinig às a sin a cheangal gu sgiobalta le còd àrd-ùrlar ann an Amas-C agus Kotlin Djinni bho Dropbox, ach tha sin na sgeulachd gu tur eadar-dhealaichte.

Source: www.habr.com

Cuir beachd ann