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.
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.
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
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 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.
Xov kev ruaj ntseg.
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.
Lub peev xwm los sawv cev cov chaw khaws cia ua cov khoom tsis hloov pauv.
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.
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.
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:
Nco-mapped cov ntaub ntawv raws li ib tug mechanism rau kev ua hauj lwm nrog disk thiab synchronizing nrog cov ntaub ntawv lug.
B +-ntoo ua ib lub koom haum ntawm cov qauv ntawm cov ntaub ntawv khaws cia.
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.
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.
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.
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.
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.
Nrog 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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
Kev them nyiaj yug rau nested muas.
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.
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.
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.
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.
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.
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.
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.
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).
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!
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.
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.
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.
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.
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.
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: