Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Thaum lub caij nplooj zeeg xyoo 2019, qhov tshwm sim tau tos ntev tau tshwm sim hauv pab pawg Mail.ru Cloud iOS. Cov ntaub ntawv tseem ceeb rau kev khaws cia tsis tu ncua ntawm daim ntawv thov lub xeev tau dhau los ua kab txawv heev rau lub ntiaj teb txawb Lightning Memory-Mapped Database (LMDB). Hauv qab qhov txiav peb muab koj cov ncauj lus kom ntxaws txog nws hauv plaub ntu. Ua ntej, cia peb tham txog cov laj thawj rau qhov kev xaiv tsis tseem ceeb thiab nyuaj. Tom qab ntawd peb yuav txav mus los xav txog peb tus ncej ntawm lub plawv ntawm LMDB architecture: nco-mapped cov ntaub ntawv, B +-ntoo, luam-on-sau mus kom ze rau kev siv cov kev hloov pauv thiab ntau yam. Thaum kawg, rau khoom qab zib - lub tswv yim ib feem. Nyob rau hauv nws peb yuav saib yuav ua li cas los tsim thiab siv ib tug database schema nrog ob peb lub rooj, nrog rau ib tug Performance index ib, nyob rau hauv sab saum toj ntawm tus nqi qis-tus nqi API.

Txheem

  1. Kev txhawb siab rau kev siv
  2. LMDB Positioning
  3. Peb tus ncej ntawm LMDB
    3.1. Whale #1. Memory-mapped cov ntaub ntawv
    3.2. Whale #2. B+- tsob ntoo
    3.3. Whale #3. Copy-on-write
  4. Tsim cov ntaub ntawv schema nyob rau sab saum toj ntawm qhov tseem ceeb-tus nqi API
    4.1. Basic Abstractions
    4.2. Table Modeling
    4.3. Ua qauv kev sib raug zoo ntawm cov rooj

1. Kev txhawb siab rau kev siv

Ib xyoos nyob rau hauv 2015, peb coj qhov teeb meem los ntsuas qhov feem ntau ntawm cov interface ntawm peb daim ntawv thov lags. Peb ua qhov no rau ib qho laj thawj. Peb tau txais kev tsis txaus siab ntau zaus uas qee zaum daim ntawv thov tsis teb rau cov neeg siv kev ua: cov nyees khawm tsis tuaj yeem nias, cov npe tsis scroll, thiab lwm yam. Hais txog cov txheej txheem ntawm kev ntsuas hais ntawm AvitoTech, yog li ntawm no kuv tsuas yog muab qhov kev txiav txim ntawm tus lej.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Cov txiaj ntsig ntsuas tau dhau los ua da dej txias rau peb. Nws muab tawm tias muaj ntau yam teeb meem tshwm sim los ntawm kev khov ntau dua li lwm yam. Yog hais tias ua ntej paub qhov tseeb no lub ntsiab technical indicator of quality is crash free, ces tom qab lub tsom xam ua haujlwm ntawm freeze.

Muaj ua dashboard nrog freezes thiab tom qab siv nyiaj kom muaj nuj nqis и zoo tsom xam ntawm lawv cov laj thawj, tus yeeb ncuab tseem ceeb tau pom meej - hnyav ua lag luam logic tua nyob rau hauv lub ntsiab xov ntawm daim ntawv thov. Cov tshuaj tiv thaiv ntuj rau qhov kev txaj muag no yog kev kub ntxhov siab los thawb nws mus rau hauv cov dej ntws ua haujlwm. Yuav kom daws tau qhov teeb meem no, peb tau siv ntau txoj xov zoo raws li cov neeg ua yeeb yam hnyav. Kuv mob siab rau nws rau nws hloov kho rau lub ntiaj teb iOS no ob xov ntawm collective Twitter thiab tsab xov xwm ntawm Habre. Raws li ib feem ntawm cov lus piav qhia tam sim no, kuv xav hais txog cov yam ntxwv ntawm qhov kev txiav txim siab uas cuam tshuam rau kev xaiv ntawm cov ntaub ntawv.

Tus qauv ua yeeb yam ntawm lub koom haum system xav tias multithreading ua nws qhov tseem ceeb thib ob. Cov qauv khoom hauv nws nyiam hla kwj ciam. Thiab lawv ua qhov no tsis yog qee zaum thiab ntawm no thiab muaj, tab sis yuav luag tas li thiab txhua qhov chaw

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Cov ntaub ntawv yog ib qho ntawm cov ntsiab lus tseem ceeb hauv daim duab qhia. Nws lub luag haujlwm tseem ceeb yog ua raws li macropattern Shared Database. Yog hais tias nyob rau hauv lub lag luam ntiaj teb no nws yog siv los npaj cov ntaub ntawv synchronization ntawm cov kev pab cuam, ces nyob rau hauv cov ntaub ntawv ntawm actor architecture - cov ntaub ntawv ntawm threads. Yog li, peb xav tau ib lub chaw khaws ntaub ntawv uas yuav tsis ua rau muaj teeb meem me me thaum ua haujlwm nrog nws nyob rau hauv ib puag ncig ntau txoj xov. Tshwj xeeb, qhov no txhais tau hais tias cov khoom tau los ntawm nws yuav tsum yog yam tsawg kawg nkaus xov-kev nyab xeeb, thiab qhov zoo tshaj plaws tsis hloov pauv. Raws li koj paub, tom kawg tuaj yeem siv tib lub sijhawm los ntawm ntau cov xov tsis muaj kev cuam tshuam rau kev xauv, uas muaj txiaj ntsig zoo rau kev ua haujlwm.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thovQhov tseem ceeb thib ob uas cuam tshuam rau kev xaiv ntawm database yog peb huab API. Nws tau txais kev tshoov siab los ntawm kev sib koom ua ke tau txais los ntawm git. Zoo li nws, peb tsom rau offline-thawj API, uas zoo li ntau tshaj qhov tsim nyog rau cov neeg siv huab. Nws tau xav tias lawv tsuas yog tso tawm tag nrho lub xeev ntawm huab ib zaug, thiab tom qab ntawd synchronization hauv feem ntau ntawm cov xwm txheej yuav tshwm sim los ntawm kev hloov pauv. Alas, lub sijhawm no tsuas yog nyob hauv thaj chaw theoretical xwb, thiab cov neeg siv khoom tsis tau kawm yuav ua li cas ua haujlwm nrog thaj ua rau thaj. Muaj ntau lub hom phiaj yog vim li cas rau qhov no, uas, txhawm rau kom tsis txhob ncua qhov kev taw qhia, peb yuav tawm hauv qab cov hlua. Tam sim no, dab tsi yog qhov txaus siab ntau dua yog cov lus qhia xaus ntawm zaj lus qhia txog dab tsi tshwm sim thaum API hais tias "A" thiab nws cov neeg siv khoom tsis hais "B".

Yog li, yog tias koj xav txog git, uas, thaum ua tiav cov lus txib rub, es tsis txhob siv thaj ua rau thaj rau hauv lub zos snapshot, piv nws lub xeev tag nrho nrog rau tag nrho cov neeg rau zaub mov xeev, ces koj yuav muaj lub tswv yim ncaj ncees ntawm yuav ua li cas synchronization tshwm sim hauv huab. cov neeg siv khoom. Nws yog ib qho yooj yim los twv seb yuav siv nws, koj yuav tsum faib ob DOM ntoo hauv lub cim xeeb nrog cov ntaub ntawv qhia txog txhua tus neeg rau zaub mov thiab cov ntaub ntawv hauv zos. Nws hloov tawm tias yog tias tus neeg siv khaws 500 txhiab cov ntaub ntawv hauv huab, tom qab ntawd kom synchronize nws yog qhov tsim nyog los tsim thiab rhuav tshem ob tsob ntoo nrog 1 lab nodes. Tab sis txhua qhov node yog ib qho kev sib sau uas muaj cov duab ntawm cov khoom. Hauv qhov teeb pom kev no, cov txiaj ntsig profile tau xav tau. Nws muab tawm hais tias txawm tias tsis noj mus rau hauv tus account lub merging algorithm, lub heev txheej txheem ntawm kev tsim thiab tom qab rhuav tshem ib tug lossis loj tus naj npawb ntawm cov khoom me me nqi ib tug zoo nkauj penny. ntawm cov neeg siv scripts. Raws li qhov tshwm sim, peb kho qhov tseem ceeb thib ob hauv kev xaiv cov ntaub ntawv - lub peev xwm los siv CRUD kev ua haujlwm yam tsis muaj kev faib tawm ntawm cov khoom.

Lwm qhov kev xav tau yog cov tsoos ntau dua thiab lawv cov npe tag nrho yog raws li hauv qab no.

  1. Xov kev ruaj ntseg.
  2. Multiprocessing. Dictated los ntawm lub siab xav siv tib lub database piv txwv rau synchronize lub xeev tsis tsuas yog ntawm threads, tab sis kuj ntawm lub ntsiab daim ntawv thov thiab iOS no extensions.
  3. Lub peev xwm los sawv cev cov chaw khaws cia ua cov khoom tsis hloov pauv.
  4. Tsis muaj kev faib tawm dynamic hauv CRUD cov haujlwm.
  5. Kev them nyiaj yug rau cov khoom ntiag tug acid: atomicity, sib xws, kev sib cais thiab kev ntseeg tau.
  6. Ceev ntawm cov rooj plaub uas nrov tshaj plaws.

Nrog cov txheej txheem no, SQLite yog thiab tseem yog qhov kev xaiv zoo. Txawm li cas los xij, ua ib feem ntawm txoj kev kawm ntawm lwm txoj hauv kev, kuv tuaj hla ib phau ntawv "Pib pib nrog LevelDB". Nyob rau hauv nws txoj kev coj noj coj ua, ib qho kev ntsuas tau sau sib piv qhov nrawm ntawm kev ua haujlwm nrog cov ntaub ntawv sib txawv hauv huab huab tiag tiag. Cov txiaj ntsig tau tshaj peb qhov kev cia siab tshaj plaws. Nyob rau hauv cov xwm txheej nrov tshaj plaws - tau txais tus cursor ntawm cov npe ntawm txhua cov ntaub ntawv thiab cov npe ntawm txhua cov ntaub ntawv rau ib daim ntawv teev npe - LMDB tau dhau los ua 10 npaug sai dua SQLite. Qhov kev xaiv tau pom tseeb.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

2. LMDB Positioning

LMDB yog lub tsev qiv ntawv me me (tsuas yog 10K kab) uas siv cov txheej txheem qis tshaj plaws ntawm cov ntaub ntawv khaws cia - khaws cia.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Daim duab saum toj no qhia tau hais tias kev sib piv LMDB nrog SQLite, uas tseem siv cov qib siab dua, feem ntau tsis raug ntau dua li SQLite nrog cov ntaub ntawv tseem ceeb. Nws yuav yog qhov ncaj ncees ntau dua los hais txog tib lub tshuab cia li sib npaug ntawm cov neeg sib tw - BerkeleyDB, LevelDB, Sophia, RocksDB, thiab lwm yam. Muaj txawm tias qhov kev txhim kho uas LMDB ua raws li lub cav ntim rau SQLite. Thawj qhov kev sim no yog xyoo 2012 siv los ntawm LMDB Howard Chu. Результаты tau ua kom txaus siab heev uas nws txoj kev pib tau txais los ntawm OSS cov neeg nyiam, thiab pom nws txuas ntxiv hauv tus neeg. LumoSQL. Thaum Lub Ib Hlis 2020, tus sau ntawm qhov project no yog Den Shearer nthuav tawm nws ntawm LinuxConfAu.

LMDB feem ntau yog siv los ua lub cav rau daim ntawv thov databases. Lub tsev qiv ntawv tshuav nws qhov tsos rau cov neeg tsim khoom OpenLDAP, leej twg tsis txaus siab rau BerkeleyDB ua lub hauv paus rau lawv txoj haujlwm. Pib los ntawm lub tsev qiv ntawv me me ua btre, Howard Chu muaj peev xwm tsim ib qho ntawm cov kev xaiv nrov tshaj plaws ntawm peb lub sijhawm. Nws mob siab rau nws daim ntawv qhia zoo heev rau zaj dab neeg no, nrog rau cov qauv sab hauv ntawm LMDB. "Lub Lightning Memory-mapped Database". Ib qho piv txwv zoo ntawm kev kov yeej lub chaw cia khoom tau qhia los ntawm Leonid Yuryev (aka yleo ua) los ntawm Positive Technologies hauv nws daim ntawv tshaj tawm ntawm Highload 2015 "Lub cav LMDB yog tus yeej tshwj xeeb". Hauv nws, nws tham txog LMDB nyob rau hauv cov ntsiab lus ntawm ib txoj haujlwm zoo sib xws ntawm kev siv ReOpenLDAP, thiab LevelDB twb raug kev thuam sib piv. Raws li qhov tshwm sim ntawm qhov kev siv, Cov Tshuab Zoo Tshaj Plaws txawm tias muaj kev txhim kho cov nkhaus MDBX nrog heev cua nta, optimizations thiab bugfixes.

LMDB feem ntau yog siv raws li kev cia khoom. Piv txwv li, Mozilla Firefox browser xaiv nws rau ib tug xov tooj ntawm cov kev xav tau, thiab, pib ntawm version 9, Xcode nyiam nws SQLite rau khaws indexes.

Lub cav kuj tau ua nws lub cim nyob rau hauv lub ntiaj teb no ntawm mobile kev loj hlob. Cov cim ntawm nws siv tuaj yeem ua tau mus nrhiav hauv tus neeg siv iOS no rau Telegram. LinkedIn tau mus ntxiv thiab xaiv LMDB ua qhov chaw cia rau nws cov ntaub ntawv hauv tsev caching cov ntaub ntawv foob pob hluav taws, hais txog qhov twg hais nyob rau hauv nws tsab xov xwm nyob rau hauv 2016.

LMDB tau ua tiav kev sib ntaus sib tua rau ib qho chaw nyob rau hauv lub hnub nyob rau hauv lub niche sab laug los ntawm BerkeleyDB tom qab nws los nyob rau hauv kev tswj ntawm Oracle. Lub tsev qiv ntawv nyiam rau nws txoj kev ceev thiab kev ntseeg siab, txawm tias piv rau nws cov phooj ywg. Raws li koj paub, tsis muaj pluas su dawb, thiab kuv xav hais txog kev lag luam tawm uas koj yuav tau ntsib thaum xaiv ntawm LMDB thiab SQLite. Daim duab saum toj no qhia meej tias yuav ua li cas nce kev nrawm. Ua ntej, peb tsis them rau cov txheej txheem ntxiv ntawm abstraction nyob rau sab saum toj ntawm disk cia. Nws yog qhov tseeb tias qhov zoo nkauj zoo nkauj tseem tsis tuaj yeem ua yam tsis muaj lawv, thiab lawv yuav tshwm sim nyob rau hauv daim ntawv thov code, tab sis lawv yuav ua tau ntau dua. Lawv yuav tsis muaj cov yam ntxwv uas tsis tas yuav tsum tau los ntawm ib daim ntawv thov tshwj xeeb, piv txwv li, txhawb cov lus nug hauv SQL lus. Thib ob, nws tuaj yeem ua tau zoo siv daim ntawv qhia kev ua haujlwm ntawm kev thov rau disk cia. Yog SQLite hauv kuv txoj haujlwm yog raws li qhov kev xav tau ntawm qhov nruab nrab ntawm daim ntawv thov nruab nrab, ces koj, raws li tus tsim daim ntawv thov, paub zoo txog cov xwm txheej tseem ceeb ntawm kev ua haujlwm. Txhawm rau kom muaj txiaj ntsig zoo dua, koj yuav tsum tau them tus nqi nce ntxiv rau ob qho tib si rau kev txhim kho cov tshuaj thawj zaug thiab rau nws cov kev txhawb nqa tom ntej.

3. Peb tus ncej ntawm LMDB

Tau saib ntawm LMDB los ntawm qhov pom noog qhov muag, nws yog lub sijhawm mus tob dua. Peb ntu tom ntej no yuav raug mob siab rau kev tshuaj xyuas ntawm cov ncej tseem ceeb uas lub chaw cia khoom nyob:

  1. Nco-mapped cov ntaub ntawv raws li ib tug mechanism rau kev ua hauj lwm nrog disk thiab synchronizing nrog cov ntaub ntawv lug.
  2. B +-ntoo ua ib lub koom haum ntawm cov qauv ntawm cov ntaub ntawv khaws cia.
  3. Luam-on-sau raws li txoj hauv kev los muab ACID cov khoom lag luam thiab ntau yam.

3.1. Whale #1. Memory-mapped cov ntaub ntawv

Cov ntaub ntawv nco-mapped yog xws li ib qho tseem ceeb architectural caij uas lawv txawm tshwm sim nyob rau hauv lub npe ntawm lub repository. Cov teeb meem ntawm caching thiab synchronization ntawm kev nkag mus rau cov ntaub ntawv khaws cia yog tag nrho rau lub operating system. LMDB tsis muaj cov caches hauv nws tus kheej. Qhov no yog kev txiav txim siab los ntawm tus sau, txij li kev nyeem cov ntaub ntawv ncaj qha los ntawm cov ntaub ntawv mapped tso cai rau koj los txiav ntau cov ces kaum hauv kev siv lub cav. Hauv qab no yog qhov deb ntawm tag nrho cov npe ntawm qee qhov ntawm lawv.

  1. Kev tswj xyuas qhov sib xws ntawm cov ntaub ntawv hauv kev khaws cia thaum ua haujlwm nrog nws los ntawm ntau cov txheej txheem dhau los ua lub luag haujlwm ntawm lub operating system. Nyob rau hauv seem tom ntej no, qhov no mechanics yog tham nyob rau hauv kom meej thiab nrog cov duab.
  2. Qhov tsis muaj caches kiag li tshem tawm LMDB los ntawm cov nyiaj siv ua haujlwm uas cuam tshuam nrog kev faib tawm dynamic. Kev nyeem cov ntaub ntawv hauv kev xyaum txhais tau hais tias teeb tsa tus taw tes rau qhov chaw nyob hauv virtual nco thiab tsis muaj dab tsi ntxiv. Nws suab zoo li kev tshawb fawb tsis tseeb, tab sis nyob rau hauv qhov chaw cia code tag nrho cov hu rau calloc yog concentrated nyob rau hauv lub cia configuration muaj nuj nqi.
  3. Qhov tsis muaj caches kuj txhais tau hais tias qhov tsis muaj cov xauv cuam tshuam nrog synchronization ntawm lawv nkag. Cov neeg nyeem, uas tuaj yeem muaj ntau tus neeg nyeem tib lub sijhawm, tsis txhob ntsib ib tus mutex ntawm lawv txoj kev mus rau cov ntaub ntawv. Vim li no, kev nyeem ntawv ceev muaj qhov zoo tshaj plaws linear scalability raws li tus naj npawb ntawm CPUs. Hauv LMDB, tsuas yog hloov kho cov haujlwm yog synchronized. Tsuas muaj ib tus kws sau ntawv ib zaug xwb.
  4. Yam tsawg kawg ntawm caching thiab synchronization logic tshem tawm qhov nyuaj heev ntawm kev ua yuam kev cuam tshuam nrog kev ua haujlwm hauv ib puag ncig ntau txoj xov. Muaj ob qhov kev tshawb fawb txog kev nthuav dav ntawm lub rooj sib tham Usenix OSDI 2014: "Tag nrho cov ntaub ntawv kaw lus tsis yog tsim sib npaug: Ntawm qhov nyuaj ntawm Crafting Crash-Consistent Applications" и "Kev tsim txom Databases rau kev lom zem thiab nyiaj txiag". Los ntawm lawv koj tuaj yeem khaws cov ntaub ntawv hais txog ob qho tib si kev ntseeg siab ntawm LMDB thiab yuav luag tsis muaj qhov tsis zoo ntawm ACID kev hloov pauv khoom, uas yog qhov zoo tshaj plaws hauv SQLite.
  5. Lub minimalism ntawm LMDB tso cai rau lub tshuab sawv cev ntawm nws cov cai kom tag nrho nyob rau hauv lub L1 cache ntawm lub processor nrog rau cov yam ntxwv ceev.

Hmoov tsis zoo, hauv iOS, nrog cov ntaub ntawv mapped rau lub cim xeeb, txhua yam tsis zoo li huab tsis zoo li peb xav tau. Txhawm rau tham txog qhov tsis zoo cuam tshuam nrog lawv ntau lub siab, nws yuav tsum nco ntsoov cov ntsiab lus dav dav ntawm kev siv cov txheej txheem no hauv kev ua haujlwm.

Cov ntaub ntawv dav dav txog cov ntaub ntawv nco-mapped

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thovNrog rau txhua daim ntawv thov uas khiav, lub operating system koom nrog ib qho chaw hu ua txheej txheem. Txhua tus txheej txheem tau muab faib ua ntau qhov sib txuas ntawm qhov chaw nyob uas nws tso txhua yam nws xav tau los ua haujlwm. Ntawm qhov chaw nyob qis tshaj plaws muaj cov ntu nrog cov lej thiab cov ntaub ntawv nyuaj thiab cov peev txheej. Tom ntej no los txog kev loj hlob ntawm qhov chaw nyob dynamic, paub zoo rau peb nyob rau hauv lub npe heap. Nws muaj cov chaw nyob ntawm cov chaw uas tshwm sim thaum lub sijhawm ua haujlwm ntawm qhov program. Nyob rau sab saum toj yog qhov chaw nco siv los ntawm daim ntawv thov pawg. Nws loj hlob los yog cog lus; nyob rau hauv lwm yam lus, nws loj kuj muaj ib tug dynamic xwm. Txhawm rau tiv thaiv cov pawg thiab heap los ntawm kev thawb thiab cuam tshuam rau ib leeg, lawv nyob ntawm qhov sib txawv ntawm qhov chaw nyob. Lub operating system siv qhov chaw nyob hauv ntu nruab nrab no los koom nrog ntau lub koom haum nrog cov txheej txheem. Tshwj xeeb, nws tuaj yeem koom nrog qee qhov txuas txuas ntxiv ntawm qhov chaw nyob nrog cov ntaub ntawv ntawm lub disk. Xws li cov ntaub ntawv hu ua memory-mapped.

Qhov chaw nyob qhov chaw faib rau cov txheej txheem yog loj heev. Raws li txoj cai, tus naj npawb ntawm qhov chaw nyob tsuas yog txwv los ntawm qhov loj ntawm tus taw tes, uas yog txiav txim los ntawm lub peev xwm me ntsis ntawm qhov system. Yog hais tias lub cev nco tau mapped rau nws 1-rau-1, ces thawj zaug txheej txheem yuav gobble tag nrho RAM, thiab yuav tsis muaj kev tham txog tej multitasking.

Txawm li cas los xij, los ntawm peb qhov kev paub dhau los peb paub tias kev ua haujlwm niaj hnub no tuaj yeem ua tiav ib txhij ua ntau yam txheej txheem raws li qhov xav tau. Qhov no yog ua tau vim hais tias lawv tsuas yog faib ntau lub cim xeeb rau cov txheej txheem ntawm daim ntawv, tab sis qhov tseeb lawv thauj mus rau hauv lub ntsiab lub cev nco tsuas yog qhov uas xav tau ntawm no thiab tam sim no. Yog li ntawd, lub cim xeeb cuam tshuam nrog cov txheej txheem hu ua virtual.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Lub operating system teeb tsa lub cim xeeb virtual thiab lub cev rau hauv nplooj ntawv ntawm qee qhov loj. Sai li ib nplooj ntawv ntawm lub cim xeeb virtual yog nyob rau hauv kev thov, lub operating system thauj nws mus rau hauv lub cev nco thiab muab tso rau hauv ib lub rooj tshwj xeeb. Yog tias tsis muaj qhov qhib dawb, tom qab ntawd ib qho ntawm cov nplooj ntawv yav dhau los tau muab luam tawm rau hauv disk, thiab qhov xav tau yuav siv nws qhov chaw. Cov txheej txheem no, uas peb yuav rov qab los sai sai, hu ua swapping. Daim duab hauv qab no qhia txog cov txheej txheem tau piav qhia. Ntawm nws, nplooj ntawv A nrog qhov chaw nyob 0 tau thauj khoom thiab muab tso rau ntawm nplooj ntawv nco tseem ceeb nrog qhov chaw nyob 4. Qhov tseeb no tau tshwm sim hauv daim ntawv xov xwm hauv xov tooj ntawm tes 0.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Zaj dab neeg yog tib yam nrog cov ntaub ntawv mapped rau nco. Logically, lawv yog supposedly tsis tu ncua thiab tag nrho nyob rau hauv lub virtual chaw nyob. Txawm li cas los xij, lawv nkag mus rau nplooj ntawv lub cim xeeb ntawm nplooj ntawv thiab tsuas yog thaum thov. Kev hloov kho ntawm cov nplooj ntawv no yog synchronized nrog cov ntaub ntawv ntawm disk. Nyob rau hauv txoj kev no, koj tuaj yeem ua cov ntaub ntawv I / O los ntawm kev ua haujlwm nrog bytes hauv nco - txhua qhov kev hloov pauv yuav raug xa mus los ntawm lub operating system kernel rau cov ntaub ntawv.

Cov duab hauv qab no qhia tau tias yuav ua li cas LMDB synchronizes nws lub xeev thaum ua haujlwm nrog cov ntaub ntawv los ntawm cov txheej txheem sib txawv. Los ntawm daim ntawv qhia lub cim xeeb virtual ntawm cov txheej txheem sib txawv rau tib cov ntaub ntawv, peb de facto yuam kev khiav hauj lwm rau transitively synchronize tej blocks ntawm lawv qhov chaw nyob nrog ib leeg, qhov twg LMDB saib.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Ib qho tseem ceeb nuance yog tias LMDB, los ntawm lub neej ntawd, hloov cov ntaub ntawv los ntawm kev sau cov txheej txheem hu xov tooj, thiab qhia cov ntaub ntawv nws tus kheej hauv hom nyeem nkaus xwb. Txoj kev no muaj ob yam tseem ceeb.

Thawj qhov tshwm sim yog tshwm sim rau txhua qhov kev khiav haujlwm. Nws cov ntsiab lus yog ntxiv kev tiv thaiv kev puas tsuaj rau cov ntaub ntawv los ntawm cov cai tsis raug. Raws li koj paub, cov lus qhia ua tiav ntawm cov txheej txheem yog pub dawb nkag mus rau cov ntaub ntawv los ntawm txhua qhov chaw hauv nws qhov chaw nyob. Tib lub sijhawm, raws li peb tsuas yog nco qab, tso tawm cov ntaub ntawv hauv hom nyeem-sau txhais tau tias txhua qhov kev qhia tuaj yeem hloov kho nws. Yog tias nws ua qhov no los ntawm kev ua yuam kev, sim, piv txwv li, txhawm rau sau qhov array ntawm qhov tsis muaj qhov ntsuas, ces nws tuaj yeem hloov pauv cov ntaub ntawv tau kos npe rau qhov chaw nyob, uas yuav ua rau kev noj nyiaj txiag ntawm cov ntaub ntawv. Yog tias cov ntaub ntawv tau tshwm sim hauv hom nyeem nkaus xwb, ces qhov kev sim hloov qhov chaw nyob sib xws yuav ua rau muaj kev kub ntxhov ntawm qhov kev pab cuam nrog lub teeb liab SIGSEGV, thiab cov ntaub ntawv yuav nyob twj ywm.

Qhov thib ob lub txim yog twb tshwj xeeb rau iOS no. Tsis yog tus sau lossis lwm qhov chaw qhia meej meej, tab sis yog tsis muaj nws LMDB yuav tsis haum rau kev khiav ntawm lub xov tooj ntawm tes no. Tshooj tom ntej yog mob siab rau nws qhov kev txiav txim siab.

Qhov tshwj xeeb ntawm cov ntaub ntawv nco-mapped hauv iOS

Muaj ib daim ntawv tshaj tawm zoo ntawm WWDC xyoo 2018 "iOS Memory Deep Dive". Nws qhia peb tias hauv iOS no, txhua nplooj ntawv nyob rau hauv lub cev nco yog ib qho ntawm 3 hom: qias neeg, compressed thiab huv si.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Lub cim xeeb huv yog ib qho kev sau ntawm nplooj ntawv uas tuaj yeem raug tshem tawm ntawm lub cev tsis nco qab. Cov ntaub ntawv uas lawv muaj tuaj yeem rov qab tau raws li xav tau los ntawm nws qhov chaw qub. Nyeem-tsuas nco-mapped cov ntaub ntawv poob rau hauv pawg no. iOS tsis ntshai unload cov nplooj ntawv mapped rau ib cov ntaub ntawv los ntawm lub cim xeeb txhua lub sij hawm, txij li thaum lawv tau guaranteed synchronized nrog cov ntaub ntawv ntawm disk.

Txhua nplooj ntawv hloov kho xaus rau hauv lub cim xeeb qias neeg, txawm tias lawv nyob qhov twg los xij. Tshwj xeeb, nco-mapped cov ntaub ntawv hloov kho los ntawm kev sau ntawv mus rau lub cim xeeb virtual cuam tshuam nrog lawv yuav raug cais raws li qhov no. Qhib LMDB nrog chij MDB_WRITEMAP, tom qab hloov pauv rau nws, koj tuaj yeem txheeb xyuas qhov no tus kheej ..

Thaum daim ntawv thov pib noj ntau dhau lub cev nco, iOS raug rau nws kom qias nplooj compression. Tag nrho lub cim xeeb nyob los ntawm cov nplooj ntawv qias neeg thiab compressed yog daim ntawv thov hu ua nco hneev taw. Thaum nws nce mus txog tus nqi pib, OOM killer system daemon los tom qab tus txheej txheem thiab yuam nws txiav. Qhov no yog qhov peculiarity ntawm iOS piv rau desktop operating systems. Nyob rau hauv sib piv, txo lub cim xeeb hneev taw los ntawm swapping nplooj ntawv los ntawm lub cev nco mus rau disk yog tsis muab rau hauv iOS no, vim li cas tsuas yog guessed ntawm. Tej zaum cov txheej txheem ntawm kev txav cov nplooj ntawv mus rau disk thiab rov qab yog siv zog heev rau cov khoom siv txawb, lossis iOS khaws cov peev txheej ntawm kev sau cov hlwb ntawm SSD drives, lossis tej zaum cov neeg tsim qauv tsis txaus siab rau tag nrho cov kev ua tau zoo ntawm lub kaw lus, qhov twg txhua yam yog. tsis tu ncua swapped. Ua li ntawd, qhov tseeb tseem yog qhov tseeb.

Cov xov xwm zoo, twb tau hais ua ntej lawm, yog tias LMDB los ntawm lub neej ntawd tsis siv mmap mechanism los hloov kho cov ntaub ntawv. Qhov no txhais tau hais tias cov ntaub ntawv tso tawm tau muab cais los ntawm iOS ua lub cim xeeb huv thiab tsis ua rau lub cim xeeb hneev taw. Koj tuaj yeem txheeb xyuas qhov no siv lub cuab yeej Xcode hu ua VM Tracker. Lub screenshot hauv qab no qhia txog lub xeev ntawm iOS virtual nco ntawm huab thov thaum ua haujlwm. Thaum pib, 2 LMDB piv txwv tau pib hauv nws. Thawj tau tso cai los tso saib nws cov ntaub ntawv ntawm 1GiB ntawm lub cim xeeb virtual, qhov thib ob - 512MiB. Txawm hais tias qhov tseeb tias ob qho tib si khaws cia muaj qee yam ntawm cov neeg nyob hauv lub cim xeeb, ob leeg ntawm lawv tsis ua rau qias neeg loj.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Thiab tam sim no nws yog lub sijhawm rau xov xwm phem. Ua tsaug rau kev sib pauv tshuab hauv 64-ntsis desktop operating systems, txhua tus txheej txheem tuaj yeem tuav ntau qhov chaw nyob virtual raws li qhov chaw hard disk dawb rau nws qhov peev xwm sib pauv tau tso cai. Hloov pauv nrog compression hauv iOS radically txo qhov siab tshaj plaws theoretical. Tam sim no tag nrho cov txheej txheem nyob yuav tsum haum rau hauv lub ntsiab (nyeem RAM) nco, thiab tag nrho cov uas tsis haum yuav tsum raug yuam kom xaus. Qhov no tau hais raws li cov lus hais saum toj no qhia, thiab nyob rau hauv cov ntaub ntawv raug cai. Raws li qhov tshwm sim, iOS tau txwv tsis pub muaj lub cim xeeb rau kev faib tawm ntawm mmap. Ntawm no S, SѓS, Koj tuaj yeem saib cov kev txwv tsis pub muaj peev xwm ntawm lub cim xeeb uas tuaj yeem muab faib rau ntawm cov khoom siv sib txawv siv qhov kev hu xov tooj no. Ntawm cov qauv niaj hnub niaj hnub tshaj plaws, iOS tau dhau los ua siab dav los ntawm 2 gigabytes, thiab nyob rau sab saum toj versions ntawm iPad - los ntawm 4. Nyob rau hauv kev xyaum, tau kawg, koj yuav tsum tsom mus rau qhov qis tshaj kev txhawb nqa ntaus ntawv qauv, qhov twg txhua yam yog tu siab heev. Txawm li cas los xij, los ntawm kev saib daim ntawv thov lub cim xeeb hauv VM Tracker, koj yuav pom tias LMDB nyob deb ntawm qhov tsuas yog thov kev nco-mapped nco. Cov chunks zoo raug noj tam sim ntawd los ntawm cov neeg faib khoom, cov ntaub ntawv peev txheej, cov duab kos duab, thiab lwm cov tsiaj me me.

Raws li cov txiaj ntsig ntawm kev sim hauv Huab, peb tuaj rau cov txiaj ntsig hauv qab no rau lub cim xeeb faib los ntawm LMDB: 384 megabytes rau 32-ntsis li thiab 768 rau 64-ntsis li. Tom qab siv cov ntim no, txhua qhov kev hloov kho pib xaus nrog cov cai MDB_MAP_FULL. Peb saib cov kev ua yuam kev no hauv peb txoj kev saib xyuas, tab sis lawv tsawg txaus uas nyob rau theem no lawv tuaj yeem tsis quav ntsej.

Ib qho laj thawj tsis meej rau kev nco ntau dhau los ntawm kev khaws cia tuaj yeem ua haujlwm ntev. Txhawm rau kom nkag siab tias ob qhov xwm txheej no txuas nrog li cas, peb yuav tau txais kev pab los ntawm kev xav txog ob qho tseem ceeb ntawm LMDB.

3.2. Whale #2. B+- tsob ntoo

Txhawm rau ua raws li cov lus saum toj kawg nkaus ntawm qhov tseem ceeb-tus nqi khaws cia, cov haujlwm hauv qab no yuav tsum muaj nyob hauv nws API:

  1. Ntxig lub ntsiab lus tshiab.
  2. Nrhiav ib lub ntsiab nrog ib tus yuam sij muab.
  3. Tshem tawm ib lub ntsiab.
  4. Iterate hla ntu ntawm cov yuam sij hauv qhov kev txiav txim lawv tau txheeb.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thovCov ntaub ntawv yooj yim tshaj plaws uas tuaj yeem yooj yim siv tag nrho plaub txoj haujlwm yog binary tshawb nrhiav ntoo. Txhua qhov ntawm nws cov nodes sawv cev rau tus yuam sij uas faib tag nrho cov subset ntawm tus me nyuam yuam sij rau hauv ob lub subtrees. Sab laug muaj cov uas me dua niam txiv, thiab sab xis muaj cov uas loj dua. Tau txais ib qho yuam sij yuam kev tau ua tiav los ntawm ib qho ntawm cov ntoo traversals

Binary ntoo muaj ob qho kev tsis zoo uas tiv thaiv lawv los ntawm kev ua haujlwm zoo li cov ntaub ntawv disk-raws li qauv. Ua ntej, qhov degree ntawm lawv qhov nyiaj tshuav yog unpredictable. Muaj kev pheej hmoo loj heev ntawm kev tau txais cov ntoo uas qhov siab ntawm cov ceg sib txawv tuaj yeem sib txawv heev, uas ua rau muaj kev cuam tshuam loj heev ntawm kev tshawb nrhiav algorithmic piv rau qhov xav tau. Qhov thib ob, qhov ntau ntawm kev sib txuas ntawm cov nodes deprives binary ntoo ntawm qhov chaw hauv lub cim xeeb. Kaw nodes (nyob rau hauv cov nqe lus ntawm kev sib txuas ntawm lawv) tuaj yeem nyob rau ntawm nplooj ntawv sib txawv hauv lub cim xeeb virtual. Raws li qhov tshwm sim, txawm tias ib qho yooj yim traversal ntawm ob peb tus neeg nyob sib ze nyob rau hauv ib tsob ntoo tej zaum yuav xav tau mus xyuas cov nplooj ntawv sib piv. Qhov no yog ib qho teeb meem txawm tias thaum peb tham txog qhov ua tau zoo ntawm cov ntoo binary raws li cov ntaub ntawv hauv lub cim xeeb, txij li kev hloov cov nplooj ntawv nyob rau hauv lub processor cache tsis yog pheej yig txaus siab. Thaum nws los txog rau nquag retrieving nplooj ntawv cuam tshuam nrog nodes los ntawm disk, qhov teeb meem ua kiag li zoo siab.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thovB-ntoo, ua ib qho kev hloov pauv ntawm cov ntoo binary, daws cov teeb meem uas tau txheeb xyuas hauv kab lus dhau los. Ua ntej, lawv yog tus kheej ntsuas. Qhov thib ob, txhua tus ntawm lawv cov nodes faib cov txheej txheem ntawm tus me nyuam yuam sij tsis yog 2, tab sis rau hauv M xaj subsets, thiab tus naj npawb M tuaj yeem loj heev, ntawm qhov kev txiav txim ntawm ntau pua, lossis ntau txhiab.

Li no:

  1. Txhua lub node muaj ntau tus yuam sij uas twb tau xaj lawm thiab cov ntoo luv heev.
  2. Cov ntoo tau txais cov cuab yeej ntawm thaj chaw ntawm qhov chaw nyob hauv lub cim xeeb, txij li cov yuam sij uas nyob ze ntawm tus nqi yog ib txwm nyob ib sab ntawm ib leeg ntawm tib lossis cov neeg nyob sib ze.
  3. Tus naj npawb ntawm cov kev thauj mus los thaum nqis ib tsob ntoo thaum lub sijhawm tshawb nrhiav raug txo qis.
  4. Tus naj npawb ntawm cov hom phiaj tau nyeem thaum cov lus nug ntau raug txo, vim lawv txhua tus twb muaj ntau tus yuam sij xaj.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

LMDB siv qhov hloov pauv ntawm B-ntoo hu ua B + tsob ntoo los khaws cov ntaub ntawv. Daim duab saum toj no qhia peb hom nodes uas muaj nyob hauv nws:

  1. Nyob rau sab saum toj yog lub hauv paus. Nws materializes tsis muaj dab tsi ntau tshaj li lub tswv yim ntawm ib tug database nyob rau hauv lub warehouse. Hauv ib qho piv txwv LMDB, koj tuaj yeem tsim ntau lub databases uas qhia qhov chaw nyob virtual. Txhua tus ntawm lawv pib los ntawm nws tus kheej hauv paus.
  2. Nyob rau theem qis tshaj yog nplooj. Lawv thiab tsuas yog lawv muaj cov khub tseem ceeb-tus nqi khaws cia hauv cov ntaub ntawv. Los ntawm txoj kev, qhov no yog qhov peculiarity ntawm B +-ntoo. Yog tias B-ntoo niaj hnub khaws cov khoom muaj nqis hauv cov nodes ntawm txhua qib, ces B + kev hloov pauv tsuas yog nyob rau qis tshaj. Tau kho qhov tseeb no, peb yuav txuas ntxiv hu rau subtype ntawm tsob ntoo siv hauv LMDB tsuas yog B-ntoo.
  3. Nruab nrab ntawm cov hauv paus hniav thiab nplooj muaj 0 los yog ntau tshaj cov txheej txheem nrog navigational (ceg) nodes. Lawv txoj haujlwm yog los faib cov txheej txheem ntawm cov yuam sij nruab nrab ntawm nplooj.

Lub cev, nodes yog blocks ntawm lub cim xeeb ntawm ib tug predetermined ntev. Lawv qhov loj me yog ntau qhov loj me ntawm cov nplooj ntawv nco hauv lub operating system, uas peb tau tham saum toj no. Cov qauv node tau qhia hauv qab no. Lub header muaj cov ntaub ntawv meta, qhov pom tseeb tshaj plaws ntawm qhov piv txwv yog checksum. Tom ntej no yog cov ntaub ntawv hais txog cov offsets uas cov hlwb nrog cov ntaub ntawv nyob. Cov ntaub ntawv tuaj yeem yog tus yuam sij, yog tias peb tab tom tham txog cov kev taw qhia, lossis tag nrho qhov tseem ceeb-tus khub nyob rau hauv rooj plaub ntawm nplooj.​ Koj tuaj yeem nyeem ntxiv txog cov qauv ntawm nplooj ntawv hauv kev ua haujlwm. "Kev ntsuam xyuas ntawm Cov Kev Ua Haujlwm Zoo Tshaj Plaws-Value Stores".

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Tom qab hais txog cov ntsiab lus sab hauv ntawm nplooj ntawv nodes, peb yuav ntxiv sawv cev rau LMDB B-ntoo hauv qhov yooj yim hauv daim ntawv hauv qab no.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Cov nplooj ntawv nrog cov nodes yog nyob ua ntu zus ntawm disk. Cov nplooj ntawv uas muaj lej ntau dua yog nyob rau ntawm qhov kawg ntawm cov ntaub ntawv. Cov nplooj ntawv hu ua meta muaj cov ntaub ntawv hais txog cov offsets uas cov hauv paus hniav ntawm txhua tsob ntoo tuaj yeem pom. Thaum qhib cov ntaub ntawv, LMDB scans nplooj ntawv nplooj ntawv los ntawm nplooj ntawv kawg mus rau qhov pib hauv kev tshawb nrhiav nplooj ntawv meta siv tau thiab los ntawm nws pom cov ntaub ntawv uas twb muaj lawm.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Tam sim no, muaj ib lub tswv yim ntawm cov kev xav thiab lub cev qauv ntawm cov ntaub ntawv lub koom haum, peb tuaj yeem txav mus los xav txog tus ncej thib peb ntawm LMDB. Nws yog nrog nws cov kev pab hais tias tag nrho cov kev hloov kho cia tshwm sim pauv thiab nyob rau hauv kev sib cais los ntawm ib leeg, muab cov ntaub ntawv raws li tag nrho cov cuab yeej ntawm multiversion.

3.3. Whale #3. Copy-on-write

Qee qhov kev ua haujlwm B-ntoo cuam tshuam nrog kev hloov pauv rau nws cov nodes. Ib qho piv txwv yog ntxiv tus yuam sij tshiab rau lub node uas twb tau mus txog nws lub peev xwm siab tshaj plaws. Nyob rau hauv rooj plaub no, nws yog ib qho tsim nyog, ua ntej, faib cov node rau hauv ob, thiab thib ob, ntxiv ib qhov txuas mus rau qhov tshiab budding me nyuam ntawm nws niam nws txiv. Cov txheej txheem no muaj peev xwm txaus ntshai heev. Yog tias vim qee yam (kev sib tsoo, hluav taws xob hluav taws xob, thiab lwm yam) tsuas yog ib feem ntawm cov kev hloov pauv ntawm cov koob tshwm sim, ces tsob ntoo yuav nyob twj ywm hauv lub xeev tsis sib haum.

Ib qho kev daws teeb meem rau kev ua cov ntaub ntawv tsis raug cai yog txhawm rau ntxiv cov ntaub ntawv ntxiv ntawm cov ntaub ntawv ntawm ib sab ntawm B-ntoo - kev sib pauv log, tseem hu ua kev sau ua ntej (WAL). Nws yog cov ntaub ntawv kawg ntawm qhov kev npaj ua haujlwm yog sau nruj me ntsis ua ntej hloov kho B-ntoo nws tus kheej. Yog li, yog tias cov ntaub ntawv kev noj nyiaj txiag raug kuaj pom thaum kuaj tus kheej, cov ntaub ntawv tau sab laj nrog lub cav kom muab nws tus kheej tso rau hauv kev txiav txim.

LMDB tau xaiv ib txoj kev sib txawv raws li kev ua txhaum cai, hu ua luam-on-sau. Nws lub ntsiab lus yog tias tsis yog hloov kho cov ntaub ntawv ntawm nplooj ntawv uas twb muaj lawm, nws thawj zaug luam nws tag nrho thiab ua txhua yam kev hloov kho hauv daim ntawv theej.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Tom ntej no, txhawm rau kom cov ntaub ntawv hloov tshiab kom muaj, nws yog ib qho tsim nyog yuav tsum tau hloov qhov txuas mus rau qhov node uas tau dhau los ua tam sim no hauv nws cov niam txiv node. Txij li thaum nws tseem yuav tsum tau hloov kho rau qhov no, nws kuj tseem tau theej ua ntej. Cov txheej txheem txuas ntxiv recursively tag nrho txoj kev mus rau hauv paus. Qhov kawg uas yuav hloov pauv yog cov ntaub ntawv ntawm nplooj ntawv meta.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Yog tias mam li nco dheev cov txheej txheem sib tsoo thaum lub sijhawm hloov tshiab, tom qab ntawd ib nplooj ntawv meta tshiab yuav tsis raug tsim, lossis nws yuav tsis sau rau disk tag, thiab nws cov tshev yuav tsis raug. Hauv ob qho xwm txheej no, nplooj ntawv tshiab yuav tsis tuaj yeem ncav cuag, tab sis cov qub yuav tsis cuam tshuam. Qhov no tshem tawm qhov xav tau rau LMDB los sau ua ntej cov ntaub ntawv kom tswj tau cov ntaub ntawv sib xws. Raws li qhov tseeb, cov qauv ntawm cov ntaub ntawv khaws cia ntawm lub disk tau piav qhia saum toj no ib txhij siv nws txoj haujlwm. Qhov tsis muaj daim ntawv teev npe tsis meej yog ib qho ntawm cov yam ntxwv ntawm LMDB uas muab cov ntaub ntawv nyeem ceev ceev.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Tus tsim tsim, hu ua append-tsuas yog B-ntoo, ib txwm muab kev rho tawm kev rho tawm thiab ntau qhov hloov pauv. Hauv LMDB, txhua qhov kev sib pauv qhib tau cuam tshuam nrog cov cag ntoo tam sim no. Kom txog rau thaum qhov kev hloov pauv tiav lawm, nplooj ntawv ntawm tsob ntoo cuam tshuam nrog nws yuav tsis raug hloov lossis rov siv dua tshiab rau cov ntaub ntawv tshiab. Yog li, koj tuaj yeem ua haujlwm ntev npaum li koj nyiam nrog raws nraim cov ntaub ntawv uas cuam tshuam rau lub sijhawm. qhov kev hloov pauv tau qhib, txawm tias qhov chaw khaws cia tseem yuav hloov kho tam sim no. Qhov no yog qhov tseem ceeb ntawm kev sib txawv, ua LMDB yog qhov zoo tshaj plaws cov ntaub ntawv rau peb tus hlub UICollectionView. Tau qhib kev lag luam, tsis tas yuav ua kom lub cim xeeb hneev taw ntawm daim ntawv thov los ntawm maj nrawm tso tawm cov ntaub ntawv tam sim no rau hauv qee qhov qauv hauv nco, vim ntshai tsis muaj dab tsi. Qhov no feature txawv LMDB los ntawm tib SQLite, uas tsis tuaj yeem khav ntawm tag nrho cov kev sib cais. Tau qhib ob qho kev lag luam nyob rau tom kawg thiab tshem tawm qee cov ntaub ntawv nyob rau hauv ib qho ntawm lawv, nws yuav tsis tuaj yeem tau txais tib cov ntaub ntawv nyob rau hauv qhov thib ob seem.

Qhov ntxeev sab ntawm lub npib yog qhov muaj peev xwm ua tau ntau dua ntawm kev nco virtual. Cov swb qhia tau hais tias cov qauv database yuav zoo li cas yog tias nws hloov kho ib txhij nrog 3 qhib kev hloov pauv hloov pauv saib ntawm cov qauv sib txawv ntawm cov ntaub ntawv. Txij li thaum LMDB tsis tuaj yeem rov siv cov nodes tuaj yeem ncav cuag los ntawm cov hauv paus hniav cuam tshuam nrog kev hloov pauv tam sim no, lub khw tsis muaj kev xaiv tab sis faib lwm lub hauv paus plaub hauv kev nco thiab ib zaug ntxiv clone cov nplooj ntawv hloov kho hauv qab nws.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Ntawm no nws yuav pab tau kom rov qab tau cov seem ntawm cov ntaub ntawv nco-mapped. Nws zoo nkaus li tias kev noj ntxiv ntawm lub cim xeeb virtual yuav tsum tsis txhob txhawj xeeb peb ntau, vim nws tsis ua rau lub cim xeeb hneev taw ntawm daim ntawv thov. Txawm li cas los xij, tib lub sijhawm, nws tau sau tseg tias iOS yog qhov tsis txaus ntseeg hauv kev faib nws, thiab peb tsis tuaj yeem, zoo li ntawm lub server lossis desktop, muab thaj tsam LMDB ntawm 1 terabyte thiab tsis xav txog qhov no txhua. Yog tias ua tau, koj yuav tsum sim ua kom lub neej ntawm kev hloov pauv kom luv li sai tau.

4. Tsim cov ntaub ntawv schema nyob rau sab saum toj ntawm qhov tseem ceeb-tus nqi API

Cia peb pib peb qhov kev tshuaj ntsuam API los ntawm kev saib cov ntsiab lus tsis txaus ntseeg muab los ntawm LMDB: ib puag ncig thiab cov ntaub ntawv, cov yuam sij thiab cov txiaj ntsig, kev hloov pauv thiab tus cursors.

Ib daim ntawv qhia txog cov npe code

Tag nrho cov haujlwm hauv pej xeem LMDB API rov qab los ntawm lawv txoj haujlwm hauv daim ntawv yuam kev, tab sis nyob rau hauv tag nrho cov npe tom qab nws cov ntaub ntawv pov thawj raug tshem tawm vim qhov kev ua txhaum cai. diav rawg C++ wrappers lmdx ib, nyob rau hauv uas yuam kev yog materialized li C ++ kev zam.

Raws li txoj kev ceev tshaj plaws los txuas LMDB rau ib qhov project rau iOS lossis macOS, kuv xav kom kuv CocoaPod POSLMDB.

4.1. Basic abstractions

Ib puag ncig

Qauv MDB_env yog lub chaw cia khoom ntawm lub xeev sab hauv ntawm LMDB. Tsev neeg ua haujlwm ua ntej mdb_env tso cai rau koj los teeb tsa qee yam ntawm nws cov khoom. Hauv qhov yooj yim tshaj plaws, lub cav pib pib zoo li qhov no.

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

Hauv daim ntawv thov Mail.ru Cloud, peb tau hloov pauv qhov tseem ceeb ntawm ob qhov kev txwv.

Thawj yog qhov loj ntawm qhov chaw nyob virtual uas cov ntaub ntawv khaws cia yog mapped rau. Hmoov tsis zoo, txawm tias ntawm tib lub cuab yeej, tus nqi tshwj xeeb tuaj yeem sib txawv los ntawm kev khiav mus rau kev khiav. Txhawm rau coj cov yam ntxwv ntawm iOS no mus rau hauv tus account, qhov siab tshaj plaws cia ntim yog xaiv dynamically. Pib los ntawm ib qho nqi, nws yog sequentially halved kom txog thaum muaj nuj nqi mdb_env_open yuav tsis rov qab qhov tshwm sim txawv ntawm ENOMEM. Hauv txoj kev xav, kuj tseem muaj qhov sib txawv - thawj zaug faib qhov tsawg kawg nkaus ntawm lub cim xeeb rau lub cav, thiab tom qab ntawd, thaum tau txais qhov yuam kev, MDB_MAP_FULL, nce. Txawm li cas los xij, nws yog ntau thorny. Qhov laj thawj yog vim li cas cov txheej txheem rau rov faib lub cim xeeb (remap) siv cov haujlwm mdb_env_set_map_size invalidates tag nrho cov chaw (cursors, muas, yuam sij thiab qhov tseem ceeb) yav tas los tau txais los ntawm lub cav. Kev coj cov xwm txheej no mus rau hauv tus account hauv cov cai yuav ua rau nws muaj teeb meem loj. Yog tias, txawm li cas los xij, lub cim xeeb virtual tseem ceeb heev rau koj, ces qhov no yuav yog qhov laj thawj uas yuav tsum ua tib zoo saib ntawm rab rawg uas tau mus deb dhau los. MDBX, qhov twg ntawm cov tshaj tawm nta muaj "automatic on-the-fly database hloov loj".

Qhov thib ob parameter, lub neej ntawd tus nqi uas tsis haum rau peb, tswj cov mechanics ntawm kev ruaj ntseg xov. Hmoov tsis zoo, yam tsawg kawg iOS 10 muaj teeb meem nrog kev txhawb nqa xov hauv zos cia. Vim li no, hauv qhov piv txwv saum toj no, lub chaw cia khoom qhib nrog tus chij MDB_NOTLS. Ntxiv rau qhov no, kuj tseem tsim nyog diav rawg C++ wrapper lmdx ibtxiav tawm qhov sib txawv nrog tus cwj pwm no thiab hauv nws.

Databases

Cov ntaub ntawv yog ib qho piv txwv B-ntoo, uas peb tau tham saum toj no. Nws qhib tshwm sim hauv kev lag luam, uas tej zaum yuav zoo li txawv me ntsis thaum xub thawj.

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

Tseeb tiag, kev hloov pauv hauv LMDB yog qhov chaw khaws cia, tsis yog qhov chaw tshwj xeeb database. Lub tswv yim no tso cai rau koj los ua cov haujlwm atomic ntawm cov chaw nyob hauv cov ntaub ntawv sib txawv. Nyob rau hauv txoj kev xav, qhov no qhib tau qhov ua qauv ntawm cov ntxhuav hauv daim ntawv ntawm cov ntaub ntawv sib txawv, tab sis ib zaug kuv coj txoj kev sib txawv, tau piav qhia hauv qab no.

Cov yuam sij thiab qhov tseem ceeb

Qauv MDB_val qauv lub tswv yim ntawm ob qho tseem ceeb thiab tus nqi. Lub repository tsis muaj tswv yim txog lawv cov semantics. Rau nws, ib yam dab tsi ntxiv tsuas yog ib qho array ntawm bytes ntawm qhov loj me. Qhov loj tshaj qhov tseem ceeb yog 512 bytes.

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

Siv tus sib piv, lub khw muag cov yuam sij hauv kev nce qib. Yog tias koj tsis hloov nws nrog koj tus kheej, ces lub neej ntawd yuav raug siv, uas xaiv lawv byte-by-byte hauv lexicographic kev txiav txim.

Kev Sib Tham

Cov qauv kev lag luam tau piav qhia meej hauv tshooj dhau los, yog li ntawm no kuv yuav luv luv rov hais dua lawv cov khoom tseem ceeb:

  1. Txhawb nqa tag nrho cov cuab yeej yooj yim acid: atomicity, sib xws, kev sib cais thiab kev ntseeg tau. Kuv tsis tuaj yeem pab tab sis nco ntsoov tias muaj kab laum hais txog kev ua haujlwm ntev ntawm macOS thiab iOS uas tau kho hauv MDBX. Koj tuaj yeem nyeem ntxiv hauv lawv NYEEM.
  2. Txoj hauv kev rau kev sib txuas lus ntau yog piav qhia los ntawm "ib tus kws sau ntawv / ntau tus nyeem ntawv". Cov kws sau ntawv thaiv ib leeg, tab sis tsis txhob thaiv cov neeg nyeem. Cov neeg nyeem tsis thaiv cov neeg sau ntawv lossis ib leeg.
  3. Kev them nyiaj yug rau nested muas.
  4. Kev them nyiaj yug Multiversion.

Multiversion hauv LMDB yog qhov zoo heev uas kuv xav ua kom pom nws hauv kev nqis tes ua. Los ntawm cov cai hauv qab no koj tuaj yeem pom tias txhua qhov kev hloov pauv ua haujlwm nrog cov qauv ntawm cov ntaub ntawv tam sim no thaum lub sijhawm qhib, raug cais tawm tag nrho los ntawm txhua qhov kev hloov pauv tom ntej. Pib qhov kev khaws cia thiab ntxiv cov ntaub ntawv xeem rau nws tsis sawv cev rau ib yam dab tsi nthuav, yog li cov kev cai dab qhuas no raug tso tseg nyob rau hauv lub spoiler.

Ntxiv qhov kev xeem nkag

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

Kuv xav kom koj sim tib yam ua kom yuam kev nrog SQLite thiab pom tias muaj dab tsi tshwm sim.

Multiversion nqa cov txiaj ntsig zoo heev rau lub neej ntawm tus tsim tawm iOS. Siv cov cuab yeej no, koj tuaj yeem yooj yim thiab hloov kho tus nqi hloov tshiab ntawm cov ntaub ntawv los ntawm cov ntawv tshuaj ntsuam, raws li cov neeg siv kev xav txog. Piv txwv li, cia peb ua ib qho feature ntawm Mail.ru Cloud daim ntawv thov xws li autoloading cov ntsiab lus los ntawm qhov system media gallery. Nrog rau kev sib txuas zoo, tus neeg siv khoom muaj peev xwm ntxiv ntau cov duab ib ob rau lub server. Yog tias koj hloov kho tom qab txhua qhov rub tawm UICollectionView nrog cov ntsiab lus tawm hauv cov neeg siv huab, koj tuaj yeem hnov ​​​​qab txog 60 fps thiab du scrolling thaum tus txheej txheem no. Txhawm rau tiv thaiv kev hloov pauv ntau zaus, koj yuav tsum txwv tus nqi ntawm cov ntaub ntawv hloov pauv hauv qab UICollectionViewDataSource.

Yog tias cov ntaub ntawv tsis txhawb nqa ntau yam thiab tso cai rau koj ua haujlwm tsuas yog nrog lub xeev tam sim no, tom qab ntawd los tsim lub sijhawm ruaj khov snapshot ntawm cov ntaub ntawv koj yuav tsum luam nws mus rau qee cov ntaub ntawv hauv lub cim xeeb lossis rau lub rooj ib ntus. Ib qho ntawm cov txheej txheem no yog kim heev. Nyob rau hauv cov ntaub ntawv ntawm lub cim xeeb cia, peb tau txais cov nqi ob qho tib si hauv lub cim xeeb, tshwm sim los ntawm kev khaws cov khoom tsim, thiab nyob rau hauv lub sij hawm, txuam nrog redundant ORM transformations. Raws li rau lub rooj ib ntus, qhov no yog qhov zoo siab dua, ua rau kev nkag siab tsuas yog hauv cov xwm txheej tsis tseem ceeb.

LMDB's multiversion solution daws qhov teeb meem ntawm kev tswj cov ntaub ntawv ruaj khov hauv txoj kev zoo nkauj heev. Nws txaus tsuas yog qhib kev lag luam thiab voila - kom txog thaum peb ua tiav, cov ntaub ntawv teeb tsa tau lees tias yuav kho. Lub logic rau nws qhov hloov tshiab ceev yog tam sim no nkaus rau hauv tes ntawm txheej nthuav qhia, tsis muaj nyiaj siv ua haujlwm tseem ceeb.

Tus cursor

Cursors muab cov txheej txheem rau kev txiav txim siab dua qhov tseem ceeb-tus khub los ntawm B-ntoo traversal. Yog tsis muaj lawv, nws yuav tsis yooj yim sua kom ua qauv zoo rau cov ntxhuav hauv cov ntaub ntawv, uas peb tam sim no tig mus.

4.2. Table Modeling

Cov cuab yeej ntawm qhov kev txiav txim tseem ceeb tso cai rau koj los tsim cov kev xav tau siab xws li lub rooj nyob rau sab saum toj ntawm cov ntsiab lus abstractions. Cia peb xav txog cov txheej txheem no siv cov piv txwv ntawm cov lus tseem ceeb ntawm cov neeg siv huab, uas khaws cov ntaub ntawv hais txog tag nrho cov neeg siv cov ntaub ntawv thiab cov folders.

Table schema

Ib qho ntawm cov xwm txheej zoo sib xws uas cov qauv rooj nrog cov ntoo nplaub tshev yuav tsum tau ua kom haum yog kev xaiv ntawm tag nrho cov ntsiab lus nyob rau hauv ib daim ntawv teev npe. Daim ntawv teev npe. Txhawm rau siv nws nyob rau sab saum toj ntawm qhov tseem ceeb-tus nqi khaws cia, nws yog ib qho tsim nyog los txheeb xyuas cov yuam sij ntawm cov ntaub ntawv thiab cov folders nyob rau hauv xws li ib txoj kev uas lawv tau pab pawg raws li lawv cov tswv cuab hauv cov niam txiv cov npe. Tsis tas li ntawd, txhawm rau tso saib cov ntsiab lus ntawm cov ntawv teev npe hauv daim ntawv paub rau tus neeg siv Windows (thawj folders, tom qab ntawv cov ntaub ntawv, ob qho tib si txheeb cov tsiaj ntawv), nws yog ib qho tsim nyog yuav tsum suav nrog cov teb ntxiv hauv qhov tseem ceeb.

Daim duab hauv qab no qhia tau hais tias, raws li txoj haujlwm ntawm tes, tus sawv cev ntawm cov yuam sij nyob rau hauv daim ntawv ntawm byte array yuav zoo li. Cov bytes nrog tus cim ntawm niam txiv cov npe (liab) tau muab tso ua ntej, tom qab ntawd nrog hom (ntsuab) thiab hauv tus Tsov tus tw nrog lub npe (xiav). xav tau yam. Sequentially traversing yuam sij nrog tib lub npe liab ua rau peb cov txiaj ntsig cuam tshuam hauv qhov kev txiav txim lawv yuav tsum tau muab tso rau hauv tus neeg siv interface (ntawm sab xis), yam tsis tas yuav tsum muaj kev ua haujlwm ntxiv tom qab.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Serializing cov yuam sij thiab qhov muaj nqis

Ntau txoj hauv kev rau serializing cov khoom tau tsim nyob hauv lub ntiaj teb. Txij li thaum peb tsis muaj lwm yam kev xav tau uas tsis yog kev ceev, peb xaiv qhov ceev tshaj plaws rau peb tus kheej - cov pob tseg ntawm lub cim xeeb nyob los ntawm ib qho piv txwv ntawm C hom lus. Yog li, tus yuam sij ntawm cov npe ntawm cov khoom tuaj yeem ua qauv nrog cov qauv hauv qab no. NodeKey.

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

Txuag NodeKey nyob rau hauv cia xav tau nyob rau hauv cov khoom MDB_val tso cov ntaub ntawv pointer mus rau qhov chaw nyob ntawm qhov pib ntawm cov qauv, thiab xam lawv qhov loj me nrog cov haujlwm sizeof.

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

Hauv thawj tshooj ntawm cov txheej txheem xaiv cov ntaub ntawv, kuv tau hais txog kev txo qis kev faib tawm hauv cov haujlwm CRUD ua qhov tseem ceeb xaiv. Function code serialize qhia tau hais tias yuav ua li cas nyob rau hauv rooj plaub ntawm LMDB lawv tuaj yeem zam tag nrho thaum tso cov ntaub ntawv tshiab rau hauv cov ntaub ntawv. Cov khoom siv byte array los ntawm cov neeg rau zaub mov yog thawj zaug hloov mus rau hauv pawg qauv, thiab tom qab ntawd lawv tau muab pov tseg rau hauv qhov chaw cia. Xav tias tseem tsis muaj kev faib tawm hauv LMDB, koj tuaj yeem tau txais qhov xwm txheej zoo heev los ntawm iOS cov qauv - tsuas yog siv pawg nco ua haujlwm nrog cov ntaub ntawv raws tag nrho txoj hauv kev los ntawm lub network mus rau disk!

Ordering yuam sij nrog ib tug binary sib piv

Txoj kev sib raug zoo tseem ceeb yog teev los ntawm lub luag haujlwm tshwj xeeb hu ua tus sib piv. Txij li thaum lub cav tsis paub dab tsi txog cov semantics ntawm cov bytes lawv muaj, lub neej ntawd sib piv tsis muaj kev xaiv tab sis los npaj cov yuam sij hauv lexicographic kev txiav txim, mus rau kev sib piv byte-by-byte. Siv nws los npaj cov qauv yog zoo li shaving nrog ib tug chopping ax. Txawm li cas los xij, hauv cov xwm txheej yooj yim kuv pom cov qauv no siv tau. Lwm txoj hauv kev tau piav qhia hauv qab no, tab sis ntawm no kuv yuav nco ntsoov ob peb rakes tawg mus rau hauv txoj kev no.

Thawj qhov uas yuav tsum nco ntsoov yog lub cim xeeb sawv cev ntawm cov ntaub ntawv keeb kwm yav dhau los. Yog li, ntawm tag nrho cov Apple li, cov lej sib txawv tau muab khaws cia rau hauv hom Maiv Suav Endian. Qhov no txhais tau hais tias qhov tsawg kawg nkaus byte yuav nyob rau sab laug, thiab nws yuav tsis tuaj yeem txheeb cov lej siv qhov sib piv byte-by-byte. Piv txwv li, sim ua qhov no nrog cov lej ntawm 0 txog 511 yuav ua rau cov txiaj ntsig hauv qab no.

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

Txhawm rau daws qhov teeb meem no, cov lej suav yuav tsum tau muab khaws cia rau hauv tus yuam sij hauv ib hom uas haum rau tus sib piv byte-byte. Kev ua haujlwm los ntawm tsev neeg yuav pab koj ua qhov kev hloov pauv tsim nyog hton* (tshwj xeeb htons rau ob-byte tus lej los ntawm qhov piv txwv).

Cov hom ntawv rau sawv cev cov hlua hauv programming yog, raws li koj paub, tag nrho keeb kwm. Yog hais tias lub semantics ntawm cov hlua, nrog rau cov encoding siv los sawv cev rau lawv nyob rau hauv lub cim xeeb, qhia tias tej zaum yuav muaj ntau tshaj li ib byte ib tug cim, ces nws yog zoo dua rau tam sim ntawd tso tseg lub tswv yim ntawm kev siv ib tug default comparator.

Qhov thib ob uas yuav tsum nco ntsoov yog txoj cai kev sib raug zoo qauv teb compiler. Vim yog lawv, bytes nrog cov nqi khib nyiab tuaj yeem tsim nyob rau hauv lub cim xeeb ntawm cov teb, uas, ntawm chav kawm, lov byte-byte sorting. Txhawm rau tshem tawm cov khib nyiab, koj yuav tsum tau tshaj tawm cov teb hauv ib qho kev txiav txim kom nruj, ua raws li cov cai hauv lub siab, lossis siv tus cwj pwm hauv cov qauv tshaj tawm packed.

Kev txiav txim yuam sij nrog rau lwm tus sib piv

Cov ntsiab lus sib piv tseem ceeb yuav nyuaj dhau rau tus sib piv binary. Ib qho ntawm ntau qhov laj thawj yog qhov muaj peev xwm ua haujlwm hauv cov qauv. Kuv yuav piav qhia txog lawv qhov tshwm sim uas siv qhov piv txwv ntawm tus yuam sij rau cov npe uas twb paub lawm.

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

Txawm hais tias nws txoj kev yooj yim, feem ntau ntawm cov neeg mob nws siv ntau lub cim xeeb. Qhov tsis rau lub npe siv li 256 bytes, txawm hais tias qhov nruab nrab ntawm cov ntaub ntawv thiab cov npe folders tsis tshua muaj tshaj 20-30 cim.

Ib qho ntawm cov txheej txheem txheej txheem rau optimizing qhov loj ntawm cov ntaub ntawv yog "luas" nws mus rau qhov loj me. Nws lub ntsiab lus yog tias cov ntsiab lus ntawm txhua qhov sib txawv-ntev teb tau khaws cia hauv qhov tsis sib xws ntawm qhov kawg ntawm cov qauv, thiab lawv qhov ntev yog khaws cia hauv qhov sib txawv sib txawv. Raws li txoj hauv kev no, qhov tseem ceeb. NodeKey yog hloov raws li nram no.

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

Tsis tas li ntawd, thaum serializing, cov ntaub ntawv loj tsis tau teev tseg sizeof tag nrho cov qauv, thiab qhov luaj li cas ntawm tag nrho cov teb yog ib tug taag ntev ntxiv rau qhov loj ntawm qhov tiag tiag siv ib feem ntawm qhov tsis.

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

Raws li qhov tshwm sim ntawm refactoring, peb tau txais kev txuag nyiaj tseem ceeb hauv qhov chaw nyob los ntawm cov yuam sij. Txawm li cas los xij, vim yog qhov chaw technical nameLength, default binary comparator tsis haum rau qhov tseem ceeb sib piv. Yog tias peb tsis hloov nws nrog peb tus kheej, ces qhov ntev ntawm lub npe yuav yog qhov tseem ceeb tshaj plaws hauv kev txheeb xyuas dua lub npe nws tus kheej.

LMDB tso cai rau txhua qhov chaw khaws ntaub ntawv kom muaj nws qhov kev sib piv tseem ceeb. Qhov no yog ua tiav los ntawm kev ua haujlwm mdb_set_compare nruj me ntsis ua ntej qhib. Rau qhov laj thawj pom tseeb, nws tsis tuaj yeem hloov pauv thoob plaws lub neej ntawm cov ntaub ntawv. Tus sib piv tau txais ob tus yuam sij hauv hom binary raws li cov tswv yim, thiab ntawm qhov tso zis nws rov qab qhov kev sib piv: tsawg dua (-1), ntau dua (1) lossis sib npaug rau (0). Pseudocode rau NodeKey zoo li ntawd.

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

Tsuav yog tag nrho cov yuam sij hauv cov ntaub ntawv yog tib hom, tsis muaj kev cuam tshuam los ntawm lawv cov byte sawv cev rau hom ntawv thov cov qauv tseem ceeb yog raug cai. Muaj ib qho nuance ntawm no, tab sis nws yuav tau tham hauv qab no hauv "Nyeem Cov Ntaub Ntawv" ntu ntu.

Serializing tus nqi

LMDB ua haujlwm hnyav heev nrog cov yuam sij ntawm cov ntaub ntawv khaws cia. Lawv kev sib piv nrog rau ib leeg tshwm sim nyob rau hauv lub moj khaum ntawm ib qho kev ua haujlwm, thiab kev ua tau zoo ntawm tag nrho cov kev daws teeb meem yog nyob ntawm qhov ceev ntawm tus sib piv. Nyob rau hauv lub ntiaj teb zoo tagnrho, lub neej ntawd binary sib piv yuav tsum txaus los sib piv cov yuam sij, tab sis yog tias koj yuav tsum siv koj tus kheej, ces cov txheej txheem rau deserializing yuam sij hauv nws yuav tsum ceev li sai tau.

Lub database tsis yog tshwj xeeb tshaj yog xav txog tus nqi ntawm cov ntaub ntawv (tus nqi). Nws hloov dua siab tshiab los ntawm ib tug byte sawv cev rau ib yam khoom tshwm sim tsuas yog thaum nws twb xav tau los ntawm daim ntawv thov code, piv txwv li, tso saib nws ntawm qhov screen. Txij li thaum qhov no tshwm sim tsis tshua muaj, cov kev xav tau ceev rau cov txheej txheem no tsis yog qhov tseem ceeb, thiab hauv nws qhov kev siv peb muaj ntau yam pub dawb los tsom rau qhov yooj yim. Piv txwv li, txhawm rau txheeb xyuas cov metadata txog cov ntaub ntawv uas tseem tsis tau rub tawm, peb siv. NSKeyedArchiver.

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

Txawm li cas los xij, muaj qee lub sijhawm thaum kev ua haujlwm tseem ceeb. Piv txwv li, thaum txuag metainformation txog cov ntaub ntawv qauv ntawm cov neeg siv huab, peb siv tib lub cim xeeb pov tseg ntawm cov khoom. Qhov tseem ceeb ntawm txoj hauj lwm ntawm kev tsim kom muaj ib tug serialized sawv cev ntawm lawv yog qhov tseeb hais tias lub ntsiab ntawm ib tug directory yog qauv los ntawm ib tug hierarchy ntawm cov chav kawm.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Txhawm rau siv nws hauv C hom lus, cov chaw tshwj xeeb ntawm cov qub txeeg qub teg tau muab tso rau hauv cov qauv sib cais, thiab lawv cov kev sib txuas nrog lub hauv paus ib qho tau teev tseg los ntawm ib thaj chaw ntawm hom kev sib koom ua ke. Cov ntsiab lus tseeb ntawm lub koomhaum tau teev tseg los ntawm hom kev ua haujlwm.

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

Ntxiv thiab hloov kho cov ntaub ntawv

Tus yuam sij serialized thiab tus nqi tuaj yeem muab ntxiv rau lub khw. Txhawm rau ua qhov no, siv lub luag haujlwm mdb_put.

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

Thaum lub sijhawm teeb tsa, qhov chaw cia tuaj yeem tso cai lossis txwv tsis pub khaws ntau cov ntaub ntawv nrog tib tus yuam sij.Yog txwv tsis pub luam cov yuam sij, tom qab ntawd thaum tso cov ntaub ntawv, koj tuaj yeem txiav txim siab seb qhov hloov kho cov ntaub ntawv uas twb muaj lawm tso cai lossis tsis tau. Yog tias fraying tsuas yog tshwm sim los ntawm qhov yuam kev hauv cov cai, ces koj tuaj yeem tiv thaiv koj tus kheej los ntawm kev qhia tus chij NOOVERWRITE.

Nyeem ntawv

Txhawm rau nyeem cov ntaub ntawv hauv LMDB, siv cov haujlwm mdb_get. Yog tias tus khub tseem ceeb-tus nqi tau sawv cev los ntawm cov txheej txheem pov tseg yav dhau los, cov txheej txheem no zoo li qhov no.

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

Cov npe uas tau nthuav tawm qhia tau hais tias yuav ua li cas serialization los ntawm cov qauv pov tseg tso cai rau koj kom tshem tawm cov kev faib tawm tsis yog thaum sau ntawv nkaus xwb, tab sis thaum nyeem cov ntaub ntawv. Ua los ntawm kev ua haujlwm mdb_get tus pointer saib raws nraim ntawm lub cim xeeb virtual qhov twg cov ntaub ntawv khaws cov byte sawv cev ntawm cov khoom. Qhov tseeb, peb tau txais ib hom ORM uas muab cov ntaub ntawv siab heev nyeem ntawv yuav luag dawb xwb. Txawm tias tag nrho cov kev zoo nkauj ntawm txoj kev mus kom ze, nws yog ib qho tsim nyog yuav tsum nco ntsoov ntau yam uas cuam tshuam nrog nws.

  1. Rau kev nyeem ntawv nkaus xwb, tus taw tes rau tus nqi qauv yog lav kom nyob twj ywm siv tau tsuas yog kom txog thaum kev sib pauv raug kaw. Raws li tau hais ua ntej, B-ntoo nplooj ntawv uas muaj qhov khoom nyob, ua tsaug rau txoj cai theej-on-sau, tseem tsis hloov pauv yog tias lawv tau hais los ntawm tsawg kawg ib qho kev hloov pauv. Nyob rau tib lub sijhawm, sai li sai tau thaum qhov kev hloov pauv kawg cuam tshuam nrog lawv ua tiav, nplooj ntawv tuaj yeem rov qab siv tau rau cov ntaub ntawv tshiab. Yog tias tsim nyog rau cov khoom kom muaj sia nyob ntawm kev sib pauv uas tsim lawv, ces lawv tseem yuav tsum tau theej.
  2. Rau kev nyeem ntawv sau ua lag luam, tus taw tes rau qhov txiaj ntsig tus qauv yuav siv tau tsuas yog txog thaum thawj qhov kev hloov kho (sau lossis tshem tawm cov ntaub ntawv).
  3. Txawm tias tus qauv NodeValue tsis yog tag nrho-fledged, tab sis trimmed (saib ntu "Kev txiav txim yuam sij siv tus neeg sib piv sab nraud"), koj tuaj yeem nkag mus rau nws cov teb los ntawm tus taw tes. Qhov tseem ceeb yog tsis txhob dereference nws!
  4. Tsis muaj qhov xwm txheej yuav tsum tau hloov kho los ntawm tus taw tes uas tau txais. Txhua qhov kev hloov pauv yuav tsum tau ua los ntawm txoj kev mdb_put. Txawm li cas los xij, tsis muaj teeb meem nyuaj npaum li cas koj xav ua qhov no, nws yuav tsis tuaj yeem ua tau, txij li lub cim xeeb thaj chaw uas cov qauv no nyob yog mapped hauv hom nyeem nkaus xwb.
  5. Remap ib cov ntaub ntawv rau cov txheej txheem chaw nyob rau lub hom phiaj ntawm, piv txwv li, nce qhov siab tshaj plaws cia loj siv cov kev ua mdb_env_set_map_size tag nrho invalidates tag nrho cov kev lag luam thiab cov koom haum muaj feem cuam tshuam nyob rau hauv dav dav thiab taw qhia rau qee yam khoom tshwj xeeb.

Thaum kawg, lwm qhov tshwj xeeb yog qhov tsis txaus ntseeg uas nthuav tawm nws cov ntsiab lus tsis haum rau lwm kab lus xwb. Hauv tshooj hais txog tsob ntoo B, kuv tau muab ib daim duab qhia txog yuav ua li cas nws cov nplooj ntawv tau teeb tsa hauv kev nco. Nws ua raws los ntawm qhov no tias qhov chaw nyob ntawm qhov pib ntawm qhov tsis nrog cov ntaub ntawv serialized tuaj yeem ua tau kiag li arbitrary. Vim li no, tus taw tes rau lawv tau txais hauv cov qauv MDB_val thiab txo qis rau tus taw tes rau ib qho qauv, nws hloov tawm mus rau unaligned nyob rau hauv cov ntaub ntawv dav dav. Nyob rau tib lub sijhawm, cov architectures ntawm qee cov chips (nyob rau hauv rooj plaub ntawm iOS no yog armv7) xav kom qhov chaw nyob ntawm cov ntaub ntawv yog ntau qhov loj ntawm lub tshuab lo lus lossis, hauv lwm lo lus, qhov me me ntawm qhov system ( rau armv7 nws yog 32 ntsis). Hauv lwm lo lus, kev ua haujlwm zoo li *(int *foo)0x800002 ntawm lawv yog sib npaug rau kev khiav tawm thiab ua rau kev tua nrog kev txiav txim EXC_ARM_DA_ALIGN. Muaj ob txoj hauv kev kom tsis txhob muaj txoj hmoo tu siab.

Tus thawj boils mus rau ua ntej luam ntawm cov ntaub ntawv mus rau hauv ib tug obviously aligned qauv. Piv txwv li, nyob rau hauv ib tug kev cai sib piv qhov no yuav tshwm sim raws li nram no.

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

Lwm txoj hauv kev yog ceeb toom rau tus neeg sau ua ntej tias cov qauv tseem ceeb-tus nqi yuav tsis raug coj los ua raws aligned(1). Ntawm ARM koj tuaj yeem muaj txiaj ntsig zoo ib yam ua tiav thiab siv cov khoom ntim khoom. Xav tias nws tseem yuav pab txhim kho qhov chaw nyob ntawm tus qauv, txoj kev no zoo li nyiam rau kuv, txawm tias ntsiab lus kom nce tus nqi ntawm cov ntaub ntawv nkag mus ua haujlwm.

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

Ntau cov lus nug

Txhawm rau rov hais dua ib pawg ntawm cov ntaub ntawv, LMDB muab tus cursor abstraction. Cia peb saib yuav ua li cas ua haujlwm nrog nws siv cov piv txwv ntawm lub rooj nrog cov neeg siv huab metadata twb paub txog peb.

Raws li ib feem ntawm kev nthuav qhia cov npe ntawm cov ntaub ntawv hauv ib phau ntawv, nws yog qhov tsim nyog los nrhiav txhua tus yuam sij uas nws cov ntaub ntawv me nyuam thiab cov folders cuam tshuam. Hauv ntu ntu dhau los peb txheeb cov yuam sij NodeKey xws li tias lawv feem ntau raug txiav txim los ntawm tus ID ntawm niam txiv cov npe. Yog li, technically, lub luag hauj lwm ntawm retrieving cov ntsiab lus ntawm ib daim ntawv tais ceev tseg los mus muab tus cursor nyob rau sab sauv ciam teb ntawm cov pab pawg neeg ntawm cov yuam sij nrog ib tug muab prefix thiab ces iterating mus rau lub sab ciam teb.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Lub sab sauv tuaj yeem nrhiav tau ncaj qha los ntawm kev tshawb nrhiav txuas ntxiv. Txhawm rau ua qhov no, tus cursor muab tso rau hauv qhov pib ntawm tag nrho cov npe ntawm cov yuam sij hauv cov ntaub ntawv thiab ntxiv ntxiv kom txog rau thaum tus yuam sij nrog tus cim ntawm niam txiv cov npe hauv qab nws. Txoj kev no muaj 2 qhov tsis zoo tsis zoo:

  1. Txoj kev tshawb nrhiav tsis yooj yim, txawm hais tias, raws li paub, hauv cov ntoo feem ntau thiab hauv B-ntoo tshwj xeeb nws tuaj yeem nqa tawm hauv lub sijhawm logarithmic.
  2. Nyob rau hauv vain, tag nrho cov nplooj ntawv ua ntej ib tug tab tom nrhiav yog nqa los ntawm cov ntaub ntawv mus rau lub ntsiab cim xeeb, uas yog kim heev.

Hmoov zoo, LMDB API muab txoj hauv kev zoo los pib qhov chaw tus cursor, ua qhov no, koj yuav tsum tsim kom muaj tus yuam sij uas nws tus nqi yog qhov tseeb tsawg dua lossis sib npaug rau tus yuam sij nyob rau ntawm thaj tsam sab saud ntawm lub sijhawm. Piv txwv li, hais txog cov npe hauv daim duab saum toj no, peb tuaj yeem ua tus yuam sij hauv qhov chaw parentId yuav muab sib npaug rau 2, thiab tag nrho cov seem yog sau nrog xoom. Xws li ib feem ntawm qhov tseem ceeb yog nkag rau qhov kev ua haujlwm nkag mdb_cursor_get qhia txog kev ua haujlwm 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);

Yog tias pom tus ciam teb sab saud ntawm ib pab pawg ntawm cov yuam sij, ces peb rov hla nws mus txog thaum peb ntsib lossis tus yuam sij ntsib lwm tus parentId, los yog cov yuam sij yuav tsis khiav txhua.

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

Dab tsi yog qhov zoo yog tias yog ib feem ntawm qhov kev rov ua dua siv mdb_cursor_get, peb tau txais tsis yog tus yuam sij nkaus xwb, tab sis kuj muaj txiaj ntsig. Yog tias, txhawm rau ua kom tiav cov qauv ntsuas, koj yuav tsum tau kuaj xyuas, ntawm lwm yam, cov teb los ntawm tus nqi ntawm cov ntaub ntawv, ces lawv tuaj yeem siv tau yam tsis muaj gestures ntxiv.

4.3. Ua qauv kev sib raug zoo ntawm cov rooj

Txog tam sim no, peb tau tswj hwm los txiav txim siab txhua yam ntawm kev tsim thiab ua haujlwm nrog ib lub rooj database. Peb tuaj yeem hais tias ib lub rooj yog ib txheej ntawm cov ntaub ntawv txheeb xyuas uas muaj tib yam ntawm cov tseem ceeb-tus nqi khub. Yog tias koj tso saib tus yuam sij ua lub duab plaub thiab tus nqi cuam tshuam raws li parallelepiped, koj tau txais daim duab pom ntawm cov ntaub ntawv.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Txawm li cas los xij, hauv lub neej tiag tiag nws tsis tshua muaj peev xwm tau txais los ntawm cov ntshav me me. Feem ntau nyob rau hauv ib tug database nws yuav tsum tau, firstly, yuav tsum muaj ob peb lub rooj, thiab thib ob, ua kev xaiv nyob rau hauv lawv nyob rau hauv ib qho kev txiav txim txawv los ntawm lub hauv paus ntsiab lus. Ntu kawg no tau mob siab rau cov teeb meem ntawm lawv cov kev tsim thiab kev sib txuas.

Index rooj

Daim ntawv thov huab muaj ntu "Gallery". Nws qhia tawm cov ntsiab lus los ntawm tag nrho cov huab, txheeb raws hnub tim. Txhawm rau kom ua tiav qhov kev xaiv zoo li no, nyob ib sab ntawm lub rooj tseem ceeb koj yuav tsum tsim lwm tus nrog cov yuam sij tshiab. Lawv yuav muaj ib daim teb nrog rau hnub uas cov ntaub ntawv raug tsim, uas yuav ua raws li cov txheej txheem sorting thawj. Vim tias cov yuam sij tshiab siv tib cov ntaub ntawv raws li cov yuam sij hauv lub rooj loj, lawv hu ua cov yuam sij index. Nyob rau hauv daim duab hauv qab no lawv yog highlighted nyob rau hauv txiv kab ntxwv.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Txhawm rau cais cov yuam sij ntawm cov rooj sib txawv ntawm ib leeg hauv tib lub database, ib qho kev qhia ntxiv tableId tau ntxiv rau lawv txhua tus. Los ntawm kev ua nws qhov tseem ceeb tshaj plaws rau kev txheeb xyuas, peb yuav ua tiav pawg ntawm cov yuam sij ua ntej los ntawm cov ntxhuav, thiab hauv cov ntxhuav - raws li peb cov cai.

Tus yuam sij index siv tib cov ntaub ntawv raws li tus yuam sij tseem ceeb. Kev ua ncaj ncees ntawm cov cuab yeej no los ntawm kev koom nrog nws ib daim qauv ntawm tus nqi ntawm qhov tseem ceeb tsis zoo los ntawm ntau lub ntsiab lus ntawm kev pom:

  1. Hais txog qhov chaw coj mus, cov metadata tuaj yeem nplua nuj heev.
  2. Los ntawm qhov kev ua tau zoo ntawm qhov pom, txij li thaum hloov kho cov metadata ntawm lub node, koj yuav tsum rov sau dua nws siv ob tus yuam sij.
  3. Los ntawm qhov pom ntawm kev txhawb nqa code, yog tias peb tsis nco qab hloov kho cov ntaub ntawv rau ib qho ntawm cov yuam sij, peb yuav tau txais cov kab laum tsis zoo ntawm cov ntaub ntawv tsis sib xws hauv kev khaws cia.

Tom ntej no, peb yuav xav txog yuav ua li cas tshem tawm cov kev tsis txaus no.

Kev sib raug zoo ntawm cov rooj

Cov qauv zoo haum rau kev sib txuas cov lus qhia nrog lub ntsiab lus "key as value". Raws li nws lub npe qhia, tus nqi ntawm cov ntaub ntawv ntsuas yog ib daim qauv ntawm tus nqi tseem ceeb. Txoj hauv kev no tshem tawm tag nrho cov teeb meem saum toj no uas cuam tshuam nrog kev khaws cia ib daim qauv ntawm tus nqi ntawm cov ntaub ntawv tseem ceeb. Tus nqi nkaus xwb yog kom tau txais tus nqi los ntawm qhov tseem ceeb, koj yuav tsum ua 2 cov lus nug rau cov ntaub ntawv tsis yog ib qho. Schematically, cov txiaj ntsig database schema zoo li no.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Lwm tus qauv rau kev teeb tsa kev sib raug zoo ntawm cov rooj yog "qhov tseem ceeb redundant". Nws cov ntsiab lus yog ntxiv cov yam ntxwv ntxiv rau tus yuam sij, uas xav tau tsis yog rau kev txheeb xyuas, tab sis rau kev rov tsim dua tus yuam sij cuam tshuam. Nyob rau hauv Mail.ru Cloud daim ntawv thov muaj cov piv txwv tiag tiag ntawm nws siv, txawm li cas los xij, txhawm rau zam kev dhia dej tob rau hauv. cov ntsiab lus ntawm cov txheej txheem iOS no tshwj xeeb, Kuv yuav muab qhov tseeb, tab sis tab sis qhov piv txwv meej dua.

Huab mobile cov neeg siv khoom muaj nplooj ntawv uas qhia tag nrho cov ntaub ntawv thiab cov folders uas tus neeg siv tau koom nrog lwm tus neeg. Txij li thaum muaj qee cov ntaub ntawv zoo li no, thiab muaj ntau yam sib txawv ntawm cov ntaub ntawv tshwj xeeb txog kev tshaj tawm cuam tshuam nrog lawv (leej twg tau txais kev tso cai, muaj cai dab tsi, thiab lwm yam), nws yuav tsis yog qhov tsim nyog rau lub nra ntawm tus nqi ntawm cov ntaub ntawv. sau rau hauv lub rooj loj nrog nws. Txawm li cas los xij, yog tias koj xav tso cov ntaub ntawv zoo li no offline, koj tseem yuav tsum khaws cia rau qhov chaw. Ib qho kev daws teeb meem yog los tsim ib lub rooj sib cais rau nws. Hauv daim duab hauv qab no, nws qhov tseem ceeb yog ua ntej nrog "P", thiab qhov chaw "propname" tuaj yeem hloov nrog tus nqi tshwj xeeb "cov ntaub ntawv pej xeem".

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Tag nrho cov metadata tshwj xeeb, rau kev khaws cia uas lub rooj tshiab tau tsim, muab tso rau hauv tus nqi ntawm cov ntaub ntawv. Tib lub sijhawm, koj tsis xav kom duplicate cov ntaub ntawv hais txog cov ntaub ntawv thiab cov folders uas twb tau khaws cia rau hauv lub rooj loj. Hloov chaw, cov ntaub ntawv tsis raug ntxiv yog ntxiv rau "P" qhov tseem ceeb hauv daim ntawv "node ID" thiab "timestamp" teb. Ua tsaug rau lawv, koj tuaj yeem tsim qhov ntsuas qhov tseem ceeb, los ntawm qhov koj tuaj yeem tau txais tus yuam sij tseem ceeb, los ntawm qhov kawg, koj tuaj yeem tau txais node metadata.

Xaus

Peb ntsuam xyuas cov txiaj ntsig ntawm kev siv LMDB zoo. Tom qab nws, tus naj npawb ntawm daim ntawv thov freezes txo los ntawm 30%.

Qhov ci ntsa iab thiab kev txom nyem ntawm qhov tseem ceeb-tus nqi database LMDB hauv iOS daim ntawv thov

Cov txiaj ntsig ntawm kev ua haujlwm tau ua tiav dhau ntawm pab pawg iOS. Tam sim no, ib qho ntawm cov ntsiab lus "Cov Ntaub Ntawv" hauv daim ntawv thov Android kuj tau hloov mus rau kev siv LMDB, thiab lwm qhov chaw nyob ntawm txoj kev. C lus, nyob rau hauv uas lub khw tseem ceeb-tus nqi yog siv, yog ib qho kev pab zoo los pib tsim ib daim ntawv thov nyob ib ncig ntawm nws cross-platform hauv C ++. Lub tshuab hluav taws xob code tau siv los txuas txuas rau qhov tshwm sim C ++ tsev qiv ntawv nrog lub platform code hauv Objective-C thiab Kotlin Djinni los ntawm Dropbox, tab sis qhov ntawd yog ib zaj dab neeg sib txawv kiag li.

Tau qhov twg los: www.hab.com

Ntxiv ib saib