ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

I ka hāʻule o 2019, ua loaʻa kahi hanana lōʻihi i ka hui Mail.ru Cloud iOS. ʻO ka waihona waihona nui no ka mālama mau ʻana o ka mokuʻāina noiʻi ua lilo i mea exotic no ka honua kelepona Uila Memory-Mapped Database (LMDB). Ma lalo o ka ʻoki e hāʻawi mākou iā ʻoe i kahi loiloi kikoʻī o ia mea ma nā ʻāpana ʻehā. ʻO ka mea mua, e kamaʻilio e pili ana i nā kumu o ia koho ʻole a paʻakikī. A laila e neʻe mākou e noʻonoʻo i nā pou ʻekolu ma ka puʻuwai o ka hoʻolālā LMDB: nā faila i hoʻomanaʻo ʻia, B + -lāʻau, kope-ma-kākau ke ala no ka hoʻokō ʻana i ka transactionality a me ka multiversion. ʻO ka hope, no ka meaʻai - ka ʻāpana hana. Ma laila mākou e nānā ai i ka hoʻolālā ʻana a me ka hoʻokō ʻana i kahi schema database me nā papa he nui, me kahi index one, ma luna o ka API haʻahaʻa kiʻekiʻe.

Nā mea

  1. Hoʻoikaika no ka hoʻokō
  2. Hoʻonoho ʻia ʻo LMDB
  3. ʻEkolu kia o LMDB
    3.1. Whale #1. Nā waihona palapala hoʻomanaʻo
    3.2. Whale #2. B+-lāʻau
    3.3. Whale #3. Kākau-ma-kākau
  4. Ke hoʻolālā ʻana i ka ʻikepili ma luna o ka API waiwai kī
    4.1. Nā unuhi kumu
    4.2. Papa Hoʻohālike
    4.3. Hoʻohālike i nā pilina ma waena o nā papa

1. Hoʻoikaika no ka hoʻokō

Hoʻokahi makahiki i ka makahiki 2015, lawe mākou i ka pilikia e ana i ka pinepine o ka lohi o ka interface o kā mākou noi. Ua hana mākou i kēia no ke kumu. Ua loaʻa iā mākou nā hoʻopiʻi pinepine ʻana i kekahi manawa ua pau ka noi i ka pane ʻana i nā hana mea hoʻohana: ʻaʻole hiki ke paʻi ʻia nā pihi, ʻaʻole ʻōwili nā papa inoa, etc. E pili ana i ka mechanics o nā ana hai aku ma AvitoTech, no laila ke hāʻawi wale nei au i ke kauoha o nā helu.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Ua lilo nā hualoaʻa ana i wai anuanu no mākou. Ua ʻike ʻia he nui nā pilikia ʻē aʻe i hoʻokumu ʻia e ka manuahi ma mua o nā pilikia ʻē aʻe. Inā ma mua o ka ʻike ʻana i kēia ʻoiaʻiʻo ʻo ka hōʻailona ʻenehana koʻikoʻi o ka maikaʻi i hāʻule ʻole, a laila ma hope o ka nānā ʻana hoʻololi ma ka pahu hau.

Ua kūkulu ʻia dashboard me nā pahu hau a ma hope o ka hoʻolilo ʻana heluna и nā kūlana ka nānā ʻana i kā lākou mau kumu, ua maopopo ka ʻenemi nui - ua hoʻokō ʻia ka loiloi ʻoihana koʻikoʻi ma ka pae nui o ka noi. ʻO ka hopena kūlohelohe i kēia hilahila ʻo ia ka makemake nui e hoʻokuʻu iā ia i loko o nā kahawai hana. No ka hoʻoponopono ʻōnaehana i kēia pilikia, ua hoʻohana mākou i kahi hoʻolālā multi-threaded e pili ana i nā mea hana māmā. Ua hoʻolaʻa wau iā ia i kāna hoʻololi ʻana no ka honua iOS ʻelua kaula ma Twitter hui a ʻatikala ma Habré. Ma ke ʻano o ka moʻolelo o kēia manawa, makemake wau e hoʻoikaika i kēlā mau ʻano o ka hoʻoholo i hoʻololi i ke koho ʻana i ka waihona.​

Manaʻo ke kumu hoʻohālike o ka ʻōnaehana ʻōnaehana e lilo ka multithreading i kāna kumu lua. ʻO nā mea hoʻohālike i loko e like me ka hele ʻana i nā palena kahawai. A ʻaʻole lākou e hana i kēia i kekahi manawa a ma ʻaneʻi a ma ʻaneʻi, akā kokoke mau a ma nā wahi āpau

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO ka waihona ʻikepili kekahi o nā ʻāpana pōhaku kihi i ke kiʻi i hōʻike ʻia. ʻO kāna hana nui ka hoʻokō ʻana i ka macropattern Waihona Puke. Inā hoʻohana ʻia i ka honua ʻoihana e hoʻonohonoho i ka hoʻonohonoho ʻana i ka ʻikepili ma waena o nā lawelawe, a laila ma ke ʻano o ka hale hana keaka - ʻikepili ma waena o nā kaula. No laila, pono mākou i kahi waihona ʻaʻole e hoʻopilikia liʻiliʻi i ka wā e hana pū ai me ia i loko o kahi kaiapuni multi-threaded. ʻO ka mea nui, ʻo ia hoʻi, ʻo nā mea i loaʻa mai ia mea pono e palekana ma ka liʻiliʻi, a ʻaʻole hiki ke hoʻololi ʻia. E like me kāu e ʻike ai, hiki ke hoʻohana ʻia ka mea hope mai nā kaula he nui me ka ʻole o ka hoʻopaʻa ʻana, he hopena maikaʻi ia i ka hana.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOSʻO ka lua o ka mea nui i hoʻohuli i ke koho o ka waihona ʻo kā mākou kapua API. Ua hoʻoikaika ʻia e ka hoʻonohonoho hoʻonohonoho ʻana i hāpai ʻia e git. E like me ia, mākou i manaʻo ai API hoʻopahemo-mua, ʻoi aku ka maikaʻi ma mua o ke kūpono no nā mea kūʻai kapua. Ua manaʻo ʻia ʻo lākou e pume wale i ke kūlana piha o ke ao i hoʻokahi manawa, a laila e hoʻonohonoho ʻia i ka hapa nui o nā hihia ma o ka hoʻololi ʻana i nā loli. Auwe, aia wale nō kēia manawa ma ka ʻaoʻao theoretical, a ʻaʻole i aʻo nā mea kūʻai aku pehea e hana ai me nā patch i ka hoʻomaʻamaʻa. Nui nā kumu kumu no kēia, i ʻole e hoʻopaneʻe i ka hoʻolauna ʻana, e haʻalele mākou i nā brackets. I kēia manawa, ʻo ka mea i ʻoi aku ka hoihoi, ʻo ia nā hopena aʻoaʻo o ka haʻawina e pili ana i ka mea e hana ai ke ʻōlelo ʻo API "A" a ʻaʻole ʻōlelo kāna mea kūʻai aku "B".

No laila, inā ʻoe e noʻonoʻo i ka git, ka mea, i ka wā e hoʻokō ai i kahi kauoha huki, ma kahi o ka hoʻopili ʻana i nā pā i kahi snapshot kūloko, e hoʻohālikelike i kona kūlana piha me ka mokuʻāina kikowaena piha, a laila e loaʻa iā ʻoe kahi manaʻo pololei o ke ʻano o ka hoʻonohonoho ʻana i ke ao. nā mea kūʻai aku. He mea maʻalahi ke koho i ka hoʻokō ʻana, pono ʻoe e hoʻokaʻawale i ʻelua lāʻau DOM i ka hoʻomanaʻo me ka ʻike-meta e pili ana i nā kikowaena āpau a me nā faila kūloko. ʻIke ʻia inā kūʻai ka mea hoʻohana i 500 tausani mau faila i ke ao, a laila e hoʻonohonoho pono iā ia e hana hou a luku i ʻelua mau lāʻau me 1 miliona nodes. Akā, ʻo kēlā me kēia node he hōʻuluʻulu i loaʻa i kahi pakuhi o nā subobjects. Ma kēia ʻano, ua manaʻo ʻia nā hopena profiling. Ua ʻike ʻia ʻoiai me ka ʻole o ka noʻonoʻo ʻana i ka algorithm hui ʻana, ʻo ke kaʻina hana o ka hana ʻana a me ka luku ʻana i kahi helu nui o nā mea liʻiliʻi e kūʻai i kahi peni nani. o nā palapala hoʻohana. ʻO ka hopena, hoʻoponopono mākou i ka lua koʻikoʻi koʻikoʻi i ke koho ʻana i kahi waihona - ka hiki ke hoʻokō i nā hana CRUD me ka ʻole o ka hoʻokaʻawale ʻana i nā mea.

ʻO nā koi ʻē aʻe ʻoi aku ka maʻamau a ʻo kā lākou papa inoa holoʻokoʻa e like me kēia.

  1. Palekana pae.
  2. Ka hoʻoheheʻe ʻana. Kuhi ʻia e ka makemake e hoʻohana i ka waihona waihona like ʻole e hoʻonohonoho i ka mokuʻāina ʻaʻole wale ma waena o nā kaula, akā ma waena o ka noi nui a me nā hoʻonui iOS.
  3. ʻO ka hiki ke hōʻike i nā mea i mālama ʻia e like me nā mea hiki ʻole ke hoʻololi
  4. ʻAʻohe hoʻokaʻawale ikaika i loko o nā hana CRUD.
  5. Kākoʻo kālepa no nā waiwai kumu ʻĀKIKA: atomicity, kūlike, kaʻawale a me ka hilinaʻi.
  6. ʻO ka wikiwiki i nā hihia kaulana loa.

Me kēia hoʻonohonoho o nā koi, ʻo SQLite kahi koho maikaʻi. Eia naʻe, ma ke ʻano o ka hoʻopaʻa ʻana i nā mea ʻē aʻe, ua loaʻa iaʻu kahi puke "E hoʻomaka me LevelDB". Ma lalo o kāna alakaʻi ʻana, ua kākau ʻia kahi benchmark e hoʻohālikelike ana i ka wikiwiki o ka hana me nā ʻikepili like ʻole i nā hiʻohiʻona ao maoli. Ua ʻoi aku ka hopena ma mua o kā mākou mau manaʻolana. Ma nā hihia kaulana loa - ka loaʻa ʻana o ka cursor ma kahi papa inoa o nā faila āpau a me kahi papa inoa o nā faila āpau no kahi papa kuhikuhi i hāʻawi ʻia - ua ʻoi aku ka wikiwiki o LMDB ma mua o SQLite. Ua maopopo ka koho.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

2. LMDB Kaulana

He hale waihona puke liʻiliʻi loa ʻo LMDB (he 10K lālani wale nō) e hoʻokō ana i ka papa haʻahaʻa haʻahaʻa loa o nā waihona - mālama.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Hōʻike ka kiʻikuhi ma luna nei i ka hoʻohālikelike ʻana i ka LMDB me SQLite, ka mea e hoʻokō nei i nā pae kiʻekiʻe, ʻaʻole i ʻoi aku ka pololei ma mua o SQLite me ka ʻikepili Koʻikoʻi. ʻOi aku ka maikaʻi o ka haʻi ʻana i nā ʻenekini waihona e like me nā mea hoʻokūkū like - BerkeleyDB, LevelDB, Sophia, RocksDB, a pēlā aku. ʻO ka hoʻokolohua mua ma 2012 lilo na LMDB Howard Chu. Nā hualoaʻa Ua lilo ia i mea hoihoi loa a ua lawe ʻia kāna hana e ka poʻe hoihoi OSS, a loaʻa ka hoʻomau i ke kanaka. LumoSQL. I Ianuali 2020, ʻo Den Shearer ka mea kākau o kēia papahana hoikeia ia ma LinuxConfAu.

Hoʻohana nui ʻia ʻo LMDB ma ke ʻano he mīkini no ka ʻikepili noi. He aie ka hale waihona puke i nā mea hoʻomohala OpenLDAP, ka poʻe i ʻoluʻolu ʻole iā BerkeleyDB i kumu no kā lākou papahana. E hoʻomaka ana mai kahi waihona haʻahaʻa btree, Ua hiki iā Howard Chu ke hana i kekahi o nā mea koho kaulana loa o ko mākou manawa. Ua hoʻolaʻa ʻo ia i kāna hōʻike ʻoluʻolu loa i kēia moʻolelo, a me ke ʻano o loko o LMDB. "Ka Waihona Waihona Hoʻomanaʻo Uila". ʻO kahi hiʻohiʻona maikaʻi o ka lanakila ʻana i kahi hale mālama i haʻi ʻia e Leonid Yuryev (aka yleo) mai Positive Technologies i kāna hōʻike ma Highload 2015 "He poʻokela kūikawā ka mīkini LMDB". I loko o ia mea, kamaʻilio ʻo ia e pili ana iā LMDB i ka pōʻaiapili o kahi hana like o ka hoʻokō ʻana i ReOpenLDAP, a ua kau ʻia ʻo LevelDB i ka hoʻohewa hoʻohālikelike. Ma muli o ka hoʻokō ʻana, ua loaʻa i nā ʻenehana Positive kahi hana hoʻomohala ikaika MDBX me nā hiʻohiʻona ʻono loa, optimizations a hoʻoponopono ʻino.

Hoʻohana pinepine ʻia ʻo LMDB ma ke ʻano he mālama like. No ka laʻana, ka polokalamu kele pūnaewele Mozilla Firefox koho ia no kekahi mau pono, a, e hoʻomaka ana mai ka mana 9, Xcode makemake ʻia ʻO kāna SQLite no ka mālama ʻana i nā kuhikuhi.

Ua hana pū ka ʻenekini i kāna hōʻailona ma ka honua o ka hoʻomohala kelepona. Hiki ke loaʻa nā meheu o kona hoʻohana ʻana e huli i ka mea kūʻai mai iOS no Telegram. Ua hele hou aʻe ʻo LinkedIn a koho iā LMDB ma ke ʻano he waihona paʻamau no kāna ʻikepili hoʻoheheʻe ʻikepili homegrown Rocket Data, e pili ana i ia. hai aku ma kāna ʻatikala ma 2016.

Ke hakakā maikaʻi nei ʻo LMDB no kahi wahi i ka lā ma ka niche i waiho ʻia e BerkeleyDB ma hope o kona komo ʻana ma lalo o ka mana o Oracle. Ua aloha ʻia ka waihona no kona wikiwiki a me ka hilinaʻi, ʻoiai ke hoʻohālikelike ʻia me kona mau hoa. E like me kāu e ʻike ai, ʻaʻohe ʻaina awakea manuahi, a makemake wau e koʻikoʻi i ke kālepa-off āu e alo ai i ke koho ʻana ma waena o LMDB a me SQLite. Hōʻike maopopo ke kiʻikuhi i luna i ka hoʻonui ʻia ʻana o ka wikiwiki. ʻO ka mea mua, ʻaʻole mākou e uku no nā papa hou o ka abstraction ma luna o ka waiho disk. ʻIke ʻia ʻaʻole hiki ke hana maikaʻi me ka ʻole o lākou, a e ʻike ʻia lākou i ka code noi, akā ʻoi aku ka maʻalahi. ʻAʻole lākou e loaʻa nā hiʻohiʻona i koi ʻole ʻia e kahi noi kikoʻī, no ka laʻana, kākoʻo no nā nīnau ma ka ʻōlelo SQL. ʻO ka lua, hiki ke hoʻokō maikaʻi i ka palapala ʻāina o nā hana noi ma nā noi i ka waiho disk. Inā ʻo SQLite i ka'u hana e pili ana i ka awelika o ka helu helu pono o ka awelika noi, a laila, ʻo ʻoe, ma ke ʻano he mea hoʻomohala noi, ʻike pono ʻoe i nā hiʻohiʻona hana nui. No ka hopena ʻoi aku ka maikaʻi, pono ʻoe e uku i kahi hōʻailona kumukūʻai hoʻonui ʻia no ka hoʻomohala ʻana i ka hopena mua a no kāna kākoʻo ma hope.

3. Ekolu kia o LMDB

Ma hope o ka nānā ʻana i ka LMDB mai ka maka manu, ʻo ia ka manawa e hele hohonu ai. E hoʻolaʻa ʻia nā ʻāpana ʻekolu aʻe i ka nānā ʻana i nā pou nui kahi e kau ai ka hale waihona.

  1. ʻO nā faila i hoʻopaʻa ʻia i ka hoʻomanaʻo ma ke ʻano he hana no ka hana ʻana me ka disk a me ka hoʻonohonoho ʻana i nā hale ʻikepili kūloko.
  2. B+-lāʻau ma ke ʻano he hui o ke ʻano o ka ʻikepili i mālama ʻia.
  3. Kopi-ma-kākau ma ke ʻano he ala e hāʻawi ai i nā waiwai kālepa ACID a me ka multiversion.

3.1. Whale #1. Nā waihona palapala hoʻomanaʻo

ʻO nā faila i hoʻopaʻa ʻia i ka hoʻomanaʻo he ʻano hana koʻikoʻi i ʻike ʻia ma ka inoa o ka waihona. ʻO nā pilikia o ka caching a me ka synchronization o ke komo ʻana i ka ʻike i mālama ʻia e waiho piha ʻia i ka ʻōnaehana hana. ʻAʻole loaʻa i ka LMDB kahi huna i loko ona. He hoʻoholo noʻonoʻo kēia a ka mea kākau, ʻoiai ʻo ka heluhelu ʻana i ka ʻikepili pololei mai nā faila palapala ʻia e hiki ai iā ʻoe ke ʻoki i nā kihi he nui i ka hoʻokō ʻana i ka mīkini. Aia ma lalo iho kahi papa inoa piha o kekahi o lākou.

  1. ʻO ka mālama ʻana i ka paʻa o ka ʻikepili i loko o ka waihona i ka wā e hana pū ai me ia mai nā kaʻina hana e lilo i kuleana o ka ʻōnaehana hana. Ma ka ʻāpana aʻe, kūkākūkā ʻia kēia mechanics me nā kiʻi.
  2. ʻO ka nele o nā hūnā e hoʻopau loa iā LMDB mai ke poʻo e pili ana i nā hoʻokaʻawale ikaika. ʻO ka heluhelu ʻana i ka ʻikepili ma ka hoʻomaʻamaʻa ʻana ʻo ia ka hoʻonohonoho ʻana i kahi kuhikuhi i ka helu kūpono i ka hoʻomanaʻo virtual a ʻaʻohe mea ʻē aʻe. Ua like ia me ka ʻepekema moʻolelo, akā i loko o ke code kumu waihona mālama ʻia nā kelepona āpau i calloc i ka hana hoʻonohonoho hoʻonohonoho.
  3. ʻO ka loaʻa ʻole o nā cache, ʻo ia hoʻi ka nele o nā laka e pili ana i ka synchronization o ko lākou komo ʻana. ʻO ka poʻe heluhelu, hiki ke loaʻa ka helu helu ʻole o ka poʻe heluhelu i ka manawa like, ʻaʻole e hālāwai me kahi mutex hoʻokahi i ko lākou ala i ka ʻikepili. Ma muli o kēia, ʻo ka wikiwiki o ka heluhelu ʻana he scalability linear kūpono e pili ana i ka helu o nā CPU. Ma LMDB, hoʻololi wale ʻia nā hana hoʻololi. Hoʻokahi wale nō mea kākau i ka manawa.
  4. ʻO ka liʻiliʻi o ka caching a me ka synchronization logic e hoʻopau i ke ʻano paʻakikī o nā hewa e pili ana i ka hana ʻana i kahi kaiapuni multi-threaded. ʻElua mau haʻawina ʻikepili hoihoi ma ka hui ʻo Usenix OSDI 2014: "ʻAʻole i hana ʻia nā ʻōnaehana faila āpau: ma ka paʻakikī o ka hana ʻana i nā noi like ʻole" и "Hoʻomāinoino i nā waihona no ka leʻaleʻa a me ka loaʻa kālā". Mai iā lākou hiki iā ʻoe ke hōʻiliʻili i ka ʻike e pili ana i ka hilinaʻi ʻole o LMDB a me ka hoʻokō pono ʻole o nā waiwai kālepa ACID, ʻoi aku ka maikaʻi ma mua o SQLite.
  5. ʻO ka minimalism o LMDB e ʻae i ka hōʻike ʻana o ka mīkini o kāna code e waiho piha ʻia i loko o ka cache L1 o ka kaʻina hana me nā ʻano wikiwiki e hiki mai ana.

ʻO ka mea pōʻino, ma iOS, me nā faila i hoʻopaʻa ʻia i ka hoʻomanaʻo, ʻaʻole like nā mea āpau e like me kā mākou makemake. E kamaʻilio e pili ana i nā hemahema e pili ana iā lākou me ka noʻonoʻo pono, pono e hoʻomanaʻo i nā loina maʻamau o ka hoʻokō ʻana i kēia mīkini i nā ʻōnaehana hana.

ʻIke maʻamau e pili ana i nā faila i hoʻopaʻa ʻia i ka hoʻomanaʻo

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOSMe kēlā me kēia noi e holo nei, hoʻopili ka ʻōnaehana hana i kahi hui i kapa ʻia he kaʻina hana. Hoʻokaʻawale ʻia kēlā me kēia kaʻina hana i kahi ākea o nā helu wahi e waiho ai i nā mea āpau e pono ai ke hana. Aia ma nā wahi haʻahaʻa loa nā ʻāpana me nā code a me nā ʻikepili paʻakikī a me nā kumuwaiwai. ʻO ka mea aʻe e hiki mai ana kahi poloka e ulu nei o ka wahi kikoʻī dynamic, i ʻike ʻia e mākou ma lalo o ka inoa heap. Loaʻa iā ia nā helu wahi o nā hui i ʻike ʻia i ka wā e hana ai ka papahana. Aia ma luna ka wahi hoʻomanaʻo i hoʻohana ʻia e ka waihona noi. E ulu ana a ʻaelike paha; ʻo ia hoʻi, he ʻano ikaika kona nui. No ka pale ʻana i ka hoʻopaʻa ʻana a me ka puʻu mai ka hoʻokuke ʻana a me ka hoʻopili ʻana i kekahi i kekahi, aia lākou ma nā ʻaoʻao like ʻole o ka wahi helu wahi. Hoʻohana ka ʻōnaehana hana i nā ʻōlelo ma kēia ʻāpana waena e hoʻopili i nā ʻano hui like ʻole me ke kaʻina hana. ʻO ka mea kūikawā, hiki iā ia ke hoʻohui i kekahi mau ʻōlelo hoʻomau mau me kahi faila ma ka disk. Kapa ʻia kēlā ʻano faila memo-mapped.​

Nui ka wahi helu wahi i hoʻokaʻawale ʻia i ke kaʻina hana. ʻO ka manaʻo, ua kaupalena ʻia ka helu o nā helu wahi e ka nui o ka pointer, i hoʻoholo ʻia e ka mana bit o ka ʻōnaehana. Inā hoʻopaʻa ʻia ka hoʻomanaʻo kino iā ia 1-a-1, a laila ʻo ka hana mua loa e ʻai i ka RAM holoʻokoʻa, a ʻaʻohe kamaʻilio e pili ana i kekahi multitasking.​

Akā naʻe, mai kā mākou ʻike ʻike mākou e hiki i nā ʻōnaehana hana hou ke hoʻokō i nā kaʻina hana e like me ka makemake. Hiki kēia ma muli o ka hoʻokaʻawale ʻana i ka nui o ka hoʻomanaʻo i nā kaʻina hana ma ka pepa, akā i ka ʻoiaʻiʻo ke hoʻouka nei lākou i loko o ka hoʻomanaʻo kino kino wale nō kēlā ʻāpana i koi ʻia ma ʻaneʻi a i kēia manawa. No laila, kapa ʻia ka hoʻomanaʻo e pili ana i kahi kaʻina hana.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Hoʻonohonoho ka ʻōnaehana hana i ka hoʻomanaʻo virtual a me ke kino i nā ʻaoʻao o kahi nui. Ke koi ʻia kahi ʻaoʻao o ka hoʻomanaʻo virtual, hoʻouka ka ʻōnaehana hana iā ia i ka hoʻomanaʻo kino a hoʻohālikelike iā lākou i kahi papaʻaina kūikawā. Inā ʻaʻohe puka manuahi, a laila kope ʻia kekahi o nā ʻaoʻao i hoʻouka mua ʻia i ka disk, a ʻo ka mea i koi ʻia e lawe i kona wahi. ʻO kēia kaʻina hana, a mākou e hoʻi koke ai, ua kapa ʻia ʻo swapping. Hōʻike ka kiʻi ma lalo i ke kaʻina hana i wehewehe ʻia. Ma luna ona, ua hoʻouka ʻia ka ʻaoʻao A me ka helu wahi 0 a kau ʻia ma ka ʻaoʻao hoʻomanaʻo nui me ka helu helu 4.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Ua like like ka moʻolelo me nā faila i palapala ʻia i ka hoʻomanaʻo. ʻO ke kūpono, ke manaʻo ʻia nei lākou e hoʻomau mau ʻia a loaʻa i loko o ka wahi kikowaena virtual. Eia naʻe, komo lākou i ka ʻaoʻao hoʻomanaʻo kino ma ka ʻaoʻao a ma ke noi wale nō. Hoʻopili ʻia ka hoʻololi ʻana o ia mau ʻaoʻao me ka faila ma ka disk. Ma kēia ala, hiki iā ʻoe ke hana i ka faila I/O ma ka hana wale ʻana me nā bytes i ka hoʻomanaʻo - e hoʻololi ʻia nā hoʻololi āpau e ka ʻōnaehana ʻōnaehana i ka faila kumu.​
ʻO
Hōʻike ke kiʻi ma lalo i ka hoʻonohonoho ʻana o LMDB i kona mokuʻāina i ka hana ʻana me ka waihona mai nā kaʻina hana like ʻole. Ma ka palapala ʻana i ka hoʻomanaʻo virtual o nā kaʻina hana like ʻole i ka faila hoʻokahi, ke koi aku nei mākou i ka ʻōnaehana hana e hoʻonohonoho pono i kekahi mau poloka o kā lākou mau wahi kikoʻī me kekahi i kekahi, kahi e nānā ai ʻo LMDB.​
ʻO

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO kahi nuance koʻikoʻi ʻo ia ka LMDB, ma ke ʻano maʻamau, hoʻololi i ka faila ʻikepili ma o ka ʻōnaehana kelepona kākau, a hōʻike i ka faila iā ia iho ma ke ʻano heluhelu-wale nō. ʻElua mau hopena koʻikoʻi kēia ala.

ʻO ka hopena mua ka mea maʻamau i nā ʻōnaehana hana āpau. ʻO kona kumu, ʻo ia ka hoʻohui ʻana i ka pale mai ka pōʻino ʻike ʻole i ka waihona ma ke code hewa. E like me kāu e ʻike ai, manuahi nā ʻōlelo aʻoaʻo o kahi kaʻina hana e kiʻi i ka ʻikepili mai kēlā me kēia wahi o kāna wahi helu wahi. I ka manawa like, e like me kā mākou i hoʻomanaʻo ai, ʻo ka hōʻike ʻana i kahi faila ma ke ʻano heluhelu-kākau ʻo ia ka mea hiki ke hoʻololi i kekahi ʻōlelo aʻo. Inā hana hewa ʻo ia, e hoʻāʻo ana, no ka laʻana, e hoʻololi maoli i kahi mea hoʻonohonoho ma kahi papa kuhikuhi ʻole, a laila hiki iā ia ke hoʻololi i ka faila i palapala ʻia i kēia helu wahi, e alakaʻi i ka palaho o ka waihona. Inā hōʻike ʻia ka faila ma ke ʻano heluhelu wale nō, a laila ʻo ka hoʻāʻo e hoʻololi i ka wahi kikoʻī pili e alakaʻi i kahi hoʻopau pilikia o ka papahana me kahi hōʻailona. SIGSEGV, a e mau ana ka waihona.

ʻO ka hopena ʻelua ua kikoʻī iā iOS. ʻAʻole ʻo ka mea kākau a i ʻole nā ​​kumu ʻē aʻe e haʻi pololei iā ia, akā inā ʻaʻole ʻo ia ʻaʻole kūpono ʻo LMDB no ka holo ʻana ma kēia ʻōnaehana lawelawe kelepona. ʻO ka pauku aʻe e pili ana i ka noʻonoʻo ʻana.

Nā kikoʻī o nā faila i hoʻopaʻa ʻia i ka hoʻomanaʻo ma iOS

He hōʻike maikaʻi loa ma WWDC ma 2018 "IOS Memory Deep Dive". Hōʻike ia iā mākou ma IOS, ʻo nā ʻaoʻao āpau i loaʻa i ka hoʻomanaʻo kino kekahi o nā ʻano 3: lepo, paʻa a maʻemaʻe.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO ka hoʻomanaʻo maʻemaʻe kahi hōʻiliʻili o nā ʻaoʻao i hiki ke hoʻokuʻu ʻia mai ka hoʻomanaʻo kino. Hiki ke hoʻouka hou ʻia ka ʻikepili i loaʻa iā lākou mai kona kumu kumu. Aia i loko o kēia ʻāpana nā faila i hoʻopaʻa ʻia me ka hoʻomanaʻo wale nō. ʻAʻole makaʻu ʻo iOS e wehe i nā ʻaoʻao i palapala ʻia i kahi faila mai ka hoʻomanaʻo ʻana i kēlā me kēia manawa, no ka mea ua hōʻoia ʻia lākou e hoʻonohonoho pū ʻia me ka faila ma ka disk.
ʻO
Pau nā ʻaoʻao i hoʻololi ʻia i loko o ka hoʻomanaʻo lepo, ʻaʻohe wahi i loaʻa mua. ʻO ka mea kūikawā, e hoʻokaʻawale ʻia nā faila memo i hoʻololi ʻia e ke kākau ʻana i ka hoʻomanaʻo virtual e pili ana me lākou. E wehe ana i ka LMDB me ka hae MDB_WRITEMAP, ma hope o ka hoʻololi ʻana iā ia, hiki iā ʻoe ke hōʻoia ponoʻī iā ia.​

I ka hoʻomaka ʻana o kahi noi e lawe i ka hoʻomanaʻo kino kino, hoʻopili ʻo iOS iā ia i ka ʻaoʻao lepo lepo. ʻO ka nui o ka hoʻomanaʻo i hoʻopaʻa ʻia e nā ʻaoʻao lepo a paʻa ʻia ka mea i kapa ʻia ka wāwae hoʻomanaʻo. Ke hiki ʻo ia i kahi waiwai paepae, hele mai ka daemon ʻōnaehana pepehi OOM ma hope o ke kaʻina hana a hoʻopau ikaika iā ia. ʻO kēia ke ʻano o iOS i hoʻohālikelike ʻia i nā ʻōnaehana hana papa. ʻO ka ʻokoʻa, ʻaʻole i hāʻawi ʻia ma iOS ka hoʻohaʻahaʻa ʻana i ke kapuaʻi hoʻomanaʻo ma ka hoʻololi ʻana i nā ʻaoʻao mai ka hoʻomanaʻo kino i ka disk. Malia paha ʻo ke kaʻina hana o ka neʻe ʻana i nā ʻaoʻao i ka disk a me ka hoʻihoʻi ʻana i ka ikehu no nā polokalamu kelepona, a i ʻole mālama ʻo IOS i ke kumu o ke kākau hou ʻana i nā cell ma SSD drive, a i ʻole ʻoluʻolu nā mea hoʻolālā i ka hana holoʻokoʻa o ka ʻōnaehana, kahi i loaʻa ai nā mea āpau. hoʻololi mau. ʻO ka mea ʻoiaʻiʻo, he ʻoiaʻiʻo nō.

ʻO ka nūhou maikaʻi, i ʻōlelo ʻia ma mua, ʻaʻole hoʻohana ʻo LMDB i ka mīkini mmap e hoʻonui i nā faila. ʻO ia ke ʻano o ka ʻikepili i hōʻike ʻia e iOS ma ke ʻano he hoʻomanaʻo maʻemaʻe a ʻaʻole kōkua i ka wāwae hoʻomanaʻo. Hiki iā ʻoe ke hōʻoia i kēia me ka hoʻohana ʻana i kahi mea hana Xcode i kapa ʻia ʻo VM Tracker. Hōʻike ka kiʻi ma lalo nei i ke kūlana o ka hoʻomanaʻo virtual iOS o ka noi Cloud i ka wā e hana ai. I ka hoʻomaka ʻana, ua hoʻomaka ʻia nā manawa 2 LMDB i loko. Ua ʻae ʻia ka mea mua e hōʻike i kāna faila ma 1GiB o ka hoʻomanaʻo virtual, ʻo ka lua - 512MiB. ʻOiai ʻo ka mālama ʻana o nā waihona ʻelua i kahi nui o ka hoʻomanaʻo noho, ʻaʻohe o lākou e hāʻawi i ka nui lepo.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

A ʻo kēia ka manawa no ka nūhou maikaʻi ʻole. Mahalo i ka mīkini swap i nā ʻōnaehana hana papapihi 64-bit, hiki i kēlā me kēia kaʻina ke noho i ka nui o ka wahi kikoʻī kikoʻī e like me ka ʻokoʻa o ka pā paʻa paʻakikī no kāna hiki ke hoʻololi. ʻO ka hoʻololi ʻana i ka swap me ka hoʻopiʻi ʻana ma IOS e hōʻemi i ka nui o ka theoretical. I kēia manawa pono nā kaʻina ola a pau i ka hoʻomanaʻo nui (heluhelu RAM), a ʻo nā mea kūpono ʻole e koi ʻia e hoʻopau. Ua ʻōlelo ʻia kēia e like me ka mea i ʻōlelo ʻia ma luna hōʻike, a iloko palapala kūhelu. ʻO ka hopena, ua kaupalena ʻo iOS i ka nui o ka hoʻomanaʻo i loaʻa no ka hoʻokaʻawale ʻana ma o mmap. Eia maanei Hiki iā ʻoe ke nānā i nā palena empirical o ka nui o ka hoʻomanaʻo i hiki ke hoʻokaʻawale ʻia ma nā mea like ʻole me ka hoʻohana ʻana i kēia kelepona ʻōnaehana. Ma nā hiʻohiʻona akamai loa o kēia manawa, ua lilo ʻo IOS i mea lokomaikaʻi e 2 gigabytes, a ma luna o nā mana kiʻekiʻe o ka iPad - e 4. I ka hoʻomaʻamaʻa, ʻoiaʻiʻo, pono ʻoe e kālele i nā hiʻohiʻona haʻahaʻa i kākoʻo ʻia, kahi mea kaumaha loa. ʻOi aku ka ʻino, ma ka nānā ʻana i ke kūlana hoʻomanaʻo o ka noi ma VM Tracker, e ʻike ʻoe he mamao loa ʻo LMDB mai ka mea hoʻokahi e koi ana i ka hoʻomanaʻo hoʻomanaʻo. ʻAi ʻia nā ʻāpana maikaʻi e nā mea hoʻokaʻawale ʻōnaehana, nā faila waiwai, nā kiʻi kiʻi, a me nā mea ʻaihue liʻiliʻi ʻē aʻe.

Ma muli o nā hopena o nā hoʻokolohua ma ka Cloud, ua hiki mai mākou i kēia mau waiwai koʻikoʻi no ka hoʻomanaʻo i hāʻawi ʻia e LMDB: 384 megabytes no nā polokalamu 32-bit a me 768 no nā polokalamu 64-bit. Ma hope o ka hoʻohana ʻia ʻana o kēia leo, hoʻomaka nā hana hoʻololi e pau me ke code MDB_MAP_FULL. Ke nānā nei mākou i kēlā mau hewa i kā mākou nānā ʻana, akā liʻiliʻi lākou i hiki ke mālama ʻia i kēia manawa.

ʻO kahi kumu ʻike ʻole no ka hoʻohana nui ʻana i ka hoʻomanaʻo ʻana e ka waihona hiki ke lilo i mau hana lōʻihi. No ka hoʻomaopopo ʻana i ka pili ʻana o kēia mau mea ʻelua, e kōkua ʻia mākou ma ka noʻonoʻo ʻana i nā pou ʻelua i koe o ka LMDB.

3.2. Whale #2. B+-lāʻau

No ka hoʻohālike ʻana i nā papa ma luna o kahi waihona waiwai kī, pono e loaʻa kēia mau hana ma kāna API:

  1. Ke hoʻokomo nei i kahi mea hou.
  2. E ʻimi i kahi mea me kahi kī i hāʻawi ʻia.
  3. Ke wehe ʻana i kahi mea.
  4. E hoʻokaʻawale i nā kī i ka hoʻonohonoho ʻana.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOSʻO ka ʻōnaehana ʻikepili maʻalahi hiki ke hoʻokō maʻalahi i nā hana ʻehā he kumu lāʻau ʻimi binary. Hōʻike kēlā me kēia o kona mau node i kahi kī e hoʻokaʻawale i ka ʻāpana holoʻokoʻa o nā kī keiki i ʻelua mau kumulāʻau. Aia ma ka hema nā mea ʻoi aku ka liʻiliʻi ma mua o ka makua, a ma ka ʻaoʻao ʻākau nā mea ʻoi aku ka nui. Loaʻa ka loaʻa ʻana o nā kī i kauoha ʻia ma o kekahi o nā huakaʻi lāʻau maʻamau

Loaʻa i nā kumu lāʻau binary ʻelua mau hemahema e pale ai iā lākou mai ka maikaʻi ʻana ma ke ʻano he hoʻolālā ʻikepili ma muli o ka disk. ʻO ka mea mua, ʻaʻole hiki ke ʻike ʻia ka pae o kā lākou kaulike. Aia kahi pilikia nui o ka loaʻa ʻana o nā kumulāʻau kahi e ʻokoʻa nui ai nā kiʻekiʻe o nā lālā like ʻole, kahi e hoʻonui nui ai i ka paʻakikī algorithmic o ka huli ʻana i ka mea i manaʻo ʻia. ʻO ka lua, ʻo ka nui o nā loulou ma waena o nā node e hoʻonele i nā kumu lāʻau binary i ka hoʻomanaʻo. ʻO ka hopena, ʻo ke kaʻahele maʻalahi o kekahi mau node kokoke i kahi kumulāʻau pono paha e kipa i kahi helu like o nā ʻaoʻao. He pilikia kēia inā mākou e kamaʻilio e pili ana i ka maikaʻi o nā kumulāʻau binary ma ke ʻano he hoʻolālā ʻikepili i loko o ka hoʻomanaʻo, no ka mea ʻo ka hoʻololi mau ʻana i nā ʻaoʻao i ka cache processor ʻaʻole ia he leʻaleʻa haʻahaʻa. I ka wā e kiʻi pinepine ai i nā ʻaoʻao pili me nā nodes mai ka diski, lilo ke kūlana poino.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOSʻO nā lāʻau B, he ʻano hoʻololi o nā kumulāʻau binary, hoʻoponopono i nā pilikia i ʻike ʻia ma ka paukū mua. ʻO ka mea mua, ke kau nei lākou iā lākou iho. ʻO ka lua, ʻo kēlā me kēia o kā lākou mau node e hoʻokaʻawale i ka hoʻonohonoho o nā kī keiki ʻaʻole i 2, akā i loko o nā ʻāpana M i kauoha ʻia, a hiki ke nui ka helu M, ma ke kauoha o nā haneli, a i ʻole mau tausani.

No laila:

  1. Loaʻa i kēlā me kēia node ka nui o nā kī i kauoha mua ʻia a pōkole loa nā kumulāʻau.
  2. Loaʻa i ka lāʻau ka waiwai o ka wahi o ka wahi i ka hoʻomanaʻo, no ka mea, ʻo nā kī kokoke i ka waiwai e kū maoli ana ma ka ʻaoʻao o kekahi i kekahi ma nā nodes like ʻole.
  3. Hoʻemi ʻia ka helu o nā node transit i ka wā e iho ai i kahi kumulāʻau i ka wā o kahi hana ʻimi.
  4. Hoʻemi ʻia ka helu o nā node i heluhelu ʻia i ka wā o nā nīnau laulā, no ka mea, ua loaʻa i kēlā me kēia o lākou he helu nui o nā kī i kauoha ʻia.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Hoʻohana ʻo LMDB i kahi hoʻololi o ka lāʻau B i kapa ʻia he lāʻau B+ e mālama i ka ʻikepili. Hōʻike ke kiʻikuhi ma luna nei i nā ʻano node ʻekolu i loko.

  1. Aia ma luna ke kumu. ʻAʻohe mea ʻē aʻe ma mua o ka manaʻo o kahi waihona i loko o kahi hale kūʻai. I loko o hoʻokahi hiʻohiʻona LMDB, hiki iā ʻoe ke hana i kekahi mau ʻikepili e kaʻana like ana i kahi wahi kikoʻī kikoʻī. Hoʻomaka kēlā me kēia o lākou mai kona kumu ponoʻī.
  2. Aia ma ka pae haʻahaʻa nā lau. Loaʻa iā lākou a ʻo lākou wale nō nā hui waiwai kī i mālama ʻia ma ka waihona. Ma ke ala, ʻo kēia ka ʻokoʻa o nā lāʻau B +-. Inā mālama ka lāʻau B maʻamau i nā ʻāpana waiwai ma nā node o nā pae āpau, a laila aia ka hoʻololi B+ ma kahi haʻahaʻa. Ma hope o ka hoʻopaʻa ʻana i kēia ʻoiaʻiʻo, e kapa hou mākou i ka subtype o ka lāʻau i hoʻohana ʻia ma LMDB he lāʻau B wale nō.
  3. Aia ma waena o ke kumu a me nā lau he 0 a ʻoi aʻe nā pae ʻenehana me nā node hoʻokele (lala). ʻO kā lākou hana, ʻo ia ka hoʻokaʻawale ʻana i nā kī ma waena o nā lau.

Ma ke kino, ʻo nā node nā poloka o ka hoʻomanaʻo o ka lōʻihi i koho mua ʻia. ʻO kā lākou nui ka nui o ka nui o nā ʻaoʻao hoʻomanaʻo i ka ʻōnaehana hana, a mākou i kūkākūkā ai ma luna. Hōʻike ʻia ke ʻano o ka node ma lalo nei. Aia ke poʻomanaʻo i ka ʻike meta, ʻo ka mea maopopo loa o ia no ka laʻana ka checksum. E hele mai ana ka ʻike e pili ana i nā offset i loaʻa ai nā pūnaewele me ka ʻikepili. Hiki i nā ʻikepili ke kī, inā mākou e kamaʻilio e pili ana i nā node hoʻokele, a i ʻole nā ​​hui waiwai kī holoʻokoʻa i ka hihia o nā lau. "Ka Loiloi o na Hale Kuai Waiwai Ki'eki'e".

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Ma hope o ka hana ʻana i ka ʻike o loko o nā nodes ʻaoʻao, e hōʻike hou mākou i ka LMDB B-lāʻau ma ke ʻano maʻalahi ma ke ʻano aʻe.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Loaʻa nā ʻaoʻao me nā nodes ma ka diski. Aia nā ʻaoʻao helu kiʻekiʻe ma ka hope o ka faila. ʻO ka ʻaoʻao meta i kapa ʻia he ʻike e pili ana i nā offset e loaʻa ai nā aʻa o nā lāʻau āpau. I ka wehe ʻana i kahi faila, nānā ʻo LMDB i ka ʻaoʻao waihona ma ka ʻaoʻao mai ka hopena a i ka hoʻomaka ʻana e ʻimi i kahi ʻaoʻao meta kūpono a ma o ia e ʻike ai i nā ʻikepili i loaʻa.​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

I kēia manawa, me ka manaʻo o ke ʻano loiloi a me ke kino o ka hui ʻikepili, hiki iā mākou ke neʻe e noʻonoʻo i ke kolu o ka pou o LMDB. ʻO ia me kāna kōkua e hoʻololi ʻia nā hoʻololi a pau i ka transactionally a me ke kaʻawale ʻana mai kekahi i kekahi, e hāʻawi ana i ka waihona ma ke ʻano holoʻokoʻa i ka waiwai o multiversion.

3.3. Whale #3. Kākau-ma-kākau

ʻO kekahi mau hana B-lāʻau e pili ana i ka hoʻololi ʻana i kāna mau node. ʻO kekahi laʻana e hoʻohui i kahi kī hou i kahi node i hiki i kona hiki ke kiʻekiʻe. Ma keia hihia, he mea pono, mua, e mahele i ka node i elua, a me ka lua, e hoʻohui i ka loulou i ka hou budding keiki node i kona makua. He mea weliweli loa kēia kaʻina hana. Inā no kekahi kumu (ka hāʻule, ka pau ʻana o ka mana, a me nā mea ʻē aʻe) wale nō kahi hapa o nā hoʻololi mai ka moʻo, a laila e noho ka lāʻau i kahi kūlana kūlike ʻole.

ʻO kahi hoʻonā kuʻuna no ka hana ʻana i ka ʻikepili hewa-tolerant ʻo ka hoʻohui ʻana i kahi hoʻolālā ʻikepili ma ka disk ma kahi kokoke i ka B-tree - kahi log transaction, ʻike ʻia hoʻi he log write-ahead (WAL). He faila ia ma ka hope o ka hana i manaʻo ʻia i kākau ʻia ma mua o ka hoʻololi ʻana i ka lāʻau B ponoʻī. No laila, inā ʻike ʻia ka palaho ʻikepili i ka wā o ka ʻike pilikino, e kūkākūkā ka waihona i ka log e hoʻonohonoho pono iā ia iho.

Ua koho ʻo LMDB i kahi ala ʻē aʻe ma ke ʻano he hana hoʻomanawanui hewa, i kapa ʻia ʻo kope-ma-kākau. ʻO ka mea nui ma mua o ka hoʻonui ʻana i ka ʻikepili ma kahi ʻaoʻao e kū nei, e kope mua ʻo ia iā ia a hana i nā hoʻololi āpau i ke kope.​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Ma hope aʻe, i mea e loaʻa ai ka ʻikepili hou, pono e hoʻololi i ka loulou i ka node i lilo i kēia manawa i kona node makua. No ka mea pono e hoʻololi ʻia no kēia, ua kope ʻia ma mua. Hoʻomau ka hana recursively a hiki i ke kumu. ʻO ka mea hope loa e hoʻololi ʻia ka ʻikepili ma ka ʻaoʻao meta.​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Inā hāʻule koke ke kaʻina hana i ka wā o ke kaʻina hana hou, a laila ʻaʻole e hana ʻia kahi ʻaoʻao meta hou, a i ʻole e kākau ʻia i ka disk piha, a ʻaʻole pololei kāna helu helu. Ma kekahi o kēia mau hihia ʻelua, ʻaʻole hiki ke kiʻi ʻia nā ʻaoʻao hou, akā ʻaʻole pili nā mea kahiko. Hoʻopau kēia i ka pono o LMDB e kākau i ka lāʻau i mua e mālama i ka kūlike o ka ʻikepili. ʻO ka ʻoiaʻiʻo, ʻo ke ʻano o ka mālama ʻana i ka ʻikepili ma ka disk i hōʻike ʻia ma luna nei e lawe i kāna hana. ʻO ka loaʻa ʻole o kahi moʻolelo kālepa kikoʻī kekahi o nā hiʻohiʻona o LMDB e hāʻawi ana i ka wikiwiki heluhelu ʻikepili kiʻekiʻe

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO ka hoʻolālā hopena, i kapa ʻia ʻo append-only B-tree, hāʻawi maoli i ka hoʻokaʻawale kālepa a me ka multi-versioning. Ma LMDB, pili kēlā me kēia hana wehe me ke kumu lāʻau pili i kēia manawa. A hiki i ka pau ʻana o ka hana, ʻaʻole e hoʻololi a hoʻohana hou ʻia nā ʻaoʻao o ka lāʻau e pili ana me ia no nā mana hou o ka ʻikepili. ua wehe ʻia ke kālepa, ʻoiai inā e hoʻomau ʻia ka mālama ʻana i kēia manawa. ʻO kēia ke kumu o ka multiversion, e hoʻolilo iā LMDB i kumu ʻikepili kūpono no kā mākou mea aloha UICollectionView. Ma hope o ka wehe ʻana i kahi kālepa, ʻaʻohe pono e hoʻonui i ka wāwae hoʻomanaʻo o ka noi ma ka hoʻomāke wikiwiki ʻana i ka ʻikepili o kēia manawa i loko o kekahi ʻano hoʻomanaʻo i loko o ka hoʻomanaʻo, no ka makaʻu ʻole e waiho ʻole ʻia. Hoʻokaʻawale kēia hiʻohiʻona i ka LMDB mai ka SQLite like, ʻaʻole hiki ke kaena i kēlā kaʻawale holoʻokoʻa. Ma hope o ka wehe ʻana i ʻelua mau hana i ka hope a holoi i kekahi moʻolelo i loko o kekahi o ia mau mea, ʻaʻole hiki ke loaʻa ka moʻolelo like i loko o ka lua o ke koena.

ʻO ka ʻaoʻao ʻaoʻao o ke kālā ke ʻoi aku ka nui o ka hoʻohana ʻana i ka hoʻomanaʻo virtual. Hōʻike ka paheʻe i ke ʻano o ke ʻano o ka waihona waihona inā hoʻololi ʻia i ka manawa like me 3 wehe heluhelu heluhelu e nānā ana i nā ʻano like ʻole o ka waihona. No ka hiki ʻole iā LMDB ke hoʻohana hou i nā nodes i hiki ke loaʻa mai nā aʻa e pili ana i nā kālepa o kēia manawa, ʻaʻohe koho o ka hale kūʻai akā e hoʻokaʻawale i kahi kumu ʻehā i ka hoʻomanaʻo a hoʻopaʻa hou i nā ʻaoʻao i hoʻololi ʻia ma lalo o ia.​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Maʻaneʻi he mea pono ke hoʻomanaʻo i ka ʻāpana o nā faila hoʻomanaʻo. Me he mea lā ʻaʻole e hopohopo nui ka hoʻohana ʻana o ka hoʻomanaʻo virtual iā mākou, no ka mea ʻaʻole ia e hāʻawi i ka wāwae hoʻomanaʻo o ka noi. Eia nō naʻe, i ka manawa like, ua ʻike ʻia ʻo IOS ke ʻano koʻikoʻi i ka hoʻokaʻawale ʻana iā ia, a ʻaʻole hiki iā mākou, e like me ke kikowaena a i ʻole ka papa kuhikuhi, hāʻawi i kahi wahi LMDB o 1 terabyte a ʻaʻole hiki iā mākou ke noʻonoʻo i kēia hiʻohiʻona. Inā hiki, pono ʻoe e hoʻāʻo e hoʻopōkole i ke ola o nā hana.

4. Ka hoʻolālā ʻana i ka ʻikepili ma luna o ka API waiwai kī

E hoʻomaka i kā mākou loiloi API ma ka nānā ʻana i nā abstractions kumu i hāʻawi ʻia e LMDB: ka honua a me nā ʻikepili, nā kī a me nā waiwai, nā kālepa a me nā cursors.

ʻO kahi leka e pili ana i nā papa inoa code

Hoʻihoʻi nā hana a pau i ka lehulehu LMDB API i ka hopena o kā lākou hana ma ke ʻano o ka helu kuhi hewa, akā ma nā papa inoa hope aʻe ua haʻalele ʻia kāna hōʻoia no ka pōkole. lāʻau ʻO nā kāpili C++ lmdbxx, kahi i hana ʻia ai nā hewa ma ke ʻano he ʻokoʻa C++.

ʻO ke ala wikiwiki loa e hoʻopili ai iā LMDB i kahi papahana no iOS a i ʻole macOS, manaʻo wau i kaʻu CocoaPod POSLMDB.

4.1. Nā unuhi kumu

Kaiapuni

'ole MDB_env ʻo ia ka waihona o ka mokuʻāina kūloko o ka LMDB. ʻohana hana prefixed mdb_env hiki iā ʻoe ke hoʻonohonoho i kekahi o kāna mau waiwai. Ma ka hihia maʻalahi, e like me kēia ka hoʻomaka ʻana o ka mīkini.

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

Ma ka Mail.ru Cloud noi, ua hoʻololi mākou i nā waiwai paʻamau o ʻelua mau ʻāpana.

ʻO ka mea mua, ʻo ia ka nui o ka wahi kikoʻī virtual kahi e paʻi ʻia ai ka faila waihona. ʻO ka mea pōʻino, ʻoiai ma ka hāmeʻa like, hiki ke ʻokoʻa ka waiwai kikoʻī mai ka holo a hiki i ka holo. No ka noʻonoʻo ʻana i kēia hiʻohiʻona o IOS, koho ʻia ka nui o ka mālama mālama ʻana. E hoʻomaka ana mai kahi waiwai, ua hoʻokaʻawale ʻia a hiki i ka hana mdb_env_open ʻaʻole e hoʻihoʻi i kahi hopena ʻokoʻa mai ENOMEM. Ma ke kumumanaʻo, aia kekahi ala ʻē aʻe - e hoʻokaʻawale mua i ka liʻiliʻi o ka hoʻomanaʻo i ka mīkini, a laila, ke loaʻa nā hewa, MDB_MAP_FULL, hoonui. Eia naʻe, ʻoi aku ka paʻakikī. ʻO ke kumu ke kaʻina hana no ka hoʻokaʻawale ʻana i ka hoʻomanaʻo (remap) me ka hoʻohana ʻana i ka hana mdb_env_set_map_size hoʻopau i nā hui āpau (cursors, kālepa, kī a me nā waiwai) i loaʻa mua mai ka mīkini. ʻO ka lawe ʻana i kēia hoʻololi o nā hanana i loko o ke code e alakaʻi i kāna pilikia nui. Inā naʻe, he mea koʻikoʻi loa ka hoʻomanaʻo virtual iā ʻoe, a laila he kumu paha kēia e nānā pono ai i ka ʻōpala i hala loa i mua. MDBX, kahi i waena o nā hiʻohiʻona i hoʻolaha ʻia he "hoʻololi i ka nui o ka waihona waihona ma luna o ka lele".

ʻO ka ʻāpana ʻelua, ʻaʻole i kūpono ka waiwai paʻa iā mākou, e hoʻoponopono i nā mechanics o ka hōʻoia ʻana i ka palekana o ke kaula. ʻO ka mea pōʻino, ma ka liʻiliʻi loa he pilikia ʻo iOS 10 me ke kākoʻo no ka mālama ʻana i ka pae kūloko. No kēia kumu, i ka laʻana ma luna, ua wehe ʻia ka waihona me ka hae MDB_NOTLS. Ma waho aʻe o kēia, ua pono nō hoʻi lāʻau C++ wahī lmdbxxe ʻoki i nā mea hoʻololi me kēia ʻano a i loko.

ʻIkepili

ʻO ka waihona he kumu B-lāʻau kaʻawale, a mākou i kūkākūkā ai ma luna. Loaʻa kona wehe ʻana i loko o kahi kālepa, he mea ʻano ʻē paha i ka wā mua.

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

ʻOiaʻiʻo, ʻo kahi kālepa ma LMDB kahi mea mālama, ʻaʻole kahi waihona waihona kikoʻī. Hāʻawi kēia manaʻo iā ʻoe e hana i nā hana atomika ma luna o nā mea i loaʻa i nā ʻikepili like ʻole. Ma ke kumumanaʻo, wehe kēia i ka hiki ke hoʻohālikelike i nā papa ma ke ʻano o nā ʻikepili like ʻole, akā i kekahi manawa ua lawe au i kahi ala ʻē aʻe, i wehewehe ʻia ma lalo nei.

Nā kī a me nā waiwai

'ole MDB_val hoʻohālike i ka manaʻo o ke kī a me ka waiwai. ʻAʻohe manaʻo o ka waihona e pili ana i kā lākou semantics. No ia, ʻo kekahi mea ʻē aʻe he ʻano paita o ka nui i hāʻawi ʻia. ʻO 512 bytes ka nui kī nui.

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

Me ka hoʻohana ʻana i ka mea hoʻohālikelike, hoʻokaʻawale ka hale kūʻai i nā kī ma ke ʻano piʻi. Inā ʻaʻole ʻoe e hoʻololi iā ia me kāu ponoʻī, a laila e hoʻohana ʻia ka mea paʻamau, e hoʻokaʻawale iā lākou byte-by-byte ma ke ʻano lexicographic.​

Nā ʻoihana

Ua wehewehe kikoʻī ʻia ke ʻano o ke kālepa ma mokuna mua, no laila e haʻi hou wau i kā lākou mau waiwai nui:

  1. Kākoʻo i nā waiwai kumu a pau ʻĀKIKA: atomicity, kūlike, kaʻawale a me ka hilinaʻi. ʻAʻole hiki iaʻu ke hoʻomaopopo i ka loaʻa ʻana o kahi pōpoki ma ke ʻano o ka lōʻihi ma macOS a me iOS i hoʻopaʻa ʻia ma MDBX. Hiki iā ʻoe ke heluhelu hou aku ma kā lākou README.
  2. Hōʻike ʻia ka hoʻokokoke ʻana i ka multithreading e ka papahana "mea kākau hoʻokahi / lehulehu heluhelu". Kākoʻo nā mea kākau i kekahi i kekahi, akā, mai pāpā i ka poʻe heluhelu. ʻAʻole pāpā ka poʻe heluhelu i nā mea kākau a i ʻole kekahi.
  3. Kākoʻo no nā kālepa pūnana.
  4. Kākoʻo multiversion.

Maikaʻi ka Multiversion ma LMDB makemake wau e hōʻike i ka hana. Mai ke code ma lalo nei hiki iā ʻoe ke ʻike e hana ana kēlā me kēia kālepa me ke ʻano o ka ʻikepili i kēia manawa i ka manawa i wehe ʻia ai, kaawale loa mai nā hoʻololi a pau. ʻO ka hoʻomaka ʻana i ka waiho ʻana a me ka hoʻohui ʻana i kahi moʻolelo hoʻāʻo iā ia ʻaʻole ia e hōʻike i kekahi mea hoihoi, no laila waiho ʻia kēia mau hana ma lalo o ka mea hao.

Hoʻohui i kahi hoʻokomo hoʻāʻo

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

Manaʻo wau e hoʻāʻo ʻoe i ka hoʻopunipuni like me SQLite a ʻike i ka mea e hiki mai ana.

Lawe mai ʻo Multiversion i nā pōmaikaʻi maikaʻi loa i ke ola o kahi mea hoʻomohala iOS. Me ka hoʻohana ʻana i kēia waiwai, hiki iā ʻoe ke hoʻoponopono maʻalahi a kūlohelohe i ka helu hoʻopou o ke kumu ʻikepili no nā ʻano pale, ma muli o ka noʻonoʻo ʻana o ka mea hoʻohana. No ka laʻana, e lawe i kahi hiʻohiʻona o ka Mail.ru Cloud application e like me ka hoʻouka ʻana i nā ʻike mai ka hale kiʻi media pūnaewele. Me kahi pilina maikaʻi, hiki i ka mea kūʻai ke hoʻohui i kekahi mau kiʻi i kēlā me kēia kekona i ke kikowaena. Inā hōʻano hou ʻoe ma hope o kēlā me kēia hoʻoiho UICollectionView me ka maʻiʻo media ma ke ao o ka mea hoʻohana, hiki iā ʻoe ke poina e pili ana i 60 fps a me ka ʻōwili maʻalahi i kēia kaʻina hana. No ka pale ʻana i ka hoʻonui pinepine ʻana i ka pale, pono ʻoe e kaupalena i ka nui o ka hoʻololi ʻana o ka ʻikepili i ke kumu UICollectionViewDataSource.

Inā ʻaʻole kākoʻo ka ʻikepili i ka multiversion a hiki iā ʻoe ke hana wale me ke kūlana o kēia manawa, a laila no ka hana ʻana i kahi kiʻi paʻa manawa o ka ʻikepili e pono ʻoe e kope iā ia i kahi hoʻolālā ʻikepili i loko o ka hoʻomanaʻo a i ʻole kahi papaʻaina. He pipiʻi loa kekahi o kēia mau ala. Ma ka hihia o ka mālama ʻana i ka hoʻomanaʻo, loaʻa iā mākou nā kumukūʻai ma ka hoʻomanaʻo ʻana, ma muli o ka mālama ʻana i nā mea i kūkulu ʻia, a i ka manawa, pili me ka hoʻololi hou ʻana o ORM. No ka papaʻaina pōkole, ʻoi aku ka maikaʻi o ka leʻaleʻa, ʻoi aku ka manaʻo i nā hihia liʻiliʻi ʻole.

Hoʻoponopono ka hoʻonā multiversion o LMDB i ka pilikia o ka mālama ʻana i kahi kumu ʻikepili paʻa ma kahi ala nani loa. Ua lawa wale ka wehe ʻana i kahi kālepa a voila - a hiki i ka hoʻopau ʻana iā mākou, ʻike ʻia ka hoʻonohonoho ʻikepili e hoʻopaʻa ʻia. Aia i loko o ka lima o ka papa hōʻike ke kumu no kona wikiwiki hou, me ka ʻole o nā kumu waiwai nui.

Nā ʻōkuhi

Hāʻawi nā cursors i kahi hana no ka hoʻomaʻamaʻa ʻana ma luna o nā hui waiwai kī ma o ka hele ʻana o ka lāʻau B. Inā ʻaʻole lākou, ʻaʻole hiki ke hoʻohālikelike pono i nā papa ma ka waihona, a mākou e huli nei i kēia manawa.

4.2. Papa Hoʻohālike

ʻO ka waiwai o ka hoʻonohonoho kī hiki iā ʻoe ke kūkulu i kahi abstraction kiʻekiʻe e like me ka papa ma luna o nā abstractions kumu. E noʻonoʻo kākou i kēia kaʻina hana me ka hoʻohana ʻana i ka laʻana o ka papaʻaina nui o kahi mea kūʻai kapua, kahi e hūnā i ka ʻike e pili ana i nā faila a me nā waihona a pau o ka mea hoʻohana.

Papahana papa

ʻO kekahi o nā hiʻohiʻona maʻamau e hoʻopili pono ʻia kahi papaʻaina me kahi lāʻau waihona ʻo ke koho ʻana i nā mea āpau i loaʻa i loko o kahi papa kuhikuhi. Papa inoa Adjacency. No ka hoʻokō ʻana iā ia ma luna o ka waihona waiwai kī, pono e hoʻokaʻawale i nā kī o nā faila a me nā waihona i ke ʻano i hui pū ʻia ma muli o ko lākou lālā i ka papa kuhikuhi makua. Eia kekahi, i mea e hōʻike ai i nā ʻike o ka papa kuhikuhi ma ke ʻano i ʻike ʻia e ka mea hoʻohana Windows (nā waihona mua, a laila nā faila, ʻelua i hoʻokaʻawale ʻia i ka alphabetically), pono e hoʻokomo i nā kahua hou e pili ana i ke kī.

Hōʻike ke kiʻi ma lalo nei pehea, e pili ana i ka hana ma ka lima, e like paha ke ʻano o nā kī ma ke ʻano o kahi array byte. Hoʻonoho mua ʻia nā byte me ka mea ʻike o ka papa kuhikuhi makua (ʻulaʻula), a laila me ke ʻano ('ōmaʻomaʻo) a ma ka huelo me ka inoa (uliuli). ʻano pono. ʻO ka hele ʻana i nā kī me ka prefix ʻulaʻula like e hāʻawi iā mākou i kā lākou mau waiwai pili i ke ʻano e hōʻike ʻia ai lākou i ka mea hoʻohana (ma ka ʻaoʻao ʻākau), me ka ʻole o ka koi ʻana i kahi hoʻoponopono hou.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Nā Ki Serializing a me nā Waiwai

Nui nā ʻano hana no ka serializing mea i hana ʻia ma ka honua. No ka mea, ʻaʻohe o mākou koi ʻē aʻe ma mua o ka wikiwiki, ua koho mākou i ka wikiwiki loa no mākou iho - kahi pahu o ka hoʻomanaʻo i noho ʻia e kahi hiʻohiʻona o ka hoʻolālā ʻōlelo C. No laila, hiki ke hoʻohālike ʻia ke kī o kahi mea papa kuhikuhi me kēia ʻano. NodeKey.

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

E mālama NodeKey ma ka waiho ʻana e pono ai i ka mea MDB_val E hoʻonoho i ka mea kuhikuhi ʻikepili i ka helu wahi o ka hoʻomaka ʻana o ka hale, a e helu i ko lākou nui me ka hana sizeof.

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

Ma ka mokuna mua e pili ana i nā koina koho waihona, ua ʻōlelo au i ka hōʻemi ʻana i nā hoʻokaʻawale ikaika i loko o nā hana CRUD ma ke ʻano he mea koho nui. Code hana serialize hōʻike i ke ʻano o ka LMDB hiki ke pale ʻia i ka wā e hoʻokomo ai i nā moʻolelo hou i loko o ka waihona. Hoʻololi mua ʻia ke ʻano byte e hiki mai ana mai ke kikowaena i nā hale hoʻopaʻa, a laila hoʻolei ʻia lākou i loko o kahi waihona. Ke noʻonoʻo nei ʻaʻohe hoʻokaʻawale ikaika i loko o LMDB, hiki iā ʻoe ke loaʻa i kahi kūlana maikaʻi loa e nā kūlana iOS - e hoʻohana wale i ka hoʻomanaʻo stack e hana me ka ʻikepili ma ke ala holoʻokoʻa mai ka pūnaewele a i ka disk!

Ke kauoha ʻana i nā kī me kahi mea hoʻohālikelike binary

Hōʻike ʻia ka pilina kauoha kī e kahi hana kūikawā i kapa ʻia he comparator. Ma muli o ka ʻike ʻole o ka ʻenekini e pili ana i nā semantics o nā byte i loko o lākou, ʻaʻohe koho o ka mea hoʻohālikelike paʻamau ma ka hoʻonohonoho ʻana i nā kī ma ke ʻano lexicographic, e hoʻohana ana i kahi hoʻohālikelike byte-by-byte. ʻO ka hoʻohana ʻana iā ia no ka hoʻonohonoho ʻana i nā hale, ua like ia me ke koʻi ʻokiʻoki. Eia naʻe, ma nā hihia maʻalahi, ʻike wau i kēia ʻano ʻae ʻia. Hōʻike ʻia ka mea ʻē aʻe ma lalo nei, akā eia wau e ʻike i kekahi mau rakes i hoʻopuehu ʻia ma kēia ala.

ʻO ka mea mua e hoʻomanaʻo ʻia ka hōʻike hoʻomanaʻo o nā ʻano ʻikepili primitive. No laila, ma nā polokalamu Apple āpau, mālama ʻia nā ʻano hoʻololi integer ma ke ʻano Endian liʻiliʻi. ʻO ke ʻano kēia, aia ka byte liʻiliʻi loa ma ka hema, a ʻaʻole hiki ke hoʻokaʻawale i nā helu helu me ka hoʻohālikelike byte-by-byte. No ka laʻana, e hoʻāʻo ana e hana i kēia me kahi hoʻonohonoho o nā helu mai 0 a 511 e hoʻopuka i kēia hopena.

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

No ka hoʻoponopono ʻana i kēia pilikia, pono e mālama ʻia nā helu helu ma ke kī ma kahi ʻano kūpono no ka mea hoʻohālikelike byte-byte. E kōkua nā hana mai ka ʻohana iā ʻoe e hoʻokō i ka hoʻololi pono hton* (i ke 'ano wae htons no nā helu paʻi-lua mai ka laʻana).

ʻO ke ʻano no ka hōʻike ʻana i nā kaula i ka papahana, e like me kou ʻike, he holoʻokoʻa moʻolelo mōʻaukala. Inā hōʻike ka semantics o nā kaula, a me ka hoʻopili ʻana e hōʻike iā lākou i ka hoʻomanaʻo, ʻoi aku ka nui o hoʻokahi byte i kēlā me kēia ʻano, a laila ʻoi aku ka maikaʻi o ka haʻalele koke ʻana i ka manaʻo o ka hoʻohana ʻana i kahi mea hoʻohālikelike paʻamau.

ʻO ka lua o ka mea e hoʻomanaʻo ai nā loina alignment mea hoʻopili kahua kūkulu. Ma muli o lākou, hiki ke hoʻokumu ʻia nā bytes me nā waiwai ʻōpala i ka hoʻomanaʻo ma waena o nā māla, ʻoiaʻiʻo hoʻi, e wāwahi i ka helu byte-byte. No ka hoʻopau ʻana i ka ʻōpala, pono ʻoe e haʻi i nā kīhāpai ma kahi ʻano i wehewehe pono ʻia, e mālama i nā lula alignment i ka noʻonoʻo, a i ʻole e hoʻohana i ke ʻano ma ka ʻōlelo hoʻolālā. packed.

Ke kauoha ʻana i nā kī me kahi mea hoʻohālikelike waho

Paʻakikī paha ka loiloi hoʻohālikelike kī no ka mea hoʻohālikelike binary. ʻO kekahi o nā kumu he nui ka loaʻa ʻana o nā kahua ʻenehana i loko o nā hale. E hōʻike wau i ko lākou hanana ʻana me ka hoʻohana ʻana i ka laʻana o kahi kī no kahi mea papa kuhikuhi i kamaʻāina iā mākou.

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

ʻOiai ka maʻalahi, i ka hapa nui o nā hihia e hoʻopau i ka hoʻomanaʻo. ʻO ka mea hoʻopaʻa no ka inoa he 256 bytes, ʻoiai ma ka awelika o ka faila a me nā inoa folder ʻaʻole i ʻoi aku ma mua o 20-30 mau huaʻōlelo.

ʻO kekahi o nā ʻenehana maʻamau no ka hoʻonui ʻana i ka nui o kahi moʻolelo ʻo ia ke "ʻoki" iā ia i ka nui maoli. ʻO ka mea nui, mālama ʻia nā mea i loko o nā māla lōʻihi like ʻole i loko o kahi pale ma ka hope o ka hale, a mālama ʻia ko lākou lōʻihi i nā ʻano like ʻole.​ E like me kēia ʻano, ke kī NodeKey ua hoololiia penei.

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

Eia kekahi, i ka wā serializing, ʻaʻole i kuhikuhi ʻia ka nui o ka ʻikepili sizeof ʻO ka hale holoʻokoʻa, a ʻo ka nui o nā kahua āpau he lōʻihi paʻa me ka nui o ka ʻāpana i hoʻohana maoli ʻia o ka buffer.

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

ʻO ka hopena o ka refactoring, ua loaʻa iā mākou nā mālama nui ma ka wahi i noho ʻia e nā kī. Eia naʻe, ma muli o ke kahua ʻenehana nameLength, ʻAʻole kūpono ka mea hoʻohālikelike binary paʻamau no ka hoʻohālikelike kī. Inā ʻaʻole mākou e hoʻololi iā ia me kā mākou iho, a laila ʻoi aku ka nui o ka lōʻihi o ka inoa ma mua o ka inoa ponoʻī.

ʻAe ʻo LMDB i kēlā me kēia waihona e loaʻa i kāna hana hoʻohālikelike kī ponoʻī. Hana ʻia kēia me ka hoʻohana ʻana i ka hana mdb_set_compare ma mua o ka wehe ʻana. No nā kumu maopopo, ʻaʻole hiki ke hoʻololi ʻia i ke ola o ka waihona. Loaʻa i ka mea hoʻohālikelike nā kī ʻelua ma ke ʻano binary ma ke ʻano he hoʻokomo, a ma ka pukana e hoʻihoʻi i ka hopena hoʻohālikelike: emi iho ma mua o (-1), ʻoi aku ma mua o (1) a i ʻole like me (0). Pseudocode no NodeKey me he mea la.

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

ʻOiai he ʻano like nā kī āpau i loko o ka waihona, ʻo ka hoʻolei ʻole ʻana i kā lākou hōʻike byte i ke ʻano o ka ʻōnaehana kī noi he kānāwai. Aia kekahi nuance ma aneʻi, akā e kūkākūkā ʻia ma lalo ma ka ʻāpana "Reading Records".

Nā Waiwai Serializing

Hana ikaika ʻo LMDB me nā kī o nā moʻolelo i mālama ʻia. ʻO kā lākou hoʻohālikelike ʻana me kekahi i kekahi i loko o ke ʻano o kekahi hana i hoʻopili ʻia, a ʻo ka hana o ka hopena holoʻokoʻa e pili ana i ka wikiwiki o ka mea hoʻohālikelike. Ma kahi honua maikaʻi, pono e lawa ka mea hoʻohālikelike binary paʻamau e hoʻohālikelike i nā kī, akā inā pono ʻoe e hoʻohana i kāu ponoʻī, a laila e wikiwiki ke kaʻina hana no ka deserializing kī i loko.

ʻAʻole makemake nui ka waihona i ka ʻāpana waiwai o ka moʻolelo (waiwai). ʻO kona hoʻololi ʻana mai kahi hōʻike byte i kahi mea ke hana wale ʻia ke koi ʻia e ke code noi, no ka laʻana, e hōʻike iā ia ma ka pale. No ka mea, ʻaʻole koʻikoʻi nā koi wikiwiki no kēia kaʻina hana, a i kāna hoʻokō ʻana, ʻoi aku ka manuahi o ka nānā ʻana i ka maʻalahi. NSKeyedArchiver.

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

Eia nō naʻe, aia kekahi mau manawa i mea nui ka hana. No ka laʻana, i ka mālama ʻana i ka metainformation e pili ana i ke ʻano o ka faila o kahi ao mea hoʻohana, hoʻohana mākou i ka hoʻomanaʻo like o nā mea. ʻO ka mea koʻikoʻi o ka hana o ka hoʻokumu ʻana i kahi hōʻike serialized o lākou ʻo ia ka mea i hoʻohālikelike ʻia nā mea o kahi papa kuhikuhi e kahi hierarchy o nā papa.​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

No ka hoʻokō ʻana iā ia ma ka ʻōlelo C, ua hoʻonohonoho ʻia nā kahua kikoʻī o nā hoʻoilina i nā hale ʻokoʻa, a ʻo kā lākou pili ʻana me ke kumu kumu i kuhikuhi ʻia ma o kahi kahua o ka hui ʻano. Hōʻike ʻia nā ʻike maoli o ka hui ma o ke ʻano ʻano ʻenehana.

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

Hoʻohui a hōʻano hou i nā moʻolelo

Hiki ke hoʻohui ʻia ke kī serialized a me ka waiwai i ka hale kūʻai. No ka hana ʻana i kēia, e hoʻohana i ka hana mdb_put.

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

Ma ke kahua hoʻonohonoho, hiki ke ʻae ʻia a pāpā ʻia ka mālama ʻana mai ka mālama ʻana i nā moʻolelo he nui me ke kī hoʻokahi. Inā pāpā ʻia ke kope kope ʻana i nā kī, a laila i ka wā e hoʻokomo ai i kahi moʻolelo, hiki iā ʻoe ke hoʻoholo inā ʻae ʻia ka hoʻonui ʻana i kahi moʻolelo i loaʻa a ʻaʻole paha. Inā hiki wale ka fraying ma muli o kahi hewa i loko o ke code, a laila hiki iā ʻoe ke pale iā ʻoe iho mai ia mea ma ke kuhikuhi ʻana i ka hae. NOOVERWRITE.

Heluhelu i nā mea kākau

No ka heluhelu ʻana i nā moʻolelo ma LMDB, e hoʻohana i ka hana mdb_get. Inā hōʻike ʻia ka lua kī-waiwai e nā hale i hoʻolei mua ʻia, a laila ua like kēia kaʻina hana.

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

Hōʻike ka papa inoa i hōʻike ʻia i ke ʻano o ka serialization ma o ka structure dump e hiki ai iā ʻoe ke hoʻopau i nā hoʻokaʻawale ikaika ʻaʻole wale i ke kākau ʻana, akā i ka heluhelu ʻana i ka ʻikepili. Loaʻa mai ka hana mdb_get ʻIke pololei ka pointer i ka helu hoʻomanaʻo virtual kahi e mālama ai ka waihona i ka hōʻike byte o ka mea. ʻOiaʻiʻo, loaʻa iā mākou kahi ʻano ORM e hāʻawi ana i ka wikiwiki heluhelu ʻikepili kiʻekiʻe loa me ka manuahi. ʻOiai ka nani o ke ala, pono e hoʻomanaʻo i kekahi mau hiʻohiʻona e pili ana me ia.

  1. No ka hana heluhelu wale nō, ʻoiaʻiʻo e paʻa ka mea kuhikuhi i ka hoʻolālā waiwai a hiki i ka pani ʻana o ke kālepa. E like me ka mea i hōʻike mua ʻia, ʻo nā ʻaoʻao B-lāʻau kahi i loaʻa ai kahi mea, mahalo i ke kumu kope-ma-kākau, ʻaʻole i hoʻololi ʻia i ka wā i kuhikuhi ʻia e ka liʻiliʻi o hoʻokahi kālepa. I ka manawa like, i ka pau ʻana o ka hana hope loa e pili ana iā lākou, hiki ke hoʻohana hou ʻia nā ʻaoʻao no ka ʻikepili hou. Inā pono e ola nā mea i ka hana i hana ai iā lākou, a laila pono lākou e kope.
  2. No ke kaʻina heluhelu heluhelu, e paʻa wale ka mea kuhikuhi i ka ʻōnaehana waiwai a hiki i ke kaʻina hana hoʻololi mua (kākau a holoi ʻana i ka ʻikepili).
  3. ʻOiai ke kūkulu ʻana NodeValue ʻaʻole piha, akā ʻokiʻoki ʻia (e ʻike i ka ʻāpana "Ke kauoha ʻana i nā kī me ka hoʻohana ʻana i kahi mea hoʻohālikelike waho"), hiki iā ʻoe ke komo palekana i kāna mau māla ma o ka pointer. ʻO ka mea nui ʻaʻole ia e haʻalele!
  4. ʻAʻole pono e hoʻololi ʻia ke ʻano ma o ka pointer i loaʻa. Pono e hana ʻia nā hoʻololi a pau ma o ke ʻano wale nō mdb_put. Eia nō naʻe, no ka paʻakikī o kou makemake e hana i kēia, ʻaʻole hiki ke hiki, no ka mea, ʻo ka wahi hoʻomanaʻo kahi i loaʻa ai kēia hale i palapala ʻia ma ke ʻano heluhelu wale nō.
  5. Hoʻopaʻa hou i kahi faila i ke kaʻina hana wahi no ke kumu, no ka laʻana, e hoʻonui i ka nui o ka waiho ʻana me ka hoʻohana ʻana i ka hana mdb_env_set_map_size hoʻopau loa i nā hana a me nā hui pili i ka laulā a me nā kuhikuhi i kekahi mau mea.

ʻO ka mea hope loa, ʻo kahi hiʻohiʻona ʻē aʻe he insidious ʻaʻole kūpono ka hōʻike ʻana i kona ʻano i loko o kahi paukū ʻē aʻe. Ma ka mokuna e pili ana i ka B-lāʻau, ua hāʻawi au i ke kiʻikuhi o ka hoʻonohonoho ʻana o kona mau ʻaoʻao i ka hoʻomanaʻo. Ma muli o kēia e hiki ai i ka helu o ka hoʻomaka ʻana o ka buffer me ka ʻikepili serialized hiki ke kūʻokoʻa. Ma muli o kēia, ua loaʻa ka pointer iā lākou i ka hale MDB_val a hoʻemi ʻia i kahi kikoʻī i kahi hale, ʻike ʻia ʻo ia he unaligned i ka hihia maʻamau. I ka manawa like, ʻo ka hoʻolālā ʻana o kekahi mau chips (i ka hihia o iOS ʻo armv7 kēia) e koi i ka helu o nā ʻikepili i ka nui o ka nui o ka huaʻōlelo mīkini a i ʻole, ʻo ka liʻiliʻi o ka ʻōnaehana ( no ka armv7 he 32 bits). I nā huaʻōlelo ʻē aʻe, he hana like *(int *foo)0x800002 ma luna o lākou ua like me ka pakele a alakaʻi i ka hoʻokō me ka hoʻoholo EXC_ARM_DA_ALIGN. ʻElua ala e pale aku ai i kēlā hopena kaumaha.

Hoʻomaka ka mea mua i ke kope mua ʻana i ka ʻikepili i loko o kahi hoʻolālā kūpono. No ka laʻana, ma ka mea hoʻohālikelike maʻamau e hōʻike ʻia kēia penei.

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

ʻO kahi ala ʻē aʻe, ʻo ka hoʻomaopopo ʻana i ka mea hoʻopili ma mua ʻaʻole i hoʻohālikelike ʻia nā ʻano waiwai kī aligned(1). Ma ARM hiki iā ʻoe ke loaʻa ka hopena like hoʻokō a me ka hoʻohana ʻana i ke ʻano packed. Ke noʻonoʻo nei he mea kōkua ia i ka hoʻonui ʻana i ka wahi i noho ʻia e ka hale, ʻoi aku ka maikaʻi o kēia ʻano iaʻu, ʻoiai приводит i ka piʻi ʻana o ke kumukūʻai o nā hana ʻike ʻikepili.

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

Nā nīnau laulā

No ka hoʻololi ʻana i kahi pūʻulu o nā moʻolelo, hāʻawi ʻo LMDB i kahi abstraction cursor. E nānā pehea e hana ai me ia me ka hoʻohana ʻana i ka laʻana o kahi papaʻaina me ka metadata kapuaʻi mea hoʻohana i kamaʻāina mua iā mākou.

Ma ke ʻano o ka hōʻike ʻana i kahi papa inoa o nā faila i kahi papa kuhikuhi, pono e ʻimi i nā kī āpau e pili ana i kāna mau faila a me nā waihona. Ma nā ʻāpana mua i hoʻokaʻawale mākou i nā kī NodeKey ʻo ia ka mea i kauoha mua ʻia e ka ID o ka papa kuhikuhi makua. No laila, ma ka ʻenehana, ʻo ka hana o ka hoʻihoʻi ʻana i nā mea i loko o kahi waihona e iho mai i ke kau ʻana i ka cursor ma ka palena o luna o ka hui o nā kī me kahi prefix i hāʻawi ʻia a laila e hoʻololi i ka palena haʻahaʻa.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Hiki ke loaʻa pololei ka palena o luna ma ka huli ʻana. No ka hana ʻana i kēia, kau ʻia ka cursor ma ka hoʻomaka o ka papa inoa holoʻokoʻa o nā kī i loko o ka waihona a hoʻonui hou ʻia a hiki i kahi kī me ka mea hōʻike o ka papa kuhikuhi makua ma lalo. Loaʻa kēia ʻano hana i 2 mau hemahema:

  1. ʻO ka paʻakikī huli laina, ʻoiai, e like me ka mea i ʻike ʻia, ma nā kumulāʻau ma ke ʻano nui a ma kahi kumu B-lāʻau hiki ke hana ʻia i ka manawa logarithmic.​
  2. No ka makehewa, ua hoʻokiʻekiʻe ʻia nā ʻaoʻao a pau ma mua o ka mea e ʻimi ʻia nei mai ka faila a i ka hoʻomanaʻo nui, ʻo ia ke kumu kūʻai nui.

ʻO ka mea pōmaikaʻi, hāʻawi ka LMDB API i kahi ala kūpono e hoʻonohonoho mua ai i ka cursor. No ka laʻana, e pili ana i ka papa inoa ma ka kiʻi ma luna, hiki iā mākou ke hana i kahi kī i loko o ke kahua parentId e like me ka 2, a ua piha na koena a pau i na zeros. Hāʻawi ʻia ia kī i hoʻopiha piha ʻia i ka hoʻokomo hana mdb_cursor_get e hōʻike ana i ka hana 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);

Inā ʻike ʻia ka palena o luna o kahi pūʻulu kī, a laila hoʻomaʻamaʻa mākou iā ia a hui mākou a hui paha ke kī me kekahi. parentId, a i ʻole e pau ʻole nā ​​kī.​

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

ʻO ka mea maikaʻi ma ke ʻano he ʻāpana o ka hoʻohana ʻana i ka mdb_cursor_get, loaʻa iā mākou ʻaʻole ke kī wale nō, akā ʻo ka waiwai pū kekahi. Inā, i mea e hoʻokō ai i nā kūlana hoʻohālike, pono ʻoe e nānā, ma waena o nā mea ʻē aʻe, nā māla mai ka ʻāpana waiwai o ka moʻolelo, a laila hiki ke loaʻa iā lākou me ka ʻole o nā hana hou.

4.3. Hoʻohālike i nā pilina ma waena o nā papa

I kēia manawa, ua hiki iā mākou ke noʻonoʻo i nā ʻano āpau o ka hoʻolālā ʻana a me ka hana ʻana me kahi waihona papaʻaina hoʻokahi. Hiki iā mākou ke ʻōlelo ʻo ka papaʻaina he pūʻulu o nā moʻolelo i hoʻokaʻawale ʻia me ke ʻano like o nā hui waiwai kī. Inā hōʻike ʻoe i kahi kī ma ke ʻano he rectangle a me ka waiwai pili e like me ka parallelepiped, loaʻa iā ʻoe kahi kiʻi ʻike o ka waihona.

ʻO

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

Eia nō naʻe, ma ke ola maoli ʻaʻole hiki ke loaʻa me ka liʻiliʻi o ka hoʻokahe koko. ʻO ka manawa pinepine i loko o kahi waihona e koi ʻia, ʻo ka mea mua, e loaʻa i nā papa he nui, a ʻo ka lua, e hana i nā koho i loko o lākou i kahi ʻokoʻa mai ke kī mua. ʻO kēia ʻāpana hope e pili ana i nā pilikia o kā lākou hana ʻana a me ka pilina.

Nā papa kuhikuhi

He ʻāpana "Gallery" ka noi ao. Hōʻike ia i ka ʻike media mai ke ao holoʻokoʻa, hoʻokaʻawale ʻia e ka lā. No ka hoʻokō maikaʻi ʻana i kēlā koho, ma ka ʻaoʻao o ka papa nui pono ʻoe e hana i kekahi me kahi ʻano kī hou. E loaʻa iā lākou kahi kahua me ka lā i hana ʻia ai ka faila, e hana ʻia ma ke ʻano he kumu koho mua. No ka mea e kuhikuhi ana nā kī hou i ka ʻikepili like me nā kī ma ka papa nui, ua kapa ʻia lākou he kī kuhikuhi. Ma ke kiʻi ma lalo nei ua hōʻike ʻia lākou i ka ʻalani.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

I mea e hoʻokaʻawale ai i nā kī o nā papa ʻokoʻa mai kekahi i kekahi i loko o ka waihona hoʻokahi, ua hoʻohui ʻia kahi papa ʻenehana ʻenehana hou aku iā lākou a pau. Ma ka hoʻolilo ʻana iā ia i mea koʻikoʻi loa no ka hoʻokaʻawale ʻana, e hoʻokō mākou i ka hui ʻana o nā kī ma mua ma nā papa, a ma loko o nā papa - e like me kā mākou mau lula ponoʻī.​

Hōʻike ke kī kuhikuhi i ka ʻikepili like me ke kī mua. ʻO ka hoʻokō pololei ʻana i kēia waiwai ma o ka hoʻopili ʻana me ia i kahi kope o ka ʻāpana waiwai o ke kī kumu ʻaʻole maikaʻi loa mai kekahi mau manaʻo:

  1. Ma ke ʻano o ka wahi i lawe ʻia, hiki ke waiwai nui ka metadata.
  2. Mai kahi hiʻohiʻona o ka hana, mai ka wā e hoʻonui ai i ka metadata o kahi node, pono ʻoe e kākau hou me ka hoʻohana ʻana i ʻelua kī.
  3. Mai ka manaʻo o ke kākoʻo code, inā hoʻopoina mākou i ka hoʻonui ʻana i ka ʻikepili no kekahi o nā kī, e loaʻa iā mākou kahi pahu paʻakikī o ka like ʻole o ka ʻikepili i ka waihona.

A laila, e noʻonoʻo mākou pehea e hoʻopau ai i kēia mau hemahema.

Hoʻonohonoho i nā pilina ma waena o nā papa

Ua kūpono ke kumu no ka hoʻopili ʻana i ka papa kuhikuhi me ka papa nui "key as value". E like me kona inoa e hōʻike nei, ʻo ka hapa waiwai o ka moʻolelo kuhikuhi he kope ia o ka waiwai kī mua. Hoʻopau kēia ala i nā hemahema a pau i ʻōlelo ʻia ma luna e pili ana i ka mālama ʻana i kahi kope o ka ʻāpana waiwai o ka moʻolelo mua. ʻO ke kumukūʻai wale nō ka loaʻa ʻana o kahi waiwai ma ke kī kuhikuhi, pono ʻoe e hana i 2 mau nīnau i ka waihona ma kahi o hoʻokahi. Ma keʻano kikoʻī, ua like ke ʻano o ka schema database.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO kekahi kumu no ka hoʻonohonoho ʻana i nā pilina ma waena o nā papa ʻaina "kī redundant". ʻO kāna kumu, ʻo ia ka hoʻohui ʻana i nā ʻano ʻē aʻe i ke kī, ʻaʻole pono no ka hoʻokaʻawale ʻana, akā no ka hana hou ʻana i ke kī pili. ʻO ka pōʻaiapili o nā kikoʻī iOS kikoʻī, e hāʻawi wau i kahi fictitious, akā he hiʻohiʻona maʻalahi.​

He ʻaoʻao ka poʻe kūʻai kelepona kelepona e hōʻike ana i nā faila a me nā waihona a ka mea hoʻohana i kaʻana like me nā poʻe ʻē aʻe. Ma muli o ka liʻiliʻi o ia mau faila, a he nui nā ʻano ʻike kikoʻī e pili ana i ka hoʻolaha e pili ana iā lākou (ʻo ia ka mea i hāʻawi ʻia i ke komo, me nā kuleana, a me nā mea ʻē aʻe), ʻaʻole kūpono ke kaumaha i ka ʻāpana waiwai o ka waihona. hoʻopaʻa ma ka papa nui me ia. Eia nō naʻe, inā makemake ʻoe e hōʻike i nā faila ma waho, pono ʻoe e mālama iā ia ma kahi. ʻO kahi hoʻonā kūlohelohe e hana i kahi papa ʻokoʻa no ia. Ma ke kiʻikuhi ma lalo nei, ua kau mua ʻia kāna kī me "P", a hiki ke pani ʻia ka "propname" wahi me ka waiwai kikoʻī "ʻike lehulehu".​

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO nā metadata kūʻokoʻa a pau, no ka mālama ʻana i ka papaʻaina hou, waiho ʻia ma ka ʻāpana waiwai o ka moʻolelo. I ka manawa like, ʻaʻole ʻoe makemake e hoʻokaʻawale i ka ʻikepili e pili ana i nā faila a me nā waihona i mālama ʻia ma ka papa nui. Akā, hoʻohui ʻia ka ʻikepili redundant i ke kī "P" ma ke ʻano o nā kahua "node ID" a me "timestamp". Mahalo iā lākou, hiki iā ʻoe ke kūkulu i kahi kī kuhikuhi, kahi e loaʻa ai iā ʻoe kahi kī mua, mai laila, i ka hopena, hiki iā ʻoe ke kiʻi i ka metadata node.

Ka hopena

Hoʻoholo maikaʻi mākou i nā hopena o ka hoʻokō ʻana o LMDB. Ma hope o ia, ua emi ka helu o nā noi manuahi e 30%.

ʻO ka ʻālohilohi a me ka ʻilihune o ka waihona waiwai nui LMDB i nā noi iOS

ʻO nā hopena o ka hana i hana ʻia ma mua o ka hui iOS. I kēia manawa, ua hoʻololi kekahi o nā ʻāpana "Files" nui i ka noi Android i ka hoʻohana ʻana iā LMDB, a aia nā ʻāpana ʻē aʻe ma ke ala. ʻO ka ʻōlelo C, kahi i hoʻokō ʻia ai ka hale kūʻai waiwai kī, he kōkua maikaʻi ia i ka hana mua ʻana i kahi papa hana a puni ia cross-platform ma C++. Ua hoʻohana ʻia kahi mea hoʻoheheʻe code no ka hoʻopili pono ʻana i ka waihona C++ me ka code platform ma Objective-C a me Kotlin. ʻO Djinni mai Dropbox, akā he moʻolelo ʻokoʻa loa kēlā.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka