Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

A cikin faɗuwar 2019, taron da aka daɗe ana jira ya faru a cikin ƙungiyar Mail.ru Cloud iOS. Babban ma'ajin bayanai don ci gaba da adana yanayin aikace-aikacen ya zama abin ban mamaki ga duniyar wayar hannu Database Mai Taswirar Ƙwaƙwalwar Walƙiya (LMDB). A ƙarƙashin yanke, ana gayyatar hankalin ku zuwa cikakken bita a cikin sassa huɗu. Da farko, bari mu yi magana game da dalilan irin wannan zaɓi maras muhimmanci kuma mai wahala. Sa'an nan kuma bari mu ci gaba zuwa la'akari da whale uku a cikin zuciyar gine-ginen LMDB: fayilolin da aka yi taswirar ƙwaƙwalwar ajiya, B + itace, tsarin kwafi-kan-rubutu don aiwatar da ciniki da multiversioning. A ƙarshe, don kayan zaki - sashi mai amfani. A ciki, za mu kalli yadda ake ƙira da aiwatar da tsarin ƙima tare da teburi da yawa, gami da fihirisa ɗaya, a saman API ɗin maɓalli mai ƙanƙanta.

Abubuwa

  1. Ƙarfafa aiwatarwa
  2. Matsayin LMDB
  3. Uku Whales LMDB
    3.1. Whale #1. Fayilolin da aka yi taswirar ƙwaƙwalwa
    3.2. Whale #2. B+ - itace
    3.3. Whale #3. kwafi-kan-rubuta
  4. Zana tsarin tsarin bayanai a saman API ɗin maɓalli-darajar
    4.1. Abubuwan abstraction na asali
    4.2. Tebur Modeling
    4.3. Model dangantaka tsakanin tebur

1. Ƙimar aiwatarwa

Sau ɗaya a shekara, a cikin 2015, mun kula da ɗaukar ma'auni, sau nawa yanayin aikace-aikacen mu ya ƙare. Ba mu yi wannan kawai ba. Muna da ƙara korafe-korafe game da gaskiyar cewa wani lokacin aikace-aikacen yana daina mayar da martani ga ayyukan mai amfani: ba a latsa maɓalli, lissafin ba sa gungurawa, da sauransu. Game da makanikai na ma'auni gaya akan AvitoTech, don haka a nan na ba da tsari na lambobi kawai.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Sakamakon aunawa ya zama ruwan sanyi a gare mu. Ya zamana cewa matsalolin da daskarewa ke haifarwa sun fi kowa yawa. Idan, kafin fahimtar wannan gaskiyar, babban alamar fasaha na inganci ya kasance kyauta, to bayan mayar da hankali canza a kan daskare.

Bayan gina dashboard tare da daskarewa kuma bayan ciyarwa adadi и inganci nazarin abubuwan da suka haifar da su, babban abokin gaba ya zama bayyananne - ma'anar kasuwanci mai nauyi yana aiwatarwa a cikin babban zaren aikace-aikacen. Halin dabi'a ga wannan wulakanci shine ƙonawa sha'awar tura shi cikin rafukan aiki. Domin warware wannan matsala ta tsari, mun koma ga tsarin gine-gine masu zare da yawa dangane da ƴan wasan kwaikwayo marasa nauyi. Na sadaukar da kayan aikinta don duniyar iOS zare biyu a cikin jama'a twitter da labarin kan Habre. A matsayin wani ɓangare na labarin na yanzu, Ina so in jaddada waɗancan bangarorin yanke shawara da suka yi tasiri akan zaɓin bayanan

Samfurin wasan kwaikwayo na tsarin tsarin yana ɗauka cewa multithreading ya zama jigon sa na biyu. Samfuran abubuwa a cikinsa suna son ketare iyakokin zaren. Kuma suna yin haka ba wani lokaci ba kuma a wasu wurare, amma kusan akai-akai kuma a ko'ina.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Ma'ajin bayanai na ɗaya daga cikin abubuwan ginshiƙan ginshiƙan a cikin zanen da aka gabatar. Babban aikinsa shine aiwatar da tsarin macro Database Shared. Idan a cikin kasuwancin duniya ana amfani da shi don tsara bayanan aiki tare tsakanin ayyuka, to, a cikin yanayin gine-ginen actor, bayanai tsakanin zaren. Don haka, muna buƙatar irin wannan bayanan, yin aiki tare da wanda a cikin yanayi mai yawa ba ya haifar da ƙananan matsaloli. Musamman ma, wannan yana nufin cewa abubuwan da aka samo daga gare su dole ne su kasance aƙalla lafiyayyen zaren, kuma a fili ba su canzawa kwata-kwata. Kamar yadda ka sani, ana iya amfani da na ƙarshe a lokaci guda daga zaren da yawa ba tare da yin amfani da kowane nau'i na kulle ba, wanda ke da tasiri mai amfani akan aikin.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOSMuhimmin abu na biyu wanda ya yi tasiri ga zaɓin bayanan shine API ɗin girgijenmu. An yi wahayi ne ta hanyar git don daidaitawa. Kamar shi muka nufa API ɗin farko na layi, wanda ya dubi fiye da dacewa ga abokan ciniki na girgije. An ɗauka cewa sau ɗaya kawai za su fitar da cikakken yanayin gajimare, sannan aiki tare a mafi yawan lokuta zai faru ta hanyar sauye-sauye. Alas, wannan yiwuwar har yanzu yana cikin yankin ka'idar kawai, kuma a aikace, abokan ciniki ba su koyi yadda ake aiki tare da faci ba. Akwai dalilai da dama na haƙiƙa na wannan, wanda, don kada a jinkirta gabatarwar, za mu bar daga cikin sassan. Yanzu mafi ban sha'awa shine sakamakon koyarwa na darasi game da abin da ke faruwa lokacin da API ya ce "A" kuma mabukacinsa bai ce "B".

Don haka, idan kun yi tunanin git, wanda, lokacin aiwatar da umarnin ja, maimakon yin amfani da faci zuwa hoto na gida, yana kwatanta cikakken yanayin sa tare da cikakken uwar garken, to zaku sami cikakkiyar ra'ayi na yadda aiki tare. yana faruwa a cikin abokan ciniki na girgije. Yana da sauƙi a yi la'akari da cewa don aiwatar da shi ya zama dole don rarraba bishiyoyin DOM guda biyu a cikin ƙwaƙwalwar ajiya tare da bayanan-meta game da duk uwar garken da fayilolin gida. Ya bayyana cewa idan mai amfani ya adana fayiloli 500 a cikin girgije, to, don daidaita shi, ya zama dole don sake sakewa da lalata bishiyoyi biyu tare da nodes miliyan 1. Amma kowane kumburi jimillar ce mai ɗauke da jadawali na batutuwa. A cikin wannan haske, ana tsammanin sakamakon bayanin martaba. Ya bayyana cewa ko da ba tare da la'akari da haɗin gwiwar algorithm ba, ainihin hanyar ƙirƙira sannan kuma lalata adadi mai yawa na ƙananan abubuwa yana kashe kuɗi mai yawa. na rubutun masu amfani. A sakamakon haka, mun gyara ma'auni mai mahimmanci na biyu a zabar bayanan bayanai - ikon aiwatar da ayyukan CRUD ba tare da rarraba abubuwa masu ƙarfi ba.

Sauran buƙatun sun fi na gargajiya, kuma cikakken jerin su kamar haka.

  1. Amintaccen zaren.
  2. Multiprocessing. Ƙaddamar da sha'awar yin amfani da misalin bayanai iri ɗaya don daidaita yanayin ba kawai tsakanin zaren ba, har ma tsakanin babban aikace-aikacen da kari na iOS.
  3. Ikon wakiltar abubuwan da aka adana a matsayin abubuwa marasa canzawa
  4. Rashin ƙarfi mai ƙarfi a cikin ayyukan CRUD.
  5. Tallafin Ma'amala don Kayayyakin Mahimmanci ACIDMahimman kalmomi: atomity, daidaito, kadaici da dogaro.
  6. Gudun kan mafi mashahuri lokuta.

Tare da wannan saitin buƙatun, SQLite ya kasance kuma har yanzu zaɓi ne mai kyau. Duk da haka, a matsayin wani ɓangare na nazarin madadin, na ci karo da wani littafi "Farawa da LevelDB". A ƙarƙashin jagorancinta, an rubuta alamar da ke kwatanta saurin aiki tare da bayanai daban-daban a cikin yanayin girgije na ainihi. Sakamakon ya wuce yadda ake tsammani. A mafi shaharar lokuta - samun siginan kwamfuta akan jeri da aka jera na duk fayiloli da jerin jeri na duk fayiloli don jagorar da aka bayar - LMDB ya juya ya zama sau 10 cikin sauri fiye da SQLite. Zabin ya zama a bayyane.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

2. Matsayin LMDB

LMDB ɗakin karatu ne, ƙanƙanta (layukan 10K kawai) waɗanda ke aiwatar da mafi ƙanƙanta tushen tushen bayanai - ajiya.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Hoton da ke sama yana nuna cewa kwatanta LMDB tare da SQLite, wanda ke aiwatar da matakan da suka fi girma, gabaɗaya bai fi daidai ba fiye da SQLite tare da Core Data. Zai fi dacewa a ambaci injunan ajiya iri ɗaya azaman masu fafatawa daidai - BerkeleyDB, LevelDB, Sophia, RocksDB, da sauransu. Irin wannan gwaji na farko a cikin 2012 kashe marubuci LMDB Howard Chu. Результаты ya zama abin ban sha'awa sosai, har ma'abota kishin OSS suka dauko shirin nasa, kuma ya sami ci gaba a fuskarsa. LumoSQL. A cikin Janairu 2020 marubucin wannan aikin shine Den Shearer gabatar Yana kan LinuxConfAu.

Babban amfani da LMDB shine a matsayin injiniya don bayanan bayanai. Laburaren yana bin bayyanarsa ga masu haɓakawa OpenLDAP, waɗanda ba su gamsu da BerkeleyDB a matsayin tushen aikin su ba. Turawa daga ɗakin karatu mai tawali'u btree, Howard Chu ya iya ƙirƙirar ɗaya daga cikin mafi mashahuri madadin na zamaninmu. Ya sadaukar da rahotonsa mai kyau ga wannan labari, da kuma tsarin cikin gida na LMDB. "Database na Ƙwaƙwalwar Ƙwaƙwalwar Ƙwaƙwalwa". Leonid Yuriev (aka yleo) daga Fasaha mai kyau a cikin jawabinsa a Highload 2015 "Injin LMDB zakara ne na musamman". A ciki, ya yi magana game da LMDB a cikin mahallin aiki iri ɗaya na aiwatar da ReOpenLDAP, kuma LevelDB an riga an fuskanci sukar kwatance. A sakamakon aiwatar da, Positive Technologies ko da samu wani rayayye tasowa cokali mai yatsu MDBX tare da kyawawan fasali, ingantawa da gyaran kwaro.

Ana amfani da LMDB sau da yawa azaman ajiya kuma. Misali, Mozilla Firefox browser zaba shi don adadin buƙatu, kuma, farawa daga sigar 9, Xcode wanda aka fi so ta SQLite don adana fihirisa.

Injin ya kuma kama a duniyar ci gaban wayar hannu. Alamomin amfani da shi na iya zama gano a cikin abokin ciniki na iOS don Telegram. LinkedIn ya ci gaba da mataki ɗaya kuma ya zaɓi LMDB a matsayin tsohuwar ma'auni don tsarin caching na gida na gida, Roket Data, wanda game da shi. gaya a cikin labarin a cikin 2016.

LMDB yana samun nasarar yin gwagwarmaya don wuri a rana a cikin alkuki da BerkeleyDB ya bari bayan canji a ƙarƙashin ikon Oracle. Ana ƙaunar ɗakin karatu don saurinsa da amincinsa, ko da a kwatanta shi da irin nasa. Kamar yadda kuka sani, babu abincin rana kyauta, kuma ina so in jaddada cinikin da za ku fuskanta lokacin zabar tsakanin LMDB da SQLite. Hoton da ke sama yana nuna a fili yadda ake samun karuwar saurin. Na farko, ba mu biya don ƙarin yadudduka na abstraction a saman ajiyar diski. Tabbas, a cikin kyakkyawan tsarin gine-gine, har yanzu ba za ku iya yin ba tare da su ba, kuma babu makawa za su bayyana a cikin lambar aikace-aikacen, amma za su kasance mafi ƙaranci. Ba za su sami fasalulluka waɗanda takamaiman aikace-aikacen ke buƙata ba, misali, goyan bayan tambayoyi a cikin yaren SQL. Na biyu, yana yiwuwa a aiwatar da taswirar ayyukan aikace-aikacen da kyau ga buƙatun zuwa ajiyar diski. Idan SQLite cikin aikina ya fito ne daga matsakaicin buƙatun matsakaicin aikace-aikacen, sannan ku, a matsayin mai haɓaka aikace-aikacen, kuna sane da babban yanayin ɗaukar nauyi. Don ƙarin ingantacciyar mafita, za ku biya ƙarin alamar farashi don ci gaban farkon bayani da goyon bayansa na gaba.

3. Uku Whales LMDB

Bayan kallon LMDB daga kallon idon tsuntsu, lokaci yayi da za a zurfafa. Za a keɓance sassan uku na gaba don nazarin manyan whales waɗanda gine-ginen ajiya ya dogara a kansu:

  1. Fayilolin da aka yi taswirar ƙwaƙwalwar ajiya azaman hanyar aiki tare da faifai da aiki tare da tsarin bayanan ciki.
  2. B + - itace a matsayin ƙungiyar tsarin bayanan da aka adana.
  3. Kwafi-kan-rubuta azaman hanya don samar da kaddarorin ciniki na ACID da multiversioning.

3.1. Whale #1. Fayilolin da aka yi taswirar ƙwaƙwalwa

Fayilolin da aka yi taswirar ƙwaƙwalwar ajiya irin waɗannan mahimman abubuwan gine-gine ne wanda har suna bayyana a cikin sunan ma'ajiyar. Batutuwa na caching da aiki tare da samun damar bayanai da aka adana gaba ɗaya suna cikin jinƙan tsarin aiki. LMDB baya ƙunsar kowane cache a cikin kanta. Wannan yanke shawara ne mai hankali da marubucin ya yi, tun da karanta bayanai kai tsaye daga fayilolin da aka tsara suna ba ku damar yanke sasanninta da yawa a cikin aiwatar da injin. A ƙasa akwai nisa daga cikakken jerin wasu daga cikinsu.

  1. Kula da daidaiton bayanai a cikin ajiya lokacin aiki tare da shi daga matakai da yawa ya zama alhakin tsarin aiki. A cikin sashe na gaba, an tattauna wannan makanikin daki-daki da hotuna.
  2. Rashin caches gaba ɗaya yana sauke LMDB na abin da ke da alaƙa da rabo mai ƙarfi. Karatun bayanai a aikace yana saita mai nuni zuwa daidai adireshin a cikin ƙwaƙwalwar ajiya kuma babu wani ƙari. Yayi kama da fantasy, amma a cikin majiyar ma'ajiyar, duk kiran calloc an mayar da hankali ne a cikin aikin saitin ma'aji.
  3. Rashin caches kuma yana nufin rashin makullai masu alaƙa da aiki tare don samun damar su. Masu karatu, wanda lambar sabani za ta iya kasancewa a lokaci guda, ba sa cin karo da mutex guda ɗaya a kan hanyarsu ta zuwa bayanan. Saboda wannan, saurin karantawa yana da madaidaicin madaidaicin madaidaiciya dangane da adadin CPUs. A cikin LMDB, ayyukan gyare-gyare kawai suna aiki tare. Za a iya samun marubuci ɗaya kawai a lokaci guda.
  4. Mafi ƙarancin caching da dabaru na aiki tare yana adana lambar daga nau'in kurakurai masu sarƙaƙƙiya masu alaƙa da aiki a cikin mahalli mai zaren yawa. Akwai nazarin bayanai masu ban sha'awa guda biyu a taron Usenix OSDI 2014: "Dukkan Tsarukan Fayil Ba a Ƙirƙiri Daidaita Ba: Akan Ƙirƙirar Ƙirƙirar Crash-Consistant Applications" и azabtarwa Databases don Nishaɗi da Riba. Daga cikinsu zaku iya samun bayanai game da amincin LMDB wanda ba a taɓa ganin irinsa ba, da kusan aiwatar da kaddarorin ACID na ma'amaloli, wanda ya zarce shi a cikin SQLite iri ɗaya.
  5. Minimalism na LMDB yana ba da damar wakilcin injin na lambar sa gaba ɗaya a sanya shi a cikin cache na L1 na processor tare da halayen saurin sakamakon.

Abin takaici, a cikin iOS, fayilolin da aka yi taswirar ƙwaƙwalwar ajiya ba su da ja kamar yadda muke so. Don yin magana game da rashin amfani da ke tattare da su da hankali, yana da muhimmanci a tuna da ka'idoji na gaba ɗaya don aiwatar da wannan tsari a cikin tsarin aiki.

Gabaɗaya bayanai game da fayilolin da aka yi taswirar ƙwaƙwalwa

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOSTare da kowane aikace-aikacen da za a iya aiwatarwa, tsarin aiki yana haɗa abin da ake kira tsari. Kowane tsari ana keɓance kewayon adiresoshin jeri, wanda ke sanya duk abin da yake buƙata don aiki. Mafi ƙasƙancin adireshi sun ƙunshi sassan da lamba da bayanai masu rumbun bayanai da albarkatu. Na gaba yana zuwa sama mai girma block na sararin adireshi, sananne a gare mu a matsayin tudun. Yana ƙunshe da adiresoshin ƙungiyoyin da ke bayyana yayin aikin shirin. A saman akwai wurin ƙwaƙwalwar ajiyar da tarin aikace-aikacen ke amfani da shi. Ko dai yayi girma ko ya ragu, ma'ana, girmansa shima yana da yanayi mai kuzari. Don kada tari da tulin ba su turawa da tsoma baki a tsakanin juna, an raba su a lunguna daban-daban na sararin adireshi, akwai rami a tsakanin sassan biyu masu motsi a sama da kasa. Ana amfani da adiresoshin da ke wannan sashe na tsakiya ta tsarin aiki don haɗawa da tsarin ƙungiyoyi daban-daban. Musamman ma, yana iya taswirar takamaiman saitin adireshi masu ci gaba zuwa fayil akan faifai. Ana kiran irin wannan fayil ɗin fayil ɗin ƙwaƙwalwar ajiya

Wurin adireshin da aka ware wa tsari yana da girma. A ka'ida, adadin adireshi yana iyakance ne kawai ta girman ma'auni, wanda aka ƙaddara ta zurfin zurfin tsarin. Idan an sanya ƙwaƙwalwar ajiyar jiki zuwa gare ta 1-in-1, to tsarin farko zai haɓaka RAM gaba ɗaya, kuma ba za a sami wata tambaya game da kowane aiki da yawa ba.

Duk da haka, mun sani daga gwaninta cewa tsarin aiki na zamani na iya tafiyar da matakai da yawa kamar yadda kuke so a lokaci guda. Wannan yana yiwuwa ne saboda gaskiyar cewa suna rarraba ƙwaƙwalwar ajiya mai yawa zuwa matakai kawai a kan takarda, amma a gaskiya suna ɗauka a cikin babban ƙwaƙwalwar ajiyar jiki kawai wannan ɓangaren da ake buƙata a nan da yanzu. Saboda haka, ƙwaƙwalwar da ke hade da tsarin ana kiranta kama-da-wane.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Tsarin aiki yana tsara kama-da-wane da ƙwaƙwalwar ajiya ta jiki zuwa shafuka na takamaiman girman. Da zaran wani shafi na ƙwaƙwalwar ajiya yana buƙatar, tsarin aiki yana loda shi zuwa ƙwaƙwalwar ajiyar jiki kuma yana sanya wasiƙun rubutu a tsakanin su a cikin tebur na musamman. Idan babu ramummuka kyauta, to ɗayan shafukan da aka ɗora a baya ana kwafin su zuwa faifai, wanda aka nema ya ɗauki wurinsa. Wannan hanya, wadda za mu koma nan ba da jimawa ba, ana kiranta swapping. Hoton da ke ƙasa yana kwatanta tsarin da aka kwatanta. A kan sa, an ɗora shafi A mai adireshi 0 kuma an sanya shi akan babban shafi na ƙwaƙwalwar ajiya mai adireshi 4. Wannan gaskiyar ta bayyana a cikin tebur na wasiƙa a lambar salula 0.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Tare da fayilolin da aka yi taswirar ƙwaƙwalwar ajiya, labarin daidai yake. A hankali, ana tsammanin ana ci gaba da sanya su gabaɗaya a cikin sararin adireshi. Koyaya, suna shiga cikin shafi na ƙwaƙwalwar ajiyar jiki ta shafi kuma akan buƙata kawai. Ana daidaita gyare-gyaren irin waɗannan shafuka tare da fayil akan faifai. Don haka, zaku iya aiwatar da fayil I / O, kawai aiki tare da bytes a cikin ƙwaƙwalwar ajiya - duk canje-canje za a canza su ta atomatik ta kernel ɗin tsarin zuwa ainihin fayil ɗin.

Hoton da ke ƙasa yana nuna yadda LMDB ke daidaita yanayin sa yayin aiki tare da bayanan bayanai daga matakai daban-daban. Ta hanyar yin taswirar ƙwaƙwalwar ajiya na matakai daban-daban akan fayil iri ɗaya, muna tabbatar da cewa muna tilasta tsarin aiki don daidaita wasu tubalan wuraren adireshinsu tare da juna, wanda shine inda LMDB ya dubi.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Wani muhimmin mahimmanci shine LMDB yana canza fayil ɗin bayanai ta tsohuwa ta hanyar tsarin tsarin kira, kuma fayil ɗin kanta yana nunawa a yanayin karantawa kawai. Wannan hanya tana da ma'ana guda biyu masu mahimmanci.

Sakamakon farko gama gari ne ga duk tsarin aiki. Mahimmancinsa shine ƙara kariya daga lalacewa mara hankali ga ma'ajin bayanai ta hanyar lambar da ba ta dace ba. Kamar yadda ka sani, umarnin aiwatarwa na tsari kyauta ne don samun damar bayanai daga ko'ina a cikin adireshin adireshinsa. A lokaci guda, kamar yadda muka tuna kawai, nuna fayil a yanayin karantawa yana nufin cewa kowane umarni yana iya gyara shi ƙari. Idan ta yi haka ne bisa kuskure, ta yi ƙoƙarin, alal misali, a haƙiƙa ta sake rubuta wani array element a wani maƙasudin da ba shi da shi, to ta wannan hanya za ta iya canza fayil ɗin da aka yi taswirar zuwa wannan adireshin da gangan, wanda zai haifar da ɓarna na ma'ajin bayanai. Idan an nuna fayil ɗin a yanayin karantawa kawai, to ƙoƙarin canza wurin adireshin da ya dace da shi zai haifar da haɗarin shirin tare da siginar. SIGSEGV, kuma fayil ɗin zai kasance cikakke.

Sakamakon na biyu ya riga ya keɓanta ga iOS. Ba marubucin ko wasu majiyoyin da suka ambata a sarari ba, amma idan ba tare da shi ba, LMDB ba zai dace da aiki akan wannan tsarin aiki na wayar hannu ba. Sashe na gaba ya keɓe don la'akarinsa.

Ƙayyadaddun fayiloli masu taswirar ƙwaƙwalwar ajiya a cikin iOS

A cikin 2018, an sami rahoto mai ban mamaki a WWDC IOS Memory Deep Dive. Yana gaya cewa a cikin iOS duk shafukan da ke cikin ƙwaƙwalwar ajiyar jiki suna cikin ɗayan nau'ikan 3: datti, matsawa da tsabta.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Ƙwaƙwalwar ajiya mai tsabta tarin shafuka ne waɗanda za a iya musanya su cikin aminci daga ƙwaƙwalwar ajiyar jiki. Za a iya sake loda bayanan da suka ƙunshi daga asalinsu kamar yadda ake buƙata. Fayilolin da aka tsara taswirar ƙwaƙwalwar ajiya kawai sun faɗi cikin wannan rukunin. iOS ba ya jin tsoron sauke shafukan da aka tsara zuwa fayil daga ƙwaƙwalwar ajiya a kowane lokaci, tun da an ba da tabbacin aiki tare da fayil ɗin akan faifai.

Duk shafukan da aka gyara suna shiga cikin ƙazantaccen ƙwaƙwalwar ajiya, komai inda aka samo asali. Musamman, fayilolin da aka yi taswirar ƙwaƙwalwar ajiya waɗanda aka gyara ta hanyar rubutawa zuwa ƙwaƙwalwar ajiya mai alaƙa da su kuma za a rarraba su ta wannan hanyar. Bude LMDB tare da tuta MDB_WRITEMAP, bayan yin canje-canje gare shi, zaku iya gani da kanku.

Da zaran aikace-aikace ya fara ɗaukar ƙwaƙwalwar ajiyar jiki da yawa, iOS yana matsar da ƙazantattun shafukan sa. Tarin ƙwaƙwalwar ajiyar da ke shagaltar da ƙazantattun shafuka da matsa lamba shine abin da ake kira sawun ƙwaƙwalwa na aikace-aikacen. Lokacin da ya kai ga ƙimar ƙima, tsarin OOM killer daemon yana zuwa bayan aiwatarwa kuma ya ƙare da ƙarfi. Wannan shi ne peculiarity na iOS idan aka kwatanta da tebur aiki tsarin. Sabanin haka, rage sawun ƙwaƙwalwar ajiya ta hanyar musanya shafuka daga ƙwaƙwalwar ajiyar jiki zuwa faifai ba a samar da ita a cikin iOS ba. Wataƙila hanya don matsar da shafuka masu ƙarfi zuwa faifai da baya yana da ƙarfi-cinyewa ga na'urorin hannu, ko iOS yana adana albarkatun sake rubuta sel akan faifan SSD, ko wataƙila masu ƙirar ba su gamsu da aikin gabaɗayan tsarin ba, inda komai yake. kullum musanya. Ko ta yaya, gaskiyar ta kasance.

Labari mai dadi, wanda aka ambata a baya, shine LMDB baya amfani da tsarin mmap ta tsohuwa don sabunta fayiloli. Ya biyo bayan cewa an rarraba bayanan da aka yi azaman ƙwaƙwalwar ajiya mai tsabta ta iOS kuma baya ba da gudummawa ga sawun ƙwaƙwalwar ajiya. Ana iya tabbatar da wannan ta amfani da kayan aikin Xcode da ake kira VM Tracker. Hoton da ke ƙasa yana nuna yanayin ƙwaƙwalwar ajiya na aikace-aikacen girgije na iOS yayin aiki. A farkon, 2 LMDB lokuta an fara farawa a ciki. An ba na farko damar taswirar fayil ɗinsa zuwa 1GiB na ƙwaƙwalwar ajiya, na biyu - 512MiB. Duk da cewa duka ɗakunan ajiya sun mamaye wani adadin ƙwaƙwalwar mazaunin, babu ɗayansu da ke taimakawa ga girman ƙazanta.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Yanzu lokaci ya yi da za a yi mummunan labari. Godiya ga tsarin musanya a cikin 64-bit tsarin aiki na tebur, kowane tsari zai iya ɗaukar sararin adireshi mai yawa kamar yadda sarari kyauta akan faifan diski yana ba da damar yuwuwar musanyawa. Maye gurbin musanyawa tare da matsawa a cikin iOS yana rage girman ƙididdiga. Yanzu duk hanyoyin rayuwa dole ne su dace da babban ƙwaƙwalwar ajiya (karanta RAM), kuma duk waɗanda ba su dace ba suna ƙarƙashin tilastawa. An ambace shi kamar yadda yake a sama rahoto, da kuma cikin takardun shaida. Sakamakon haka, iOS yana iyakance adadin ƙwaƙwalwar ajiya da ake samu don rabawa ta hanyar mmap. nan a nan zaku iya duba iyakoki masu ƙarfi akan adadin ƙwaƙwalwar ajiya da za'a iya keɓancewa akan na'urori daban-daban ta amfani da wannan tsarin kiran. A kan mafi zamani model na wayowin komai da ruwan, iOS ya zama mai karimci ta 2 gigabytes, kuma a kan saman versions na iPad - ta 4. A aikace, ba shakka, dole ne ka mayar da hankali a kan ƙarami goyon bayan na'urar model, inda duk abin da yake da matukar bakin ciki. Ko da mafi muni, duban yanayin ƙwaƙwalwar ajiyar aikace-aikacen a cikin VM Tracker, za ku ga cewa LMDB ya yi nisa da ɗayan da ke da'awar ƙwaƙwalwar taswirar ƙwaƙwalwar ajiya. Masu rarraba tsarin, fayilolin albarkatun ƙasa, tsarin hoto, da sauran ƙananan mafarauta ana cinye su da kyau.

Sakamakon gwaje-gwajen da aka yi a cikin Cloud, mun zo da waɗannan ƙididdiga masu rikitarwa na ƙwaƙwalwar ajiya da LMDB ke ware: megabytes 384 don na'urori 32-bit da 768 don 64-bit. Bayan an yi amfani da wannan ƙarar, duk wani aiki na gyara zai fara kammalawa tare da lambar MDB_MAP_FULL. Muna lura da irin waɗannan kurakuran a cikin sa ido, amma suna da ƙananan isa da za a yi watsi da su a wannan matakin.

Dalilin da ba a bayyane ba na yawan amfani da ƙwaƙwalwar ajiya ta wurin ajiya na iya zama ma'amala mai tsayi. Don fahimtar yadda waɗannan al'amura biyu ke da alaƙa, zai taimake mu mu yi la'akari da sauran biyun LMDB whale.

3.2. Whale #2. B+ - itace

Don yin koyi da teburi a saman kantin sayar da kimar maɓalli, dole ne ayyuka masu zuwa su kasance a cikin API ɗin sa:

  1. Saka sabon kashi.
  2. Nemo wani abu tare da maɓallin da aka ba.
  3. Share wani kashi.
  4. Maimaita tazara mai maɓalli a cikin tsarinsu.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOSTsarin bayanai mafi sauƙi wanda zai iya aiwatar da duk ayyuka guda huɗu cikin sauƙi shine bishiyar bincike ta binary. Kowanne daga cikin nodes ɗinsa maɓalli ne da ke raba gabaɗayan ɓangaren maɓallan yara zuwa ƙananan bishiyoyi biyu. A gefen hagu akwai waɗanda suka fi girma fiye da iyaye, kuma a hannun dama - waɗanda suka fi girma. Samun saitin maɓallan da aka ba da oda yana samuwa ta hanyar ɗaya daga cikin fitattun bishiyar bishiyar

Bishiyoyi na binary suna da mahimmanci guda biyu na asali waɗanda ke hana su yin tasiri azaman tsarin bayanan diski. Na farko, matakin ma'aunin su ba shi da tabbas. Akwai babban haɗari na samun bishiyoyi wanda tsayin rassan daban-daban na iya bambanta da yawa, wanda ke dagula al'adar algorithmic na bincike idan aka kwatanta da abin da ake sa ran. Abu na biyu, yawan hanyoyin haɗin kai tsakanin nodes yana hana binaryar bishiyar zama a cikin ƙwaƙwalwar ajiya.Rufe nodes (cikin sharuddan haɗin kai tsakanin su) na iya kasancewa akan shafuka daban-daban a cikin ƙwaƙwalwar ajiya. Sakamakon haka, ko da sauƙaƙan ratsawa na ƙofofin makwabta da yawa a cikin bishiya na iya buƙatar ziyartar shafuka masu kama da juna. Wannan matsala ce ko da lokacin da muka yi magana game da tasiri na binaryar bishiyoyi a matsayin tsarin bayanan ƙwaƙwalwar ajiya, tun da kullun juyawa shafuka a cikin cache na sarrafawa ba shi da arha. Idan ya zo ga yawan haɓaka shafukan da ke da alaƙa daga faifai, abubuwa suna yin muni sosai. abin takaici.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOSB-bishiyoyin, kasancewa juyin halitta na binaryar bishiyoyi, magance matsalolin da aka gano a cikin sakin layi na baya. Na farko, suna daidaita kansu. Abu na biyu, kowane nodes ɗin su yana raba saitin maɓallan yara ba zuwa 2 ba, amma zuwa cikin ƙungiyoyin da aka ba da umarnin M, kuma lambar M na iya zama babba, bisa tsari na ɗaruruwa ko ma dubbai.

Ta haka:

  1. Kowane kumburi yana da adadi mai yawa na maɓallan da aka riga aka ba da oda kuma bishiyoyin sun yi ƙasa sosai.
  2. Itacen yana samun dukiyar yanki a cikin ƙwaƙwalwar ajiya, tun da maɓallan da ke kusa da darajar suna kusa da juna a kan ɗaya ko maƙwabta.
  3. Yana rage adadin nodes ɗin wucewa lokacin saukowa bishiyar yayin aikin bincike.
  4. Yana rage adadin kuɗaɗen da ake karantawa don tambayoyin kewayo, tunda kowannensu ya riga ya ƙunshi babban adadin maɓallan da aka yi oda.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

LMDB yana amfani da bambance-bambancen itacen B da ake kira B+ bishiyar don adana bayanai. Hoton da ke sama yana nuna nau'ikan nodes guda uku da ya ƙunshi:

  1. A saman shine tushen. Ba shi da wani abu da ya wuce manufar ma'ajin bayanai a cikin ma'ajiya. A cikin misalin LMDB guda ɗaya, zaku iya ƙirƙirar bayanai masu yawa waɗanda ke raba sararin adireshi da aka tsara. Kowannensu yana farawa ne daga tushensa.
  2. A matakin mafi ƙasƙanci shine ganye (leaf). Su ne kawai waɗanda suka ƙunshi nau'i-nau'i masu ƙima da aka adana a cikin bayanan. Af, wannan shi ne peculiarity na B + - itatuwa. Idan itacen B na al'ada yana adana sassan ƙima a nodes na duk matakan, to, B + - bambancin shine kawai a mafi ƙasƙanci. Bayan gyara wannan gaskiyar, a cikin abin da ke gaba za mu kira nau'in bishiyar da ake amfani da ita a cikin LMDB kawai itacen B.
  3. Tsakanin tushen da ganye, akwai matakan fasaha 0 ko fiye tare da nodes na kewayawa (reshe). Ayyukan su shine rarraba maɓallan da aka jera a tsakanin ganye.

A zahiri, nodes tubalan ƙwaƙwalwa ne na tsayin da aka kayyade. Girman su shine nau'in girman girman shafukan ƙwaƙwalwar ajiya a cikin tsarin aiki, wanda muka yi magana a sama. Ana nuna tsarin kumburi a ƙasa. Kan kai yana ƙunshe da bayanan meta, mafi bayyanannensu, misali, shine checksum. Na gaba yana zuwa bayani game da kashe-kashe, tare da waɗanda sel masu ɗauke da bayanai suke. Matsayin bayanai na iya zama ko dai maɓalli, idan muna magana ne game da nodes na kewayawa, ko duka maɓalli-darajar nau'i-nau'i a cikin yanayin ganye.Za ku iya karanta ƙarin game da tsarin shafuka a cikin aikin. "Kimanin Kasuwancin Maɓallin Ƙirar Ƙirar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙirar Ƙimar Ƙimar Ƙirar Ƙirar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙimar Ƙirar Ƙimar Ƙirar Ƙirar Ƙimar Ƙirar Ƙimar Ƙirar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙimar Ƙirar Ƙirar Ƙirar Ƙirar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙimar Ƙi )".

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Bayan mun magance abubuwan ciki na nodes ɗin shafi, za mu ƙara wakiltar itacen LMDB B a sauƙaƙe ta hanyar mai zuwa.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Shafuka masu nodes ana jera su a jere akan faifai. Shafukan da ke da lamba mafi girma suna nan zuwa ƙarshen fayil ɗin. Abin da ake kira shafin meta (shafin meta) yana ƙunshe da bayanai game da kashewa, waɗanda za a iya amfani da su don nemo tushen duk bishiyoyi. Lokacin da aka buɗe fayil, LMDB yana duba shafin fayil ɗin ta shafi daga ƙarshe zuwa farkon don neman ingantaccen shafin meta kuma ya nemo bayanan da ke akwai ta ciki.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Yanzu, da samun ra'ayi na ma'ana da tsarin jiki na ƙungiyar bayanai, za mu iya ci gaba da yin la'akari da whale na uku na LMDB. Tare da taimakonsa ne duk gyare-gyaren ajiya ke faruwa ta hanyar ma'amala da kuma keɓancewa da juna, yana ba da ma'ajin bayanai gaba ɗaya har ma da mallakar multiversion.

3.3. Whale #3. kwafi-kan-rubuta

Wasu ayyukan bishiyar B sun haɗa da yin jerin sauye-sauye ga nodes ɗin sa. Misali ɗaya yana ƙara sabon maɓalli zuwa kumburi wanda ya riga ya kai iyakar ƙarfinsa. A wannan yanayin, ya zama dole, na farko, a raba kumburin gida biyu, na biyu kuma, don ƙara hanyar haɗi zuwa sabon kumburin kumburin yaro a cikin iyayensa. Wannan hanya tana da yuwuwar haɗari sosai. Idan saboda wasu dalilai (haɗuwa, rashin wutar lantarki, da dai sauransu) kawai wani ɓangare na canje-canje daga jerin ya faru, to, itacen zai kasance a cikin yanayin da ba daidai ba.

Magani ɗaya na al'ada don yin juriya ga kuskuren bayanai shine ƙara ƙarin tsarin bayanan tushen diski, log ɗin ma'amala, wanda kuma aka sani da log-ahead log (WAL), kusa da itacen B. Fayil ne, a ƙarshensa, kafin gyare-gyaren itacen B da kansa, an rubuta aikin da aka yi niyya. Don haka, idan an gano cin hanci da rashawar bayanai yayin tantance kai, rumbun adana bayanan suna tuntuɓar log ɗin don tsaftace kansa.

LMDB ta zaɓi wata hanya ta dabam azaman hanyar jure rashin kuskure, wacce ake kira kwafi-kan-rubutu. Mahimmancinsa shine, maimakon sabunta bayanai akan wani shafi na yanzu, yana fara kwafe shi gaba ɗaya kuma yana yin duk gyare-gyare a cikin kwafin.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Bugu da ari, don samun bayanan da aka sabunta, ya zama dole don canza hanyar haɗi zuwa kumburi wanda ya zama na zamani a cikin kullin iyaye dangane da shi. Tun da shi ma yana buƙatar gyara don wannan, shi ma an riga an kwafi shi. Tsarin yana ci gaba da recursively har zuwa tushen. Bayanan da ke kan shafin meta shine na ƙarshe don canzawa.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Idan ba zato ba tsammani tsarin ya fado yayin aikin sabuntawa, to ko dai ba za a ƙirƙiri sabon shafin meta ba, ko kuma ba za a rubuta shi zuwa faifai ba har sai ƙarshensa, kuma checksum ɗinsa ba daidai ba ne. A cikin kowane ɗayan waɗannan lokuta biyu, sabbin shafuka ba za su iya isa ba kuma ba za a shafa tsoffin ba. Wannan yana kawar da buƙatar LMDB don rubuta bayanan gaba don kiyaye daidaiton bayanai. De facto, tsarin adana bayanai akan faifai, wanda aka bayyana a sama, yana ɗaukar aikin sa lokaci guda. Rashin bayanin bayanan ma'amala yana ɗaya daga cikin fasalulluka na LMDB, wanda ke ba da saurin karanta bayanai

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Sakamakon ginin, wanda ake kira append-only B-itace, a zahiri yana ba da keɓewar ma'amala da haɓakawa. A cikin LMDB, kowace ma'amala ta buɗe tana da tushen bishiya na zamani mai alaƙa da ita. Matukar ba a kammala cinikin ba, shafukan bishiyar da ke da alaƙa da ita ba za su taɓa canzawa ko sake amfani da su don sabbin nau'ikan bayanai ba. Don haka, kuna iya aiki muddin kuna son daidaitaccen saitin bayanan da ya dace a wurin. lokacin da aka buɗe ma'amala, koda kuwa an ci gaba da sabunta ma'ajiyar a hankali a wannan lokacin. Wannan shine ma'anar multiversioning, yin LMDB ingantaccen tushen bayanai ga ƙaunataccenmu UICollectionView. Bayan buɗe ma'amala, ba kwa buƙatar ƙara sawun ƙwaƙwalwar ajiya na aikace-aikacen, da sauri fitar da bayanan yanzu cikin wasu tsarin ƙwaƙwalwar ajiya, kuna tsoron a bar ku da komai. Wannan fasalin yana bambanta LMDB daga SQLite iri ɗaya, wanda ba zai iya yin alfahari da irin wannan keɓewar gabaɗaya ba. Bayan buɗe ma'amaloli biyu a ƙarshen kuma share wani rikodin a cikin ɗayansu, ba za a iya samun wannan rikodin a cikin na biyun da ya rage ba.

Gefen juyawa na tsabar kudin shine yuwuwar yuwuwar haɓakar amfani da ƙwaƙwalwar kama-da-wane. Zane-zanen yana nuna yadda tsarin bayanai zai kasance idan an gyara shi a lokaci guda tare da bude ma'amaloli 3 masu karantawa suna duba nau'ikan bayanan daban-daban. Tunda LMDB ba zai iya sake yin amfani da nodes waɗanda ake iya samun su daga tushen da ke da alaƙa da ma'amaloli na zahiri, ajiyar ba ta da wani zaɓi sai don ware wani tushe na huɗu a cikin ƙwaƙwalwar ajiya kuma ya sake haɗa shafukan da aka gyara a ƙarƙashinsa.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Anan ba zai zama abin ban mamaki ba don tunawa da sashin kan fayilolin da aka yi taswirar ƙwaƙwalwa. Da alama ƙarin amfani da ƙwaƙwalwar ajiya bai kamata ya dame mu sosai ba, tunda baya ba da gudummawa ga sawun ƙwaƙwalwar ajiyar aikace-aikacen. Duk da haka, a lokaci guda, an lura cewa iOS yana da matukar rowa wajen rarraba shi, kuma ba za mu iya samar da yanki na LMDB terabyte 1 akan uwar garke ko tebur daga kafadar maigidan ba kuma ba ma tunanin wannan fasalin kwata-kwata. Lokacin da zai yiwu, ya kamata ku yi ƙoƙarin kiyaye rayuwar ma'amaloli a matsayin ɗan gajeren lokaci.

4. Zana tsarin tsarin bayanai a saman API ɗin maɓalli-darajar

Bari mu fara nazarin API ta hanyar duba ainihin abubuwan da LMDB ke bayarwa: yanayi da ma'ajin bayanai, maɓalli da ƙima, ma'amaloli da masu sigina.

Bayanan kula game da jerin lambobin

Duk ayyukan da ke cikin LMDB jama'a API suna mayar da sakamakon aikin su ta hanyar lambar kuskure, amma a cikin duk jerin abubuwan da ke gaba an cire cak ɗin sa don taƙaitawa. A aikace, mun yi amfani da lambar mu don yin hulɗa tare da ma'ajiyar. cokali mai yatsa C++ wrappers lmdbxx, wanda kurakurai suka zama kamar keɓan C ++.

A matsayin hanya mafi sauri don haɗa LMDB zuwa aikin iOS ko macOS, Ina ba da CocoaPod dina POSLMDB.

4.1. Abubuwan abstraction na asali

Muhalli

tsarin MDB_env shine ma'ajiyar yanayin cikin gida na LMDB. Iyalin ayyukan da aka riga aka kayyade mdb_env yana ba ka damar saita wasu kaddarorin sa. A cikin mafi sauƙi, ƙaddamar da injin yana kama da wannan.

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

A cikin Mail.ru Cloud aikace-aikace, mun canza tsoho dabi'u don kawai sigogi biyu.

Na farko shine girman sararin adireshi mai kama-da-wane wanda aka zana fayil ɗin ajiya zuwa gare shi. Abin takaici, ko da akan na'ura ɗaya, ƙayyadaddun ƙimar na iya bambanta sosai daga gudu zuwa aiki. Don yin la'akari da wannan fasalin na iOS, muna zaɓar matsakaicin adadin ajiya da kuzari. An fara daga wani ƙima, a jere yana raguwa har sai aikin mdb_env_open ba zai dawo da wani sakamako ba ENOMEM. A ka'idar, akwai wata hanya dabam - da farko ware mafi ƙarancin ƙwaƙwalwar ajiya ga injin, sannan, lokacin da aka karɓi kurakurai. MDB_MAP_FULL, ƙara shi. Duk da haka, ya fi ƙaya yawa. Dalilin shi ne cewa hanya don remapping memory ta amfani da aikin mdb_env_set_map_size ɓata duk abubuwan da aka samu daga injin ɗin a baya (cursors, ma'amaloli, maɓalli da ƙima). Yin lissafi don irin wannan jujjuya abubuwan da suka faru a cikin lambar zai haifar da babban rikitarwa. Idan, duk da haka, ƙwaƙwalwar ajiya yana da ƙauna sosai a gare ku, to wannan na iya zama dalili don kallon cokali mai yatsa wanda ya wuce gaba. MDBX, inda daga cikin abubuwan da aka ayyana akwai "daidaita girman girman bayanan-da-tashi".

Siga na biyu, wanda ƙimar da ba ta dace da mu ba, tana tsara injiniyoyi na tabbatar da amincin zaren. Abin takaici, aƙalla a cikin iOS 10, akwai matsaloli tare da tallafin ma'ajiya na cikin gida. Don haka, a cikin misalin da ke sama, an buɗe ma'ajiyar da tuta MDB_NOTLS. Bugu da kari, shi ma ake bukata cokali mai yatsa C++ wrapper lmdbxxdon yanke masu canji tare da kuma a cikin wannan sifa.

Bayanai

Ma'ajiyar bayanai wani misali ne na daban na itacen B da muka yi magana akai a sama. Buɗewarsa yana faruwa a cikin ma'amala, wanda da farko yana iya zama ɗan ban mamaki.

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

Lallai, ma'amala a cikin LMDB abin ajiya ne, ba takamaiman bayanai ba. Wannan ra'ayi yana ba ku damar aiwatar da ayyukan atomic akan abubuwan da ke cikin ma'ajin bayanai daban-daban. A cikin ka'idar, wannan yana buɗe yiwuwar ƙirar tebur a cikin nau'ikan bayanai daban-daban, amma a wani lokaci na tafi wata hanya, da aka bayyana dalla-dalla a ƙasa.

Maɓallai da ƙima

tsarin MDB_val yana ƙididdige manufar maɓalli da ƙima. Ma'ajiyar ajiyar ba ta da wani ra'ayi game da tarukan su. A gareta, wani abu da ya bambanta shine kawai tsararrun bytes na girman da aka bayar. Matsakaicin girman maɓalli shine 512 bytes.

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

Shagon yana amfani da kwatancen don tsara maɓallai cikin tsari mai hawa. Idan ba ku maye gurbinsa da naku ba, to za a yi amfani da tsoho wanda zai jera su byte-byte a cikin tsari na ƙamus.

Ma'amaloli

An kwatanta na'urar ma'amala daki-daki a ciki babin da ya gabata, don haka a nan zan maimaita manyan kaddarorin su a cikin gajeren layi:

  1. Taimako ga duk kaddarorin asali ACIDMahimman kalmomi: atomity, daidaito, kadaici da dogaro. Ba zan iya taimakawa ba sai dai lura cewa dangane da dorewa akan macOS da iOS akwai matsala da aka gyara a MDBX. Kuna iya karanta ƙarin a cikin su README.
  2. Hanyar da ake bi don yin zaren multithreading an bayyana shi ta tsarin "marubuci ɗaya / masu karatu da yawa". Marubuta suna toshe juna, amma ba sa toshe masu karatu. Masu karatu ba sa toshe marubuta ko juna.
  3. Taimako don ma'amaloli masu ƙayatarwa.
  4. Multiversion goyon bayan.

Multiversioning a cikin LMDB yana da kyau sosai don haka ina so in nuna shi a aikace. Lambar da ke ƙasa tana nuna cewa kowace ma'amala tana aiki tare da daidai sigar bayanan da ta dace a lokacin buɗe ta, ta keɓe gaba ɗaya daga duk canje-canje masu zuwa. Ƙaddamar da ma'ajin da ƙara rikodin gwaji a kansa ba shi da wani sha'awa, don haka ana barin waɗannan al'ada a ƙarƙashin mai lalacewa.

Ƙara shigarwar gwaji

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

Optionally, Ina ba da shawarar gwada wannan dabarar tare da SQLite kuma ga abin da ya faru.

Multiversioning yana kawo fa'idodi masu kyau ga rayuwar mai haɓaka iOS. Amfani da wannan kadarorin, zaku iya sauƙi da ta halitta daidaita ƙimar sabunta tushen bayanai don siffofin allo bisa la'akari da ƙwarewar mai amfani. Misali, bari mu dauki irin wannan fasalin na aikace-aikacen Cloud.ru na Mail.ru azaman abun ciki mai sarrafa kansa daga gidan yanar gizon tsarin. Tare da kyakkyawar haɗi, abokin ciniki zai iya ƙara hotuna da yawa a cikin dakika zuwa uwar garken. Idan kun sabunta bayan kowace zazzagewa UICollectionView tare da abun cikin mai jarida a cikin gajimare mai amfani, zaku iya mantawa game da 60fps da gungurawa santsi yayin wannan tsari. Don hana sabuntawa akai-akai, kuna buƙatar iyakance ƙimar canjin bayanai ta asali UICollectionViewDataSource.

Idan database ba ya goyan bayan multiversioning kuma yana ba ku damar yin aiki kawai tare da halin yanzu, to, don ƙirƙirar hoto mai tsayayyen lokaci, kuna buƙatar kwafa shi ko dai zuwa tsarin bayanan ƙwaƙwalwar ajiya ko zuwa tebur na wucin gadi. Duk waɗannan hanyoyin suna da tsada sosai. A cikin yanayin ma'ajiya na ƙwaƙwalwar ajiya, muna samun duka farashin ƙwaƙwalwar ajiya da ke haifar da adana abubuwan da aka gina da kuma farashin lokacin da ke da alaƙa da sake fasalin ORM. Amma ga tebur na wucin gadi, wannan shine jin daɗin da ya fi tsada, wanda ke da ma'ana kawai a cikin lokuta marasa mahimmanci.

Multiversioning LMDB yana magance matsalar kiyaye ingantaccen tushen bayanai ta hanya mai kyau. Ya isa kawai don buɗe ma'amala da voila - har sai mun kammala shi, an tabbatar da saita saitin bayanai. Hankalin ƙimar sabuntawar sa yanzu gaba ɗaya yana hannun Layer na gabatarwa, ba tare da wani babban abin albarkatu ba.

Masu lanƙwasa

Masu lanƙwasa suna ba da tsari don jujjuyawa cikin tsari akan maɓalli-daraja nau'i-nau'i ta hanyar bishiyar B. Idan ba tare da su ba, ba zai yuwu a iya yin samfura da kyaun tebur a cikin bayanan ba, wanda yanzu muka juya zuwa ga.

4.2. Teburin Model

Maɓalli na oda kayan yana ba ku damar gina babban matakin abstraction kamar tebur akan saman abubuwan ƙayyadaddun abubuwa. Bari mu yi la'akari da wannan tsari akan misalin babban tebur na abokin ciniki na girgije, wanda aka adana bayanai game da duk fayiloli da manyan fayiloli na mai amfani.

Tsarin tebur

Ɗaya daga cikin al'amuran gama gari waɗanda ya kamata a kaifi tsarin tebur mai bishiyar babban fayil shine zaɓar duk abubuwan da ke cikin kundin da aka ba da. Jerin adjacency. Don aiwatar da shi a saman ma'ajiyar ƙimar maɓalli, wajibi ne a tsara maɓallan fayiloli da manyan fayiloli ta hanyar da za a haɗa su bisa ga mallakar kundin adireshi na iyaye. Bugu da ƙari, don nuna abubuwan da ke cikin kundin adireshi a cikin hanyar da aka saba da mai amfani da Windows (fayiloli da farko, sannan fayiloli, duka biyu ana jera su ta haruffa), dole ne a haɗa ƙarin filayen da suka dace a cikin maɓalli.

Hoton da ke ƙasa yana nuna yadda, dangane da aikin, wakilcin maɓallai azaman tsararrun bytes na iya yi kama. Na farko, ana sanya bytes tare da mai gano bayanan iyaye (ja), sannan tare da nau'in (kore), kuma tuni a cikin wutsiya mai suna (blue) An jera su ta tsohowar LMDB kwatancen cikin tsari na ƙamus, ana ba da oda a ciki. hanyar da ake bukata. Maɓallin kewayawa bi da bi tare da prefix iri ɗaya yana ba mu ƙimar da ke da alaƙa da su a cikin tsari wanda yakamata a nuna su a cikin mahallin mai amfani (dama), ba tare da buƙatar ƙarin aiki ba.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Serializing Maɓallai da Darajoji

Akwai hanyoyi da yawa don serialize abubuwa a duniya. Tun da ba mu da wani abin da ake bukata face gudun, mun zaɓi mafi sauri da zai yiwu wa kanmu - juji na ƙwaƙwalwar ajiya wanda misalin tsarin yaren C ya shagaltar da shi. Don haka, maɓalli na kundin adireshi za a iya tsara shi ta hanyar tsarin mai zuwa. NodeKey.

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

Don ajiyewa NodeKey a ajiya bukatar a cikin abu MDB_val sanya mai nuni ga bayanai a adireshin farkon tsarin, kuma ƙididdige girman su tare da aikin sizeof.

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

A cikin babi na farko kan sharuɗɗan zaɓin bayanai, na ambata rage girman rabo a matsayin wani ɓangare na ayyukan CRUD a matsayin muhimmin zaɓi na zaɓi. Lambar aiki serialize yana nuna yadda, a cikin yanayin LMDB, za a iya guje wa gaba ɗaya idan an shigar da sabbin bayanai a cikin ma'ajin bayanai. Jeri mai shigowa na bytes daga uwar garken an fara canza su zuwa tsarin tarawa, sannan a jefar da su da sauƙi cikin ma'ajiyar. Ganin cewa har ila yau babu wani yanki mai ƙarfi a cikin LMDB, zaku iya samun yanayi mai ban sha'awa ta ma'auni na iOS - yi amfani da ƙwaƙwalwar ajiya kawai don aiki tare da bayanai har zuwa hanyar sadarwa zuwa faifai!

Maɓallan yin oda tare da kwatancen binary

Maɓalli na oda yana ba da aiki ta wani aiki na musamman da ake kira comparator. Tun da injin ɗin bai san komai ba game da ilimin tafsirin bytes ɗin da suke ɗauke da shi, mai kwatanta kwatancen ba shi da wani zaɓi sai dai ya tsara maɓallan a cikin tsari na ƙamus, yana yin amfani da kwatancen byte-byte. Yin amfani da shi don tsara gine-gine daidai yake da aski da gatari mai sassaƙa. Koyaya, a lokuta masu sauƙi, na sami wannan hanyar karɓuwa. An kwatanta madadin a ƙasa, amma a nan zan lura da rake biyu da suka warwatse a hanya.

Abu na farko da za a tuna shi ne wakilcin ƙwaƙwalwar ajiya na nau'ikan bayanai na farko. Don haka, akan duk na'urorin Apple, ana adana masu canjin lamba a cikin tsari Ƙananan Endian. Wannan yana nufin cewa mafi ƙanƙantar byte zai kasance a hagu, kuma ba za ku iya rarraba lamba ta amfani da kwatancen byte-byte ba. Misali, ƙoƙarin yin wannan tare da saitin lambobi daga 0 zuwa 511 zai haifar da sakamako mai zuwa.

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

Don magance wannan matsala, dole ne a adana lambobin a cikin maɓalli a cikin sigar da ta dace da mai kwatanta byte. Ayyuka daga iyali zasu taimaka wajen aiwatar da canjin da ake bukata. hton* (musamman htons don lambobi biyu-byte daga misalin).

Tsarin wakiltar kirtani a cikin shirye-shirye shine, kamar yadda kuka sani, gabaɗaya tarihin. Idan ma'anar kirtani, da kuma bayanan da aka yi amfani da su don wakiltar su a cikin ƙwaƙwalwar ajiya, yana nuna cewa za a iya samun fiye da ɗaya byte a kowane hali, to yana da kyau a yi watsi da ra'ayin yin amfani da tsoho mai kwatanta.

Abu na biyu da ya kamata a lura da shi shi ne ka'idodin daidaitawa tsarin filin tarawa. Saboda su, za a iya kafa bytes tare da darajar datti a cikin ƙwaƙwalwar ajiya tsakanin filayen, wanda, ba shakka, ya karya byte. Don kawar da datti, dole ne ko dai ku bayyana filayen cikin ƙayyadaddun tsari, kiyaye ƙa'idodin daidaitawa a zuciya, ko amfani da sifa a cikin sanarwar tsarin. packed.

Maɓalli na oda ta hanyar kwatancen waje

Maɓallin kwatancen maɓalli na iya zama mai rikitarwa ga mai kwatanta binary. Ɗaya daga cikin dalilai masu yawa shine kasancewar filayen fasaha a cikin tsarin. Zan misalta faruwar su akan misalin wani maɓalli da muka saba da shi don ɓangaren directory.

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

Don duk sauƙin sa, a mafi yawan lokuta yana cinye ƙwaƙwalwar ajiya da yawa. Buffer take shine bytes 256, kodayake akan matsakaita fayil da sunayen manyan fayiloli ba kasafai ke wuce haruffa 20-30 ba.

Ɗaya daga cikin daidaitattun dabarun inganta girman rikodin shine a datse shi don dacewa da ainihin girmansa. Mahimmancinsa shi ne cewa abubuwan da ke cikin kowane fage masu tsayi masu canzawa ana adana su a cikin buffer a ƙarshen tsarin, kuma ana adana tsayin su a cikin mabanbanta daban-daban, daidai da wannan hanya, maɓallin. NodeKey yana canzawa ta hanya mai zuwa.

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

Bugu da ari, yayin serialization, ba a fayyace matsayin girman bayanai ba sizeof gaba dayan tsarin, kuma girman dukkan filayen yana tsayayyen tsayi tare da girman ainihin ɓangaren da aka yi amfani da shi na buffer.

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

Sakamakon sake fasalin, mun sami babban tanadi a cikin sararin da maɓallan ke mamaye. Koyaya, saboda filin fasaha nameLength, tsoho mai kwatanta binary ba ya dace da kwatancen maɓalli. Idan ba mu maye gurbinsa da namu ba, to, tsayin sunan zai zama fifiko mafi fifiko wajen rarraba fiye da sunan kansa.

LMDB yana ba kowane ma'ajin bayanai damar samun aikin kwatanta maɓalli na kansa. Ana yin wannan ta amfani da aikin mdb_set_compare sosai kafin budewa. Don dalilai masu ma'ana, ba za a iya canza ma'ajin bayanai ba tsawon rayuwarsa. A wurin shigarwa, mai kwatanta yana karɓar maɓallai biyu a tsarin binary, kuma a wurin fitarwa yana mayar da sakamakon kwatanta: ƙasa da (-1), mafi girma fiye da (1) ko daidai (0). Pseudocode don NodeKey yayi kama da haka.

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

Matukar duk maɓallan da ke cikin ma'ajin bayanai iri ɗaya ne, ya halatta a jefa wakilcin byte ɗinsu ba tare da wani sharadi ba ga nau'in tsarin aikace-aikacen maɓalli. Akwai nuance guda ɗaya a nan, amma za a tattauna kaɗan kaɗan a cikin sashin "Karatun Karatu".

Serialization darajar

Tare da maɓallan bayanan da aka adana, LMDB yana aiki sosai sosai. Ana kwatanta su da juna a cikin tsarin kowane aikace-aikacen aikace-aikacen, kuma aikin duka bayani ya dogara da saurin mai kwatanta. A cikin kyakkyawar duniya, tsoho na binary comparator ya kamata ya isa ya kwatanta maɓallan, amma idan da gaske dole ne ku yi amfani da naku, to hanya don lalata maɓallai a cikinta yakamata ta kasance cikin sauri.

Ma'ajiyar bayanai ba ta da sha'awar musamman ga Ƙimar-ɓangaren rikodin (darajar). Juya shi daga wakilcin byte zuwa abu yana faruwa ne kawai lokacin da lambar aikace-aikacen ta riga ta buƙaci, misali, don nuna shi akan allon. Tun da yake wannan yana faruwa ba da daɗewa ba, abubuwan da ake buƙata don saurin wannan hanya ba su da mahimmanci, kuma a cikin aiwatar da shi muna da 'yanci don mai da hankali kan dacewa. Misali, don tsara metadata game da fayilolin da ba a sauke su ba, muna amfani da su. NSKeyedArchiver.

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

Duk da haka, akwai lokuta lokacin da aikin yana da mahimmanci. Misali, lokacin adana meta-bayani game da tsarin fayil na gajimaren mai amfani, muna amfani da jujjuyar ƙwaƙwalwar abu iri ɗaya. Babban abin da ke cikin aikin samar da wakilcin jeri-jefi shine gaskiyar cewa abubuwan da ke cikin kundin ana yin su ta hanyar matsayi na aji.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Don aiwatar da shi a cikin harshen C, ana fitar da takamaiman filayen magada a cikin sassa daban-daban, kuma an ƙayyade haɗin su tare da tushe ɗaya ta hanyar fagen nau'in ƙungiyar. An ƙayyade ainihin abun ciki na ƙungiyar ta nau'in sifa na fasaha.

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

Ƙara da sabunta bayanan

Za'a iya ƙara maɓalli da ƙima a cikin shagon. Don wannan, ana amfani da aikin mdb_put.

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

A matakin daidaitawa, ana iya ba da izini ko hana ma'ajiyar adana bayanai da yawa tare da maɓalli iri ɗaya. Idan an hana kwafin maɓallai, to lokacin shigar da rikodi, zaku iya tantance ko sabunta rikodin da aka rigaya ya kasance an yarda ko a'a. Idan fraying zai iya faruwa ne kawai a sakamakon kuskure a cikin lambar, to, za ku iya yin inshora a kansa ta hanyar ƙayyade tuta. NOOVERWRITE.

Rubutun Karatu

Ayyukan karanta bayanan a cikin LMDB shine mdb_get. Idan maɓalli-darajar biyu suna wakilta ta tsarin da aka zubar a baya, to wannan hanya tayi kama da wannan.

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

Jerin da aka gabatar yana nuna yadda serialization ta hanyar jujjuya tsarin ke ba ku damar kawar da ƙayyadaddun ƙima ba kawai lokacin rubutu ba, amma lokacin karanta bayanai. An samo daga aiki mdb_get mai nuni yana duba daidai adreshin ƙwaƙwalwar ajiya inda ma'ajin bayanai ke adana wakilcin byte na abu. A gaskiya ma, muna samun nau'in ORM, kusan kyauta yana ba da saurin karatun bayanai. Tare da duk kyawawan hanyoyin da ake bi, wajibi ne a tuna da abubuwa da yawa da ke hade da shi.

  1. Don ma'amala mai karantawa kawai, mai nuni zuwa tsarin ƙima yana da tabbacin ya ci gaba da aiki kawai har sai an rufe ciniki. Kamar yadda aka ambata a baya, shafukan B-itace wanda abin yake zaune, godiya ga ka'idar kwafi-kan-rubutu, ba su canzawa idan dai aƙalla ma'amala ɗaya tana nufin su. A lokaci guda, da zarar an kammala ma'amala ta ƙarshe da ke da alaƙa da su, ana iya sake amfani da shafukan don sabbin bayanai. Idan ya zama dole don abubuwa su tsira daga ma'amalar da ta haifar da su, to har yanzu dole ne a kwafi su.
  2. Don ma'amala da sake rubutawa, mai nuni ga ƙimar tsarin-ƙimar zai kasance mai aiki ne kawai har sai hanyar gyara ta farko (rubutu ko share bayanai).
  3. Ko da yake tsarin NodeValue ba cikakke ba, amma an datsa (duba ƙaramin sashe "Yi odar maɓallan ta hanyar kwatancen waje"), ta hanyar mai nuni, zaka iya shiga cikin sauƙi cikin filayen sa. Babban abu shine kada kuyi watsi da shi!
  4. Babu wani hali ba za ku iya gyara tsarin ta hanyar ma'anar da aka karɓa ba. Duk canje-canje dole ne a yi kawai ta hanyar mdb_put. Duk da haka, tare da duk sha'awar yin wannan, ba zai yi aiki ba, tun da yankin ƙwaƙwalwar ajiya inda wannan tsarin yake an tsara shi a cikin yanayin karantawa kawai.
  5. Mayar da fayil zuwa sararin adireshi na tsari don, alal misali, ƙara girman girman ajiya ta amfani da aikin mdb_env_set_map_size gaba ɗaya yana ɓarna duk ma'amaloli da abubuwan da ke da alaƙa gabaɗaya da masu nuni don karanta abubuwa musamman.

A ƙarshe, ƙarin fasalin yana da maƙarƙashiya ta yadda bayyana ainihin sa bai dace da ƙarin batu ɗaya ba. A cikin babi a kan itacen B, na ba da zane na tsarin shafukanta don tunawa. Yana biyowa daga gare ta cewa adireshin farkon buffer tare da bayanan serialized na iya zama cikakken sabani. Saboda wannan, mai nuna musu, wanda aka samu a cikin tsarin MDB_val kuma jefawa zuwa mai nuni ga tsari gabaɗaya baya daidaitawa. A lokaci guda kuma, tsarin gine-gine na wasu kwakwalwan kwamfuta (a cikin yanayin iOS, wannan shine armv7) yana buƙatar adireshin kowane bayanai ya zama nau'i na girman kalmar na'ura, ko, a wasu kalmomi, bitness na tsarin. (na armv7, wannan shine 32 bits). A wasu kalmomi, aiki kamar *(int *foo)0x800002 a kansu ana daidaita su don tserewa kuma ya kai ga zartar da hukunci EXC_ARM_DA_ALIGN. Akwai hanyoyi guda biyu don guje wa irin wannan mummunan makoma.

Na farko shine a kwafi bayanan zuwa wani sanannen tsarin da ya dace tukuna. Misali, akan kwatancen al'ada, wannan zai bayyana kamar haka.

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

Wata hanyar ita ce sanar da mai tarawa a gaba cewa tsarin da ke da maɓalli da ƙima bazai daidaita su ta amfani da sifa ba. aligned(1). Akan ARM tasirin iri ɗaya zai iya zama cimma da kuma amfani da sifa mai cike da ƙima. Yin la'akari da cewa yana taimakawa wajen inganta sararin samaniya da tsarin ya mamaye, wannan hanya ta fi dacewa da ni, ko da yake samfur don ƙara farashin ayyukan samun bayanai.

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

Tambayoyin Range

Don ƙididdige rukuni na rikodi, LMDB yana samar da abstraction na siginan kwamfuta. Bari mu kalli yadda ake aiki da shi ta amfani da misalin tebur tare da metadata girgije mai amfani da muka saba da mu.

A matsayin wani ɓangare na nuna jerin fayiloli a cikin kundin adireshi, kuna buƙatar nemo duk maɓallan waɗanda fayilolin ƴaƴan sa da manyan manyan fayiloli ke da alaƙa da su. A cikin sassan da suka gabata, mun tsara maɓallan NodeKey ta yadda za a fara odar su ta ID directory na iyayensu. Don haka, a zahiri, aikin samun abubuwan da ke cikin babban fayil yana raguwa zuwa sanya siginan kwamfuta a saman iyakar rukunin maɓalli tare da prefix ɗin da aka ba da shi, sannan sake maimaitawa zuwa ƙananan iyaka.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Kuna iya nemo dauri na sama "a kan goshi" ta hanyar bincike na jeri. Don yin wannan, ana sanya siginan kwamfuta a farkon jerin maɓallan da ke cikin ma'ajin bayanai sannan a ƙara har sai maɓalli tare da mai gano bayanan iyaye ya bayyana a ƙasan sa. Wannan hanyar tana da fa'idodi 2 na zahiri:

  1. Ƙididdigar layi na bincike, kodayake, kamar yadda kuka sani, a cikin bishiyoyi gabaɗaya da kuma a cikin bishiyar B musamman, ana iya yin shi a lokacin logarithmic.
  2. A banza, duk shafukan da ke gaba da wanda ake so ana ɗaga su daga fayil ɗin zuwa babban ƙwaƙwalwar ajiya, wanda yake da tsada sosai.

Abin farin ciki, API ɗin LMDB yana ba da ingantacciyar hanya don fara sanya siginan kwamfuta Don yin wannan, kuna buƙatar ƙirƙirar maɓalli wanda aka san darajarsa bai kai ko daidai da maɓalli da ke saman iyakar tazarar ba. Misali, dangane da lissafin da ke sama, za mu iya yin maɓalli a cikin abin da filin parentId zai zama daidai da 2, kuma duk sauran suna cike da sifili. Irin wannan maɓalli da aka cika ana ciyar da shi zuwa shigar da aikin mdb_cursor_get nuna aiki 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);

Idan an sami babban iyaka na rukunin maɓallan, to, mu sake maimaita shi har sai mun hadu ko maɓalli tare da wani. parentId, ko makullin ba za su ƙare ba kwata-kwata

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

Abin da ke da kyau, a matsayin ɓangare na maimaitawa ta amfani da mdb_cursor_get, muna samun ba kawai maɓalli ba, har ma da darajar. Idan, don cika sharuɗɗan zaɓin, ya zama dole don bincika, a tsakanin sauran abubuwa, filayen daga ɓangaren ƙimar rikodin, to suna da sauƙin isa ga kansu ba tare da ƙarin gestures ba.

4.3. Samfuran alaƙa tsakanin teburi

Har zuwa yau, mun sami damar yin la'akari da duk abubuwan ƙira da aiki tare da bayanan tebur guda ɗaya. Za mu iya cewa tebur saitin bayanan da aka jera ne wanda ya ƙunshi maɓalli-daraja nau'i-nau'i iri ɗaya. Idan ka nuna maɓalli a matsayin rectangle da ƙimar da ke da alaƙa a matsayin akwati, za ka sami zane na gani na bayanan.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Duk da haka, a rayuwa ta ainihi, da wuya a iya samun ta da ɗan ƙaramin jini. Sau da yawa a cikin rumbun adana bayanai ana buƙata, na farko, don samun teburi da yawa, na biyu kuma, don aiwatar da zaɓi a cikin su a cikin tsari daban-daban da maɓalli na farko. Wannan sashe na ƙarshe ya keɓe ne ga al'amuran halittarsu da haɗin kai.

Tables na fihirisa

Ka'idar girgije tana da sashin "Gallery". Yana nuna abun cikin mai jarida daga gajimaren gabaɗaya, wanda aka tsara ta kwanan wata. Don aiwatar da mafi kyawun zaɓi na irin wannan zaɓi, kusa da babban tebur, kuna buƙatar ƙirƙirar wani tare da sabon nau'in maɓalli. Za su ƙunshi fili tare da ranar da aka ƙirƙiri fayil ɗin, wanda zai yi aiki azaman ma'aunin rarrabuwa na farko. Domin sababbin maɓallan suna nuni ga bayanai iri ɗaya da maɓallan da ke cikin tebur ɗin da ke ƙasa, ana kiran su maɓallan fihirisa. An nuna su a cikin orange a cikin hoton da ke ƙasa.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Domin raba maɓallan teburi daban-daban daga juna a cikin rumbun adana bayanai iri ɗaya, an ƙara ƙarin teburId na filin fasaha ga dukkansu. Ta hanyar sanya shi mafi girman fifiko don rarrabuwa, za mu tara maɓallan farko ta tebur, kuma mun riga mun shiga cikin tebur - bisa ga namu dokokin.

Maɓallin fihirisa yana nufin bayanai iri ɗaya da maɓallin farko. Aiwatar da kai tsaye na wannan kadarorin ta hanyar haɗa shi da kwafin ɓangaren ƙimar maɓalli na farko ba shi da kyau daga wurare da yawa a lokaci ɗaya:

  1. Daga mahangar da aka mamaye sararin samaniya, metadata na iya zama mai wadata sosai.
  2. Daga mahangar aiki, tun lokacin da ake sabunta metadata na kumburi, dole ne ka sake rubuta maɓallai biyu.
  3. Daga ra'ayi na goyon bayan lambar, bayan haka, idan muka manta don sabunta bayanai don ɗaya daga cikin maɓallan, za mu sami kuskuren kuskuren rashin daidaituwa na bayanai a cikin ajiya.

Na gaba, za mu yi la'akari da yadda za a kawar da waɗannan kasawa.

Tsarin dangantaka tsakanin tebur

Tsarin ya dace sosai don haɗa tebur mai ƙididdiga tare da babba "key as value". Kamar yadda sunansa ke nunawa, ɓangaren ƙimar rikodin maƙasudin kwafi ne na ƙimar maɓalli na farko. Wannan hanyar tana kawar da duk rashin lahani da aka jera a sama masu alaƙa da adana kwafin ɓangaren ƙima na rikodin farko. Kudi kawai shine don samun darajar ta maɓalli, kuna buƙatar yin tambayoyi 2 zuwa ma'ajin bayanai maimakon ɗaya. A tsari, da sakamakon tsarin bayanai shine kamar haka.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Wani tsari don tsara dangantaka tsakanin tebur shine "maɓalli mai yawa". Mahimmancinsa shine ƙara ƙarin sifofi zuwa maɓalli, waɗanda ake buƙata ba don rarrabuwa ba, amma don sake ƙirƙirar maɓallin haɗin gwiwa. Akwai ainihin misalan amfani da shi a cikin aikace-aikacen Cloud.ru Cloud, duk da haka, don guje wa nutsewa cikin ruwa mai zurfi a cikin mahallin ƙayyadaddun tsarin tsarin iOS, zan ba da ƙagaggu, amma misali mafi fahimta.

Abokan ciniki na wayar hannu na Cloud suna da shafi wanda ke nuna duk fayiloli da manyan fayiloli waɗanda mai amfani ya raba tare da wasu mutane. Tun da akwai ƙananan irin waɗannan fayilolin, kuma akwai takamaiman bayani game da tallan da ke da alaƙa da su (wanda aka ba da damar yin amfani da su, tare da waɗanne haƙƙoƙi, da sauransu), ba zai zama ma'ana ba don ɗora shi da ƙimar ƙimar. rikodin a cikin babban tebur. Koyaya, idan kuna son nuna irin waɗannan fayilolin a layi, to har yanzu kuna buƙatar adana su a wani wuri. Magani na halitta shine ƙirƙirar tebur daban don shi. A cikin zanen da ke ƙasa, an sanya maɓallinsa da "P", kuma ana iya maye gurbin mai riƙe da "propname" tare da ƙarin takamaiman ƙimar "bayanin jama'a".

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Duk metadata na musamman, saboda abin da aka ƙirƙira sabon tebur, ana matsar da shi zuwa ɓangaren ƙimar rikodin. A lokaci guda kuma, ba na son kwafin bayanai game da fayiloli da manyan fayilolin da aka riga aka adana a cikin babban teburi. Madadin haka, ana ƙara ƙarin bayanai zuwa maɓalli na "P" a cikin nau'in filayen "node ID" da "timestamp". Godiya gare su, zaku iya gina maɓallin fihirisar, ta inda zaku iya samun maɓallin farko, ta inda, a ƙarshe, zaku iya samun metadata na kumburi.

Kammalawa

Muna kimanta sakamakon aiwatar da LMDB da kyau. Bayan shi, adadin daskarewa aikace-aikacen ya ragu da kashi 30%.

Haskaka da talauci na mahimman ƙimar LMDB a cikin aikace-aikacen iOS

Sakamakon aikin da aka yi ya sami amsa a wajen ƙungiyar iOS. A halin yanzu, daya daga cikin manyan sassan "Files" a cikin aikace-aikacen Android shima ya koma amfani da LMDB, kuma wasu sassan suna kan hanya. Harshen C, wanda a cikinsa aka aiwatar da maɓalli-darajar ma'ajiyar, ya kasance taimako mai kyau don fara sanya aikace-aikacen ya ɗaure a kusa da shi ta hanyar giciye-dandamali a cikin yaren C ++. Don haɗin kai mara kyau na ɗakin karatu na C ++ da aka samu tare da lambar dandamali a cikin Objective-C da Kotlin, an yi amfani da janareta na lamba Jinni daga Dropbox, amma wannan wani labari ne.

source: www.habr.com

Add a comment