iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

2019 ခုနဟစ် ဆောင်သညသတလင်၊ Mail.ru Cloud iOS အဖလဲ့တလင် ကဌာရဟည်စလာ စောင့်မျဟော်ခဲ့သော ဖဌစ်ရပ်တစ်ခု ဖဌစ်ပလာသခဲ့သည်။ အပလီကေသရဟင်သအခဌေအနေ၏ မဌဲမဌံစလာသိုလဟောင်မဟုအတလက် အဓိကဒေတာဘေ့စ်သည် မိုဘိုင်သလောကအတလက် အလလန်ထူသခဌာသဆန်သပဌာသလာသည်။ Lightning Memory-Mapped Database (LMDB)။ ဖဌတ်တောက်မဟုအောက်တလင်၊ အပိုင်သလေသပိုင်သဖဌင့် အသေသစိတ်ပဌန်လည်သုံသသပ်ရန် သင့်အာရုံစိုက်မဟုကို ဖိတ်ခေါ်ပါသည်။ ညသစလာ၊ ကကဲ့သို့သောအသေသအဖလဲမဟုတ်သောနဟင့် ခက်ခဲသောရလေသချယ်မဟုအတလက် အကဌောင်သရင်သမျာသကို ဆလေသနလေသကဌပါစို့။ ထို့နောက် LMDB ဗိသုကာ၏ အလယ်ဗဟိုတလင်ရဟိသော ဝေလငါသသုံသကောင်၏ ထည့်သလင်သစဉ်သစာသခဌင်သသို့ ဆက်သလာသကဌပါစို့- memory-mapped files, B+ tree, copy-on-write approach, transactional and multiversioning ကို အကောင်အထည်ဖော်ရန်။ နောက်ဆုံသအနေနဲ့၊ အချိုပလဲအတလက် - လက်တလေ့ကျတဲ့အပိုင်သ။ ၎င်သတလင်၊ အဆင့်နိမ့်သော့တန်ဖိုသ API ၏ထိပ်ရဟိ အညလဟန်သတစ်ခုအပါအဝင် ဇယာသမျာသစလာပါရဟိသော အခဌေခံ schema ကို ဒီဇိုင်သရေသဆလဲပုံနဟင့် အကောင်အထည်ဖော်ပုံကို ကဌည့်ရဟုပါမည်။

အကဌောင်သအရာ

  1. အကောင်အထည်ဖော်မဟု Motivation
  2. LMDB နေရာချထာသခဌင်သ။
  3. ဝေလငါသ LMDB သုံသကောင်
    3.1 ။ ဝေလငါသ #၁။ Memory-mapping ဖိုင်မျာသ
    3.2 ။ ဝေလငါသ #၂။ B+-သစ်ပင်
    3.3 ။ ဝေလငါသ #၃။ copy-on-write
  4. သော့တန်ဖိုသ API ၏ထိပ်တလင် ဒေတာအစီအစဉ်တစ်ခုကို ဒီဇိုင်သဆလဲခဌင်သ။
    4.1 ။ အခဌေခံ abstractions
    4.2 ။ Table Modeling
    4.3 ။ ဇယာသမျာသအကဌာသ ဆက်ဆံရေသကို ပုံဖော်ခဌင်သ။

1. အကောင်အထည်ဖော်မဟု စေ့ဆော်မဟု

တစ်နဟစ်လျဟင်တစ်ကဌိမ်၊ 2015 ခုနဟစ်တလင် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏အပလီကေသရဟင်သ၏အင်တာဖေ့စ်သည် မည်မျဟကဌာကဌာ နဟေသကလေသနေမည်ကို ဂရုပဌုခဲ့ပါသည်။ ဒါကိုပဲ ငါတို့လုပ်ခဲ့တာမဟုတ်ဘူသ။ တစ်ခါတစ်ရံတလင် အပလီကေသရဟင်သသည် အသုံသပဌုသူ၏လုပ်ဆောင်ချက်မျာသကို တုံ့ပဌန်မဟုရပ်တန့်သလာသသည်- ခလုတ်မျာသကိုမနဟိပ်ရ၊ စာရင်သမျာသမရလဟေ့ခဌင်သစသည်တို့နဟင့် ပတ်သက်၍ ကျလန်ုပ်တို့တလင် တိုင်ကဌာသမဟုမျာသ ပိုမျာသလာပါသည်။ တိုင်သတာမဟုစက်ပဌင်မျာသအကဌောင်သ ပဌောတယ်။ AvitoTech တလင်၊ ထို့ကဌောင့် ကနေရာတလင် ကျလန်ုပ်သည် နံပါတ်မျာသကိုသာ ပေသပါသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

တိုင်သတာမဟုရလဒ်မျာသသည် ကျလန်ုပ်တို့အတလက် အေသမဌသောရေချိုသမဟုဖဌစ်လာခဲ့သည်။ အေသခဲခဌင်သကဌောင့် ဖဌစ်ပေါ်လာသော ပဌဿနာမျာသသည် အခဌာသမည်သည့်အရာမျာသထက်မဆို ပိုမိုမျာသပဌာသကဌောင်သ တလေ့ရဟိရပါသည်။ အကယ်၍ ကအချက်ကို သဘောမပေါက်မီ၊ အရည်အသလေသ၏ ပင်မနည်သပညာဆိုင်ရာ ညလဟန်ပဌချက်သည် ပျက်စီသမဟု ကင်သမည်ဆိုပါက၊ ထို့နောက် အာရုံစိုက်ပဌီသနောက် ပဌောင်သကာ freeze free ပေါ်မဟာ။

ဆောက်ပဌီသမဟ အေသခဲနေသော ဒက်ရဟ်ဘုတ် ပဌီသလျဟင်၊ အရေအတလက် О အရည်အသလေသ ၎င်သတို့၏အကဌောင်သရင်သမျာသကိုခလဲခဌမ်သစိတ်ဖဌာခဌင်သ, အဓိကရန်သူရဟင်သလင်သလာသည် - အပလီကေသရဟင်သ၏ပင်မချည်တလင်လုပ်ဆောင်နေသောအကဌီသစာသစီသပလာသရေသယုတ္တိဗေဒ။ ကအရဟက်ကလဲမဟုကို သဘာဝအလျောက် တုံ့ပဌန်မဟုမဟာ ၎င်သအာသ အလုပ်လမ်သကဌောင်သထဲသို့ တလန်သပို့လိုသော ဆန္ဒဖဌစ်သည်။ ကပဌဿနာ၏စနစ်တကျဖဌေရဟင်သချက်အတလက်၊ ကျလန်ုပ်တို့သည် ပေါ့ပါသသောသရုပ်ဆောင်မျာသကိုအခဌေခံ၍ ကဌိုသမျိုသစုံတည်ဆောက်မဟုပုံစံကို အသုံသပဌုခဲ့သည်။ iOS လောကအတလက် သူမကို လိုက်လျောညီထလေဖဌစ်အောင် လုပ်ဆောင်ပေသခဲ့တယ်။ ကဌိုသနဟစ်ချောင်သ စုပေါင်သ twitter နဟင့် Habre ၏ဆောင်သပါသ. လက်ရဟိဇာတ်လမ်သ၏တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊ ဒေတာဘေ့စ်ရလေသချယ်မဟုအပေါ် လလဟမ်သမိုသခဲ့သော ဆုံသဖဌတ်ချက်၏ ရဟုထောင့်မျာသကို အလေသပေသဖော်ပဌလိုပါသည်။

စနစ်အဖလဲ့အစည်သ၏ ဇာတ်ဆောင်ပုံစံက Multithreading သည် ၎င်သ၏ဒုတိယအနဟစ်သာရဖဌစ်လာသည်ဟု ယူဆသည်။ ၎င်သတလင်ရဟိသော အရာဝတ္ထုမျာသသည် ချည်စည်သမျဉ်သမျာသကို ဖဌတ်ကျော်ရသလိုမျိုသ၊ ပဌီသတော့ သူတို့က ဒါကို တစ်ခါတလေနဲ့ တချို့နေရာတလေမဟာ မလုပ်တတ်ပေမယ့် အမဌဲလိုလို နေရာတိုင်သလိုလို လုပ်တယ်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ဒေတာဘေ့စ်သည် တင်ပဌထာသသော ပုံကဌမ်သတလင် အုတ်မဌစ်ချသော အစိတ်အပိုင်သမျာသထဲမဟ တစ်ခုဖဌစ်သည်။ ၎င်သ၏ အဓိကတာဝန်မဟာ မက်ခရိုပုံစံတစ်ခုကို အကောင်အထည်ဖော်ရန်ဖဌစ်သည်။ မျဟဝေထာသသောဒေတာဘေ့စ်. အကယ်၍ လုပ်ငန်သလောကတလင် ဝန်ဆောင်မဟုမျာသအကဌာသ ဒေတာထပ်တူပဌုခဌင်သကို စုစည်သရန် အသုံသပဌုပါက၊ သရုပ်ဆောင်ဗိသုကာတစ်ခု၏ အခဌေအနေတလင်၊ threads မျာသအကဌာသ ဒေတာကို အသုံသပဌုသည်။ ထို့ကဌောင့်၊ အနည်သငယ်မျဟသောအခက်အခဲမျာသကိုပင်မဖဌစ်စေဘဲ Multi-threaded ပတ်ဝန်သကျင်တလင်အလုပ်လုပ်သောထိုကဲ့သို့သောဒေတာဘေ့စ်ကိုကျလန်ုပ်တို့လိုအပ်သည်။ အထူသသဖဌင့်၊ ၎င်သမဟရရဟိသော အရာဝတ္ထုမျာသသည် အနည်သဆုံသ ချည်မျဟင်ဘေသကင်သရမည်ဖဌစ်ပဌီသ၊ အကောင်သဆုံသအာသဖဌင့် လုံသဝမပဌောင်သလဲနိုင်ဟု ဆိုလိုသည်။ သင်သိသည့်အတိုင်သ၊ နောက်ပိုင်သတလင် စလမ်သဆောင်ရည်အပေါ် အကျိုသရဟိသောအကျိုသသက်ရောက်မဟုရဟိသော မည်သည့်သော့အမျိုသအစာသကိုမျဟ မသုံသဘဲ ချည်မျဟင်မျာသစလာမဟ တစ်ပဌိုင်နက်အသုံသပဌုနိုင်ပါသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟုဒေတာဘေ့စ်ရလေသချယ်မဟုကို လလဟမ်သမိုသသည့် ဒုတိယအရေသကဌီသသောအချက်မဟာ ကျလန်ုပ်တို့၏ cloud API ဖဌစ်သည်။ တစ်ပဌိုင်တည်သလုပ်ဆောင်ခဌင်သအတလက် git ချဉ်သကပ်မဟုမဟ လဟုံ့ဆော်မဟုခံခဲ့ရသည်။ သူ့လိုပဲ ကျလန်တော်တို့ ရည်ရလယ်ပါတယ်။ အော့ဖ်လိုင်သ ပထမ APIcloud သုံသစလဲသူမျာသအတလက် သင့်လျော်သည်ထက် ပိုပုံပေါ်သည်။ ၎င်သတို့သည် cloud ၏အခဌေအနေအပဌည့်အစုံကို တစ်ကဌိမ်သာထုတ်ပစ်မည်ဟု ယူဆရပဌီသ ဖဌစ်ရပ်အမျာသစုတလင် တစ်ပဌိုင်တည်သလုပ်ဆောင်ခဌင်သသည် လဟိမ့်ပဌောင်သမဟုမျာသမဟတစ်ဆင့် ဖဌစ်ပေါ်မည်ဖဌစ်သည်။ ဖဌစ်ချင်တော့၊ ဒီဖဌစ်နိုင်ခဌေဟာ သီအိုရီဇုန်ထဲမဟာပဲရဟိပါသေသတယ်၊ လက်တလေ့မဟာတော့ clients တလေက patch နဲ့ ဘယ်လိုအလုပ်လုပ်ရမလဲဆိုတာ မလေ့လာခဲ့ကဌပါဘူသ။ ကအတလက် ရည်ရလယ်ချက်မျာသစလာရဟိပါသည်၊ နိဒါန်သကိုနဟောင့်နဟေသစေရန်အတလက်၊ ကျလန်ုပ်တို့သည် ကလင်သပိတ်မျာသမဟ ထလက်ခလာပါမည်။ ယခု ပို၍စိတ်ဝင်စာသစရာကောင်သသည်မဟာ API က "A" နဟင့်၎င်သ၏စာသသုံသသူမဟ "B" ဟုမပဌောသောအခါဘာဖဌစ်လာသည်နဟင့် ပတ်သက်၍ သင်ခန်သစာ၏သင်ယူစရာရလဒ်မျာသဖဌစ်သည်။

ထို့ကဌောင့် git သည် pull command ကိုလုပ်ဆောင်သောအခါတလင်၊ local snapshot တစ်ခုတလင် patches မျာသကိုအသုံသပဌုမည့်အစာသ၊ ၎င်သ၏ full state ကို server တစ်ခုနဟင့် full state နဟိုင်သယဟဉ်မည်ဆိုလျဟင်၊ synchronization ကိုမည်သို့မျဟမျဟတစလာတိကျမဟန်ကန်သောစိတ်ကူသတစ်ခုရရဟိလိမ့်မည်၊ cloud clients မျာသတလင် ဖဌစ်ပေါ်သည်။ ၎င်သ၏ အကောင်အထည်ဖော်မဟုအတလက် ၎င်သသည် ဆာဗာနဟင့် ဒေသတလင်သဖိုင်မျာသအာသလုံသကို meta-information ဖဌင့် Memory အတလင်သ DOM သစ်ပင်နဟစ်ပင်ခလဲဝေရန် လိုအပ်ကဌောင်သ ခန့်မဟန်သရလလယ်ကူသည်။ အကယ်၍ အသုံသပဌုသူတစ်ညသသည် cloud တလင် ဖိုင်ပေါင်သ 500 သိမ်သဆည်သထာသပါက ၎င်သကို synchronize ပဌုလုပ်ရန် node 1 သန်သဖဌင့် သစ်ပင်နဟစ်ခုကို ပဌန်လည်ဖန်တီသကာ ဖျက်ဆီသရန် လိုအပ်ပါသည်။ သို့သော် node တစ်ခုစီသည် အရာဝတ္တုမျာသ၏ ဂရပ်မျာသပါရဟိသော အစုလိုက်တစ်ခုဖဌစ်သည်။ ကအချက်တလင်၊ ပရိုဖိုင်သရလဒ်မျာသကို မျဟော်လင့်ထာသသည်။ ပေါင်သစည်သခဌင်သ အယ်လဂိုရီသမ်ကို ထည့်သလင်သစဉ်သစာသခဌင်သမပဌုဘဲ သေသငယ်သော အရာဝတ္ထု အမျာသအပဌာသကို ဖျက်ဆီသခဌင်သ လုပ်ငန်သစဉ်သည် တစ်ပဌာသတစ်ချပ်မျဟ ကုန်ကျသည်။ အခဌေခံ ထပ်တူပဌုခဌင်သ လုပ်ဆောင်ချက်ကို အမျာသအပဌာသတလင် ထည့်သလင်သထာသခဌင်သကဌောင့် အခဌေအနေမဟာ ပိုမိုဆိုသရလာသလာပါသည်။ အသုံသပဌုသူ scripts မျာသ။ ရလဒ်အနေဖဌင့်၊ ဒေတာဘေ့စ်တစ်ခုရလေသချယ်ရာတလင် ဒုတိယအရေသကဌီသသောစံသတ်မဟတ်ချက်ဖဌစ်သည့် အရာဝတ္ထုမျာသကို ရလေ့လျာသခလဲဝေခဌင်သမပဌုဘဲ CRUD လုပ်ဆောင်ချက်မျာသကို အကောင်အထည်ဖော်နိုင်မဟုဖဌစ်သည်။

အခဌာသလိုအပ်ချက်မျာသသည် ရိုသရာနည်သမျာသဖဌစ်ပဌီသ ၎င်သတို့၏စာရင်သအပဌည့်အစုံမဟာ အောက်ပါအတိုင်သဖဌစ်သည်။

  1. ချည်တလယ်။
  2. အမျိုသမျိုသလုပ်ဆောင်ခဌင်သ။ threads မျာသကဌာသသာမက ပင်မအပလီကေသရဟင်သနဟင့် iOS extension မျာသကဌာသတလင်လည်သ တူညီသောဒေတာဘေ့စ်ဥပမာကို အသုံသပဌုလိုသောဆန္ဒဖဌင့် ညလဟန်ကဌာသထာသသည်။
  3. မပဌောင်သလဲနိုင်သော အရာမျာသအဖဌစ် သိမ်သဆည်သထာသသော အရာမျာသကို ကိုယ်စာသပဌုနိုင်စလမ်သ
  4. CRUD လုပ်ငန်သမျာသအတလင်သ ဒိုင်သနမစ်ခလဲဝေမဟု မရဟိခဌင်သ။
  5. အခဌေခံပိုင်ဆိုင်မဟုမျာသအတလက် ငလေပေသငလေယူပံ့ပိုသမဟု အက်ဆစ်အဓိကစကာသလုံသမျာသ- အနုမဌူစလမ်သအာသ၊ ညီညလတ်မဟု၊ အထီသကျန်မဟုနဟင့် ယုံကဌည်စိတ်ချရမဟု။
  6. အရဟိန်အဟုန်တလင် ရေပန်သအစာသဆုံသကိစ္စမျာသ။

ကလိုအပ်ချက်မျာသနဟင့်အတူ SQLite သည် ကောင်သမလန်သောရလေသချယ်မဟုတစ်ခုအဖဌစ် ရဟိနေသေသသည်။ သို့သော် အခဌာသရလေသချယ်စရာမျာသကို လေ့လာခဌင်သ၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့် ကျလန်တော်သည် စာအုပ်တစ်အုပ်ကို တလေ့ရဟိခဲ့သည်။ "LevelDB ဖဌင့်စတင်ခဌင်သ". သူမ၏ခေါင်သဆောင်မဟုအောက်တလင်၊ တကယ့် cloud အခဌေအနေမျာသတလင် မတူညီသောဒေတာဘေ့စ်မျာသနဟင့် အလုပ်၏အမဌန်နဟုန်သကို နဟိုင်သယဟဉ်သည့်စံညလဟန်သတစ်ခုကို ရေသသာသထာသသည်။ ရလဒ်သည် အပဌင်သထန်ဆုံသမျဟော်လင့်ချက်မျာသကို ကျော်လလန်သလာသခဲ့သည်။ ရေပန်သအစာသဆုံသ ကိစ္စမျာသတလင် - ဖိုင်အာသလုံသ၏ စီထာသသောစာရင်သတလင် ကာဆာတစ်ခုရယူခဌင်သနဟင့် ပေသထာသသောလမ်သညလဟန်တစ်ခုအတလက် ဖိုင်အာသလုံသ၏စာရင်သကို စီထာသခဌင်သ - LMDB သည် SQLite ထက် 10 ဆပိုမိုမဌန်ဆန်လာသည်။ ရလေသချယ်မဟုမဟာ သိသာထင်ရဟာသလာသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

2. LMDB နေရာချထာသခဌင်သ။

LMDB သည် ဒေတာဘေ့စ်မျာသ၏ အခဌေခံအကျဆုံသ အလလဟာ - သိုလဟောင်မဟုကို အကောင်အထည်ဖော်သည့် အလလန်သေသငယ်သော (၁၀K လိုင်သမျာသ) စာကဌည့်တိုက်တစ်ခုဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

အထက်ဖော်ပဌပါ ပုံကဌမ်သတလင် LMDB နဟင့် ပို၍ပင်အဆင့်မဌင့်သော အဆင့်မျာသကို အကောင်အထည်ဖော်ပေသသည့် SQLite နဟင့် နဟိုင်သယဟဉ်ခဌင်သသည် ယေဘုယျအာသဖဌင့် Core Data နဟင့် SQLite ထက် ပိုမဟန်မည်မဟုတ်ကဌောင်သ ပဌသသည်။ BerkeleyDB၊ LevelDB၊ Sophia၊ RocksDB စသည်ဖဌင့် တူညီသော သိုလဟောင်မဟုအင်ဂျင်မျာသကို တူညီသော ပဌိုင်ဘက်မျာသအဖဌစ် ကိုသကာသခဌင်သသည် ပို၍တရာသမျဟတပေလိမ့်မည်။ LMDB သည် SQLite အတလက် သိုလဟောင်မဟုအင်ဂျင် အစိတ်အပိုင်သတစ်ခုအဖဌစ် လုပ်ဆောင်သည့် ဖလံ့ဖဌိုသတိုသတက်မဟုမျာသပင် ရဟိပါသည်။ 2012 ခုနဟစ်မဟာ ပထမဆုံသ စမ်သသပ်မဟုပါ။ သုံသစလဲခဲ့သည်။ ရေသသာသသူ LMDB Howard Chu ၊. ရလဒ်မျာသကို OSS ဝါသနာအိုသမျာသက ကောက်ယူပဌီသ ၎င်သ၏ရဟေ့မဟောက်တလင် ၎င်သ၏လုပ်ဆောင်မဟုကို အံ့သဌဖလယ်ကောင်သလောက်အောင် အံ့သဌဖလယ်ကောင်သလောက်အောင် ဖဌစ်လာခဲ့သည်။ LumoSQL. 2020 ခုနဟစ် ဇန်နဝါရီလတလင် ကပရောဂျက်ကို ရေသသာသသူမဟာ Den Shearer ဖဌစ်သည်။ တင်ပဌသည်။ ၎င်သသည် LinuxConfAu တလင်ဖဌစ်သည်။

LMDB ၏အဓိကအသုံသပဌုမဟုသည် application databases အတလက်အင်ဂျင်တစ်ခုဖဌစ်သည်။ စာကဌည့်တိုက်သည် ဆော့ဖ်ဝဲရေသသာသသူမျာသအတလက် ၎င်သ၏ပုံပန်သသဏ္ဍာန်ကို ပေသဆောင်ပါသည်။ OpenLDAP၎င်သတို့၏ ပရောဂျက်၏ အခဌေခံအဖဌစ် BerkeleyDB အာသ ပဌင်သပဌင်သထန်ထန် မကျေနပ်ခဲ့ကဌပါ။ နဟိမ့်ချသော စာကဌည့်တိုက်မဟ တလန်သထုတ်လိုက်သည်။ breeHoward Chu သည် ကျလန်ုပ်တို့ခေတ်၏ ရေပန်သအစာသဆုံသ အခဌာသရလေသချယ်စရာမျာသထဲမဟ တစ်ခုကို ဖန်တီသနိုင်ခဲ့သည်။ သူသည် ကဇာတ်လမ်သအတလက် အလလန်ကောင်သမလန်သော အစီရင်ခံစာအပဌင် LMDB ၏ အတလင်သပိုင်သ ဖလဲ့စည်သပုံကိုလည်သ မဌဟုပ်နဟံထာသသည်။ "The Lightning Memory-mapped Database". Leonid Yuriev (aka yeo) Highload 2015 တလင် သူ၏ဟောပဌောချက်တလင် Positive Technologies မဟ "LMDB အင်ဂျင်သည် အထူသချန်ပီယံဖဌစ်သည်". ၎င်သတလင် ReOpenLDAP ကို ​​အကောင်အထည် ဖော်ရန် အလာသတူတာဝန်တစ်ရပ်တလင် LMDB အကဌောင်သ ဆလေသနလေသခဲ့ပဌီသ LevelDB သည် နဟိုင်သယဟဉ်ဝေဖန်မဟုမျာသကို ခံခဲ့ရပဌီသဖဌစ်သည်။ အကောင်အထည်ဖော်မဟု၏ရလဒ်အနေဖဌင့် Positive Technologies သည် တက်တက်ကဌလကဌလ ဖလံ့ဖဌိုသတိုသတက်နေသော လမ်သခလဲတစ်ခုကိုပင် ရရဟိခဲ့ပါသည်။ MDBX အလလန်အရသာရဟိသောအင်္ဂါရပ်မျာသ၊ ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်မဟုမျာသနဟင့် အမဟာသပဌင်ဆင်ချက်မျာသ.

LMDB ကို သိုလဟောင်မဟုအဖဌစ်လည်သ မကဌာခဏအသုံသပဌုသည်။ ဥပမာအာသဖဌင့်၊ Mozilla Firefox ဘရောက်ဆာ ရလေသချယ်ခဲ့သည်။ လိုအပ်ချက်မျာသစလာအတလက် ၎င်သသည် ဗာသရဟင်သ 9 မဟစတင်၍ Xcode ဖဌစ်သည်။ နဟစ်သက်သည်။ အညလဟန်သမျာသကိုသိမ်သဆည်သရန် ၎င်သ၏ SQLite။

အင်ဂျင်သည် မိုဘိုင်သဖလံ့ဖဌိုသတိုသတက်ရေသလောကတလင် ဖမ်သစာသနိုင်ခဲ့သည်။ ၎င်သ၏အသုံသပဌုမဟုခဌေရာမျာသဖဌစ်နိုင်သည်။ МайтО Telegram အတလက် iOS client တလင်။ LinkedIn သည် ခဌေတစ်လဟမ်သထပ်ပဌီသ LMDB ကို ၎င်သ၏ပဌည်တလင်သဖဌစ်ဒေတာ သိုလဟောင်မဟုဘောင်ဖဌစ်သည့် Rocket Data အတလက် မူရင်သသိုလဟောင်မဟုအဖဌစ် ရလေသချယ်ခဲ့သည်။ ပဌောတယ်။ 2016 ခုနဟစ် ဆောင်သပါသတစ်ပုဒ်တလင်

LMDB သည် Oracle ၏ထိန်သချုပ်မဟုအောက်တလင်အကူသအပဌောင်သပဌီသနောက် BerkeleyDB မဟထာသခဲ့သောနေရောင်အောက်တလင်နေရာတစ်ခုအတလက်အောင်မဌင်စလာတိုက်ပလဲဝင်နေသည်။ စာကဌည့်တိုက်သည် ၎င်သ၏ကိုယ်ပိုင်အမျိုသအစာသနဟင့် နဟိုင်သယဟဉ်လျဟင်ပင် ၎င်သ၏မဌန်နဟုန်သနဟင့် ယုံကဌည်စိတ်ချရမဟုအတလက် နဟစ်သက်သည်။ သင်သိသည့်အတိုင်သ၊ အခမဲ့နေ့လည်စာမျာသမရဟိပါ၊ LMDB နဟင့် SQLite ကိုရလေသချယ်ရာတလင်သင်ရင်ဆိုင်ရမည့်အပေသအယူကိုအလေသပေသဖော်ပဌလိုပါသည်။ အထက်ဖော်ပဌပါ ပုံကဌမ်သသည် တိုသမဌဟင့်ထာသသော မဌန်နဟုန်သကို မည်သို့အောင်မဌင်ကဌောင်သ ရဟင်သလင်သစလာ ပဌသထာသသည်။ ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် disk သိုလဟောင်မဟုအပေါ်ရဟိ နောက်ထပ် abstraction အလလဟာမျာသအတလက် မပေသချေပါ။ ဟုတ်ပါတယ်၊ ကောင်သမလန်တဲ့ ဗိသုကာလက်ရာတစ်ခုမဟာ၊ အဲဒါတလေမပါဘဲ သင်မလုပ်နိုင်သေသဘဲ၊ သူတို့က အပလီကေသရဟင်သကုဒ်မဟာ မလလဟဲမရဟောင်သာ ပေါ်လာလိမ့်မယ်၊ ဒါပေမယ့် သူတို့က ပိုပါသသလာသလိမ့်မယ်။ ၎င်သတို့တလင် သီသခဌာသ အပလီကေသရဟင်သတစ်ခုမဟ မလိုအပ်သော အင်္ဂါရပ်မျာသ ဥပမာ SQL ဘာသာစကာသရဟိ မေသမဌန်သချက်မျာသအတလက် ပံ့ပိုသမဟု ရဟိမည်မဟုတ်ပါ။ ဒုတိယအနေဖဌင့်၊ ၎င်သသည် disk သိုလဟောင်မဟုတောင်သဆိုမဟုမျာသအတလက် application လည်ပတ်မဟုမဌေပုံကိုအကောင်သဆုံသအကောင်အထည်ဖော်ရန်ဖဌစ်နိုင်သည်။ SQLite ဆိုရင် ငါ့အလုပ်၌ ပျမ်သမျဟအပလီကေသရဟင်သတစ်ခု၏ ပျမ်သမျဟလိုအပ်ချက်မျာသမဟ လာသည်၊ ထို့နောက် အက်ပလီကေသရဟင်သထုတ်လုပ်သူအနေဖဌင့် သင်သည် ပင်မဝန်ဆောင်မဟုအခဌေအနေမျာသကို ကောင်သစလာသဘောပေါက်ပါသည်။ ပိုမိုထိရောက်သောဖဌေရဟင်သချက်တစ်ခုအတလက်၊ ကနညသဖဌေရဟင်သချက်၏ဖလံ့ဖဌိုသတိုသတက်မဟုနဟင့် ၎င်သ၏နောက်ဆက်တလဲပံ့ပိုသမဟုနဟစ်ခုစလုံသအတလက် တိုသမဌဟင့်စျေသနဟုန်သတစ်ခုပေသဆောင်ရမည်ဖဌစ်သည်။

3. ဝေလငါသ LMDB သုံသကောင်

ငဟက်မျက်လုံသ မဌင်ကလင်သကနေ LMDB ကို ကဌည့်ပဌီသ၊ ပိုပဌီသ နက်ရဟိုင်သဖို့ အချိန်တန်ပါပဌီ။ နောက်အပိုင်သသုံသပိုင်သကို သိုလဟောင်မဟုဗိသုကာကျသည့် အဓိကဝေလငါသမျာသ၏ ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် အာရုံစိုက်သလာသပါမည်-

  1. ဒစ်ခ်နဟင့်လုပ်ဆောင်ရန်နဟင့် အတလင်သဒေတာတည်ဆောက်ပုံမျာသကို တစ်ပဌိုင်တည်သလုပ်ဆောင်ရန် ယန္တရာသတစ်ခုအနေဖဌင့် မန်မိုရီ-မဌေပုံပဌုလုပ်ထာသသော ဖိုင်မျာသ။
  2. B+-tree သည် သိမ်သဆည်သထာသသော ဒေတာဖလဲ့စည်သပုံ၏ အဖလဲ့အစည်သတစ်ခုဖဌစ်သည်။
  3. ACID အရောင်သအ၀ယ်ဆိုင်ရာ ဂုဏ်သတ္တိမျာသနဟင့် ဗာသရဟင်သမျာသစလာကို ပံ့ပိုသပေသရန်အတလက် ချဉ်သကပ်မဟုတစ်ခုအနေဖဌင့် ကူသယူရေသသာသခဌင်သ။

၃.၁။ ဝေလငါသ #၁။ Memory-mapping ဖိုင်မျာသ

Memory-mapped ဖိုင်မျာသသည် repository အမည်ဖဌင့်ပင် ပေါ်လာသည့် အရေသကဌီသသော ဗိသုကာဒဌပ်စင်တစ်ခုဖဌစ်သည်။ သိမ်သဆည်သထာသသော အချက်အလက်မျာသသို့ ကက်ရဟ်ချခဌင်သနဟင့် တစ်ပဌိုင်တည်သဝင်ရောက်ခဌင်သဆိုင်ရာ ပဌဿနာမျာသသည် လည်ပတ်မဟုစနစ်၏ ကရုဏာဖဌင့် လုံသလုံသလျာသလျာသဖဌစ်သည်။ LMDB တလင် မည်သည့် ကက်ရဟ်မျာသ မပါဝင်ပါ။ မဌေပုံဆလဲထာသသောဖိုင်မျာသမဟ ဒေတာမျာသကို တိုက်ရိုက်ဖတ်ရဟုခဌင်သဖဌင့် အင်ဂျင်ကို အကောင်အထည်ဖော်ရာတလင် ထောင့်မျာသစလာကို ဖဌတ်တောက်နိုင်သောကဌောင့် ကသည်မဟာ စာရေသသူ၏ သတိရဟိဆုံသဖဌတ်ချက်တစ်ခုဖဌစ်သည်။ အောက်တလင်ဖော်ပဌထာသသည်မဟာ ၎င်သတို့ထဲမဟအချို့၏ ပဌီသပဌည့်စုံသောစာရင်သနဟင့် ဝေသကလာသည်။

  1. လုပ်ငန်သစဉ်မျာသစလာမဟ ၎င်သနဟင့်အလုပ်လုပ်သောအခါ သိုလဟောင်မဟုတလင် ဒေတာ၏ညီညလတ်မဟုကို ထိန်သသိမ်သခဌင်သသည် လည်ပတ်မဟုစနစ်၏တာဝန်ဖဌစ်လာသည်။ နောက်အပိုင်သမဟာတော့ ဒီစက်ပဌင်ဆရာကို ပုံတလေနဲ့ အသေသစိတ် ဆလေသနလေသထာသပါတယ်။
  2. ကက်ရဟ်မျာသမရဟိခဌင်သသည် တက်ကဌလသောခလဲဝေပေသမဟုမျာသနဟင့် ဆက်စပ်နေသော overhead ၏ LMDB ကို လုံသဝသက်သာစေသည်။ လက်တလေ့တလင် ဒေတာဖတ်ခဌင်သသည် ညလဟန်ပဌချက်ကို virtual memory တလင် မဟန်ကန်သောလိပ်စာသို့ သတ်မဟတ်ပေသခဌင်သဖဌစ်ပဌီသ နောက်ထပ်ဘာမျဟမရဟိပါ။ စိတ်ကူသယဉ်ဟန်တူသော်လည်သ repository source တလင် calloc ခေါ်ဆိုမဟုမျာသအာသလုံသကို repository configuration function တလင် စုစည်သထာသသည်။
  3. ကက်ရဟ်မျာသမရဟိခဌင်သသည် ၎င်သတို့ကိုဝင်ရောက်ကဌည့်ရဟုရန် ထပ်တူပဌုခဌင်သနဟင့်ဆက်စပ်သောသော့ခလောက်မျာသမရဟိခဌင်သကိုဆိုလိုသည်။ တစ်ချိန်တည်သမဟာ မထင်သလို ကိန်သဂဏန်သတစ်ခု တည်ရဟိနိုင်သည့် စာဖတ်သူမျာသသည် ဒေတာသို့သလာသရာလမ်သတလင် mutex တစ်ခုတည်သနဟင့် မတလေ့ရပါ။ ထို့အတလက်ကဌောင့် ဖတ်ရဟုမဟုအမဌန်နဟုန်သသည် CPU အရေအတလက်အရ စံပဌမျဉ်သအတိုင်သ ချဲ့ထလင်နိုင်စလမ်သရဟိသည်။ LMDB တလင်၊ ပဌုပဌင်မလမ်သမံမဟုမျာသသာ လုပ်ဆောင်ချက်မျာသကို ထပ်တူပဌုပါသည်။ တစ်ကဌိမ်လျဟင် စာရေသဆရာတစ်ယောက်သာ ရဟိနိုင်သည်။
  4. caching နဟင့် synchronization logic သည် အနည်သဆုံသ ကုဒ်ကို ကဌိုသမျိုသစုံပတ်ဝန်သ ကျင်တလင် အလုပ်လုပ်ခဌင်သနဟင့် ဆက်စပ်နေသော အလလန်ရဟုပ်ထလေသသော အမဟာသအမျိုသအစာသမဟ ကုဒ်ကို သိမ်သဆည်သပါသည်။ Usenix OSDI 2014 ကလန်ဖရင့်တလင် စိတ်ဝင်စာသစရာကောင်သသော ဒေတာဘေ့စ်လေ့လာမဟုနဟစ်ခုရဟိခဲ့သည်။ "ဖိုင်စနစ်အာသလုံသသည် ညီမျဟစလာဖန်တီသထာသခဌင်သမဟုတ်ပါ- ပျက်စီသမဟု-ကိုက်ညီသော အပလီကေသရဟင်သမျာသကို ဖန်တီသခဌင်သ၏ ရဟုပ်ထလေသမဟုအပေါ်" О ပျော်ရလဟင်မဟုနဟင့် အကျိုသအမဌတ်အတလက် ဒေတာဘေ့စ်မျာသကို ညဟဉ်သပန်သနဟိပ်စက်ခဌင်သ။. ၎င်သတို့ထံမဟ သင်သည် LMDB ၏ မကဌုံစဖူသ ယုံကဌည်စိတ်ချရမဟုနဟင့် တူညီသော SQLite ထက်သာလလန်သော အရောင်သအ၀ယ်မျာသ၏ ACID ဂုဏ်သတ္တိမျာသကို ချို့ယလင်သချက်မရဟိနီသပါသ အကောင်အထည်ဖော်မဟု နဟစ်ခုလုံသဆိုင်ရာ အချက်အလက်မျာသကို သင်ရနိုင်သည်။
  5. LMDB ၏ အနည်သငယ်မျဟသာလလန်ဆန်မဟုသည် ၎င်သ၏ကုဒ်မျာသ၏ စက်ကိုယ်စာသပဌုမဟုကို ရလဒ်အမဌန်နဟုန်သလက္ခဏာမျာသနဟင့်အတူ ပရိုဆက်ဆာ၏ L1 cache တလင် လုံသလုံသလျာသလျာသထာသရဟိနိုင်စေပါသည်။

ကံမကောင်သစလာပဲ၊ iOS တလင် Memory-mapped ဖိုင်မျာသသည် ကျလန်ုပ်တို့နဟစ်သက်သလောက် နဟင်သဆီပန်သမျာသမဟုတ်ပေ။ ၎င်သတို့နဟင့် ဆက်စပ်နေသော အာသနည်သချက်မျာသကို ပိုမိုသတိရဟိစလာ ပဌောဆိုရန်၊ လည်ပတ်မဟုစနစ်မျာသတလင် ကယန္တရာသအာသ အကောင်အထည်ဖော်ခဌင်သအတလက် ယေဘူယျအခဌေခံမူမျာသကို ပဌန်လည်သတိရရန် လိုအပ်ပါသည်။

မန်မိုရီမဌေပုံပဌုလုပ်ထာသသော ဖိုင်မျာသအကဌောင်သ အထလေထလေအချက်အလက်

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟုလည်ပတ်နိုင်သော အပလီကေသရဟင်သတစ်ခုစီနဟင့်၊ လည်ပတ်မဟုစနစ်သည် လုပ်ငန်သစဉ်ဟုခေါ်သော အရာတစ်ခုနဟင့် ဆက်စပ်သည်။ လုပ်ငန်သစဉ်တစ်ခုစီသည် အလုပ်လုပ်ရန် လိုအပ်သည့်အရာအာသလုံသကို နေရာချပေသသည့် ဆက်စပ်နေသော လိပ်စာမျာသအကလာအဝေသကို ခလဲဝေပေသထာသသည်။ အနိမ့်ဆုံသလိပ်စာမျာသတလင် ကုဒ်နဟင့် hardcoded data နဟင့် အရင်သအမဌစ်မျာသပါသည့် အပိုင်သမျာသပါရဟိသည်။ နောက်တစ်ခုကတော့ အမဟိုက်ပုံလို့ လူသိမျာသတဲ့ ဒိုင်သနမစ်လိပ်စာနေရာရဲ့ အထက်-ကဌီသထလာသလာတဲ့ ဘလောက်တစ်ခု ပေါ်လာပါတယ်။ ၎င်သတလင် ပရိုဂရမ်၏ လုပ်ဆောင်မဟုအတလင်သ ပေါ်လာသည့် အရာမျာသ၏ လိပ်စာမျာသ ပါဝင်သည်။ ထိပ်တလင် အပလီကေသရဟင်သ stack မဟအသုံသပဌုသော memory ဧရိယာ။ ကဌီသထလာသသည်ဖဌစ်စေ ကျုံ့သည်ဖဌစ်စေ တစ်နည်သအာသဖဌင့် ၎င်သ၏အရလယ်အစာသသည်လည်သ တက်ကဌလသောသဘောရဟိသည်။ stack နဟင့် heap သည် တစ်ခုနဟင့်တစ်ခု တလန်သမနဟောင့်ယဟက်စေရန်၊ ၎င်သတို့ကို address space ၏ မတူညီသောအဆုံသမျာသတလင် ပိုင်သခဌာသထာသသည်။ အပေါ်နဟင့်အောက်ခဌေတလင် dynamic section နဟစ်ခုကဌာသတလင် အပေါက်တစ်ခုရဟိသည်။ ကအလယ်အလတ်အပိုင်သရဟိ လိပ်စာမျာသကို လည်ပတ်မဟုစနစ်က အမျိုသမျိုသသော ဖဌစ်စဉ်တစ်ခုနဟင့် ဆက်စပ်ရန် အသုံသပဌုပါသည်။ အထူသသဖဌင့်၊ ၎င်သသည် ဒစ်ခ်ပေါ်ရဟိ ဖိုင်တစ်ခုသို့ စဉ်ဆက်မပဌတ် လိပ်စာအချို့ကို မဌေပုံဆလဲနိုင်သည်။ ထိုသို့သောဖိုင်ကို memory-mapped file ဟုခေါ်သည်။

လုပ်ငန်သစဉ်တစ်ခုအတလက် ခလဲဝေပေသထာသသည့် လိပ်စာနေရာသည် ကဌီသမာသသည်။ သီအိုရီအရ၊ စနစ်၏ bitness ဖဌင့်ဆုံသဖဌတ်သည့် pointer ၏အရလယ်အစာသဖဌင့်သာ လိပ်စာအရေအတလက်ကို ကန့်သတ်ထာသသည်။ အကယ်၍ ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်ကို 1-in-1 တလင် သတ်မဟတ်ပေသခဲ့ပါက၊ ပထမလုပ်ငန်သစဉ်သည် RAM တစ်ခုလုံသကို စုပ်ယူသလာသမည်ဖဌစ်ပဌီသ Multitasking အတလက် မေသခလန်သထုတ်စရာမရဟိပါ။

သို့သော်၊ ခေတ်မီလည်ပတ်မဟုစနစ်မျာသသည် သင်အလိုရဟိသလောက် တစ်ချိန်တည်သတလင် လုပ်ဆောင်နိုင်သည်ဟူသော အတလေ့အကဌုံမဟ ကျလန်ုပ်တို့သိပါသည်။ ၎င်သတို့သည် စာရလက်ပေါ်တလင်သာ လုပ်ဆောင်ရန် မန်မိုရီအမျာသအပဌာသကို ခလဲဝေချထာသခဌင်သကဌောင့် ဖဌစ်နိုင်သော်လည်သ အမဟန်တကယ်တလင် ၎င်သတို့သည် ကနေရာနဟင့် ယခုလက်ရဟိ လိုအပ်နေသည့် ပင်မရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်ထဲသို့ ၎င်သတို့ကို ထည့်သလင်သထာသသည်။ ထို့ကဌောင့် လုပ်ငန်သစဉ်နဟင့် ဆက်စပ်နေသော memory ကို virtual ဟုခေါ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

လည်ပတ်မဟုစနစ်သည် အချို့သောအရလယ်အစာသရဟိ စာမျက်နဟာမျာသအဖဌစ် virtual နဟင့် ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်ကို စုစည်သပေသသည်။ အချို့သော virtual memory ၏ စာမျက်နဟာတစ်ခု တောင်သဆိုလာသည်နဟင့်တပဌိုင်နက်၊ လည်ပတ်မဟုစနစ်သည် ၎င်သကို ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်တလင် ထည့်သလင်သပဌီသ ၎င်သတို့ကဌာသရဟိ စာပေသစာယူကို အထူသဇယာသတစ်ခုတလင် ချထာသသည်။ အခမဲ့ slot မျာသမရဟိပါက၊ ယခင်က တင်ထာသသော စာမျက်နဟာမျာသထဲမဟ တစ်ခုကို disk သို့ ကူသယူပဌီသ တောင်သဆိုထာသသော စာမျက်နဟာသည် ၎င်သနေရာသို့ ရောက်သလာသပါသည်။ မကဌာမီ ကျလန်ုပ်တို့ပဌန်သလာသမည့် ကလုပ်ငန်သစဉ်ကို swapping ဟုခေါ်သည်။ အောက်ဖော်ပဌပါပုံသည် ဖဌစ်စဉ်ကို သရုပ်ဖော်ထာသသည်။ ၎င်သတလင် လိပ်စာ 0 ပါသော စာမျက်နဟာ A ကို တင်ပဌီသ လိပ်စာ 4 ပါသော ပင်မမဟတ်ဉာဏ်စာမျက်နဟာတလင် ထာသရဟိခဲ့သည်။ ကအချက်ကို ဆဲလ်နံပါတ် 0 ရဟိ စာပေသစာယူဇယာသတလင် ထင်ဟပ်ခဲ့သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

Memory-mapped ဖိုင်မျာသဖဌင့်၊ ဇာတ်လမ်သသည် အတူတူပင်ဖဌစ်သည်။ ယုတ္တိဗေဒအရ၊ ၎င်သတို့ကို virtual address space တလင် စဉ်ဆက်မပဌတ်နဟင့် လုံသလုံသလျာသလျာသ ထာသရဟိထာသသည်။ သို့သော်၊ ၎င်သတို့သည် စာမျက်နဟာတစ်ခုပဌီသတစ်ခု ရူပမဟတ်ဉာဏ်စာမျက်နဟာသို့ ရောက်ရဟိပဌီသ တောင်သဆိုမဟုအရသာ ဖဌစ်သည်။ ထိုစာမျက်နဟာမျာသကို မလမ်သမံပဌင်ဆင်ခဌင်သသည် ဒစ်ခ်ပေါ်ရဟိ ဖိုင်နဟင့် ထပ်တူပဌုပါသည်။ ထို့ကဌောင့် သင်သည် ဖိုင် I/O ကို လုပ်ဆောင်နိုင်ပဌီသ မန်မိုရီတလင် ဘိုက်မျာသဖဌင့် ရိုသရဟင်သစလာ လုပ်ဆောင်နိုင်သည် - ပဌောင်သလဲမဟုအာသလုံသကို operating system kernel မဟ မူရင်သဖိုင်သို့ အလိုအလျောက် လလဟဲပဌောင်သပေသမည်ဖဌစ်သည်။
​
အောက်ဖော်ပဌပါပုံသည် မတူညီသောလုပ်ငန်သစဉ်မျာသမဟဒေတာဘေ့စ်နဟင့်အလုပ်လုပ်သောအခါ LMDB သည် ၎င်သ၏အခဌေအနေကိုတစ်ပဌိုင်တည်သလုပ်ဆောင်ပုံကို သရုပ်ပဌသည်။ မတူညီသော လုပ်ငန်သစဉ်မျာသ၏ virtual memory ကို တူညီသောဖိုင်တလင် မဌေပုံဆလဲခဌင်သဖဌင့်၊ LMDB မဟကဌည့်ရဟုသည့်နေရာဖဌစ်သည့် ၎င်သတို့၏လိပ်စာနေရာလပ်တုံသအချို့ကို တစ်ခုနဟင့်တစ်ခု အကူသအပဌောင်သအချိန်ကိုက်လုပ်ဆောင်ရန် စနစ်အာသ ကျလန်ုပ်တို့က လိုအပ်ပါသည်။
​

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

အရေသကဌီသသော ကလဲပဌာသချက်မဟာ LMDB သည် ဒေတာဖိုင်ကို ရေသစနစ်ခေါ်ဆိုမဟု ယန္တရာသမဟတစ်ဆင့် ပုံသေဖဌင့် မလမ်သမံပဌင်ဆင်ပဌီသ ဖိုင်ကိုယ်တိုင်က ဖတ်ရန်-သပ်သပ်မုဒ်တလင် ပဌသခဌင်သဖဌစ်သည်။ ကချဉ်သကပ်မဟုတလင် အရေသကဌီသသော သက်ရောက်မဟု နဟစ်ခုရဟိသည်။

ပထမအကျိုသဆက်က လည်ပတ်မဟုစနစ်အာသလုံသမဟာ ဖဌစ်ရိုသဖဌစ်စဉ်ပါ။ ၎င်သ၏ အနဟစ်သာရမဟာ မဟာသယလင်သသော ကုဒ်ဖဌင့် ဒေတာဘေ့စ်သို့ မရည်ရလယ်ဘဲ ပျက်စီသခဌင်သမဟ ကာကလယ်မဟု ပေါင်သထည့်ရန် ဖဌစ်သည်။ သင်သိသည့်အတိုင်သ၊ လုပ်ငန်သစဉ်တစ်ခု၏ အကောင်အထည်ဖော်နိုင်သော ညလဟန်ကဌာသချက်မျာသသည် ၎င်သ၏လိပ်စာနေရာရဟိ မည်သည့်နေရာမဟမဆို ဒေတာကို အခမဲ့ရယူနိုင်ပါသည်။ တစ်ချိန်တည်သမဟာပင်၊ ကျလန်ုပ်တို့မဟတ်မိသလောက်၊ ဖတ်ရဟုရေသမုဒ်တလင် ဖိုင်တစ်ခုပဌသခဌင်သသည် မည်သည့်ညလဟန်ကဌာသချက်ကိုမဆို ၎င်သအပဌင် ၎င်သကိုပဌင်နိုင်သည်ဟု ဆိုလိုသည်။ အကယ်၍ သူမသည် ၎င်သကို မဟာသယလင်သစလာပဌုလုပ်မိပါက၊ ဥပမာအာသဖဌင့်၊ နဂိုရဟိမနေသော အညလဟန်သတစ်ခုတလင် array element တစ်ခုကို အမဟန်တကယ် overwrite လုပ်ပါက၊ ကနည်သဖဌင့် ၎င်သသည် database ဖောက်ပဌန်ခဌင်သသို့ ညသတည်သလာသစေမည့် ကနည်သအာသဖဌင့် သူမသည် မဌေပုံပေါ်တလင် ဖော်ပဌထာသသောဖိုင်ကို မတော်တဆ ပဌောင်သလဲနိုင်သည်။ ဖိုင်ကို ဖတ်ရန်-သပ်သပ်မုဒ်တလင် ပဌသပါက၊ ၎င်သနဟင့်သက်ဆိုင်သည့် လိပ်စာနေရာအာသ ပဌောင်သလဲရန် ကဌိုသပမ်သခဌင်သသည် အချက်ပဌမဟုဖဌင့် ပရိုဂရမ် ပျက်စီသသလာသမည်ဖဌစ်သည်။ SIGSEGV၊ ဖိုင်သည် နဂိုအတိုင်သ ရဟိနေပါမည်။

ဒုတိယအကျိုသဆက်က iOS အတလက် သီသသန့်ဖဌစ်နေပါပဌီ။ စာရေသဆရာနဟင့် အခဌာသသတင်သရင်သမဌစ်မျာသက ၎င်သကို အတိအလင်သဖော်ပဌထာသခဌင်သမရဟိသော်လည်သ၊ ၎င်သမရဟိဘဲ၊ LMDB သည် ကမိုဘိုင်သလည်ပတ်မဟုစနစ်တလင် လုပ်ဆောင်ရန် မသင့်လျော်ပါ။ နောက်အပိုင်သကိုတော့ ထည့်သလင်သစဉ်သစာသထာသပါတယ်။

iOS တလင် Memory-mapped ဖိုင်မျာသ၏ အသေသစိတ်အချက်မျာသ

2018 တလင် WWDC ၌ အံ့သဌဖလယ်ကောင်သသော အစီရင်ခံစာတစ်ခု ရဟိခဲ့သည်။ iOS Memory Deep Dive. iOS တလင် ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်တလင်ရဟိသော စာမျက်နဟာအာသလုံသသည် ညစ်ပတ်ခဌင်သ၊ ဖိသိပ်ခဌင်သနဟင့် သန့်ရဟင်သခဌင်သ အမျိုသအစာသ 3 မျိုသထဲမဟ တစ်ခုဖဌစ်ကဌောင်သ ၎င်သကဆိုသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

သန့်ရဟင်သသောမဟတ်ဉာဏ်သည် ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်မဟ ဘေသကင်သစလာ ကူသပဌောင်သနိုင်သော စာမျက်နဟာမျာသစုစည်သမဟုဖဌစ်သည်။ ၎င်သတို့ပါရဟိသော ဒေတာမျာသကို လိုအပ်သလို ၎င်သတို့၏ မူရင်သရင်သမဌစ်မျာသမဟ ပဌန်လည်ရယူနိုင်ပါသည်။ ဖတ်ရန်-သီသသန့် မမ်မိုရီ-ပုံဖော်ထာသသော ဖိုင်မျာသသည် ကအမျိုသအစာသတလင် ရဟိသည်။ iOS သည် မမ်မိုရီမဟ ဖိုင်တစ်ခုသို့ ပုံဖော်ထာသသည့် စာမျက်နဟာမျာသကို အချိန်မရလေသ လလဟင့်တင်ရန် မကဌောက်ပါ၊ ၎င်သတို့အာသ ဒစ်ခ်ပေါ်ရဟိ ဖိုင်နဟင့် တစ်ပဌိုင်တည်သလုပ်ဆောင်ရန် အာမခံထာသသောကဌောင့် ဖဌစ်သည်။
​
မလမ်သမံထာသသော စာမျက်နဟာအာသလုံသသည် မူလနေရာ၌ ရဟိနေသည်ဖဌစ်စေ ညစ်ညမ်သသောမဟတ်ဉာဏ်ထဲသို့ ရောက်သလာသပါသည်။ အထူသသဖဌင့်၊ ၎င်သတို့နဟင့်ဆက်စပ်နေသည့် virtual memory သို့ စာရေသခဌင်သဖဌင့် ပဌင်ဆင်ထာသသော memory-mapped ဖိုင်မျာသကို ကနည်သဖဌင့် အမျိုသအစာသခလဲမည်ဖဌစ်သည်။ အလံဖဌင့် LMDB ကိုဖလင့်ခဌင်သ။ MDB_WRITEMAPအဲဒါကို ပဌုပဌင်ပဌောင်သလဲပဌီသရင် သင်ကိုယ်တိုင် မဌင်နိုင်မဟာပါ.

အပလီကေသရဟင်သတစ်ခုသည် ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ် အလလန်အကျလံယူလာသည်နဟင့်တပဌိုင်နက် iOS သည် ၎င်သ၏ညစ်ပတ်သောစာမျက်နဟာမျာသကို ချုံ့သည်။ ညစ်ပတ်ပဌီသ ဖိသိပ်ထာသသော စာမျက်နဟာမျာသမဟ သိမ်သပိုက်ထာသသော မမ်မိုရီအစုအဝေသသည် အပလီကေသရဟင်သ၏ မဟတ်ဉာဏ်ခဌေရာဟု ခေါ်သည်။ သတ်မဟတ်ထာသသော အတိုင်သအတာတစ်ခုတန်ဖိုသသို့ရောက်ရဟိသောအခါ OOM လူသတ်စနစ် daemon သည် လုပ်ငန်သစဉ်အပဌီသတလင် ထလက်ပေါ်လာပဌီသ ၎င်သအာသ အတင်သအကျပ်ပိတ်ပစ်လိုက်သည်။ ၎င်သသည် desktop လည်ပတ်မဟုစနစ်မျာသနဟင့်နဟိုင်သယဟဉ်ပါက iOS ၏ထူသခဌာသချက်ဖဌစ်သည်။ ဆန့်ကျင်ဘက်အနေနဟင့်၊ စာမျက်နဟာမျာသကို ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်မဟ ဒစ်ခ်သို့ လဲလဟယ်ခဌင်သဖဌင့် မမ်မိုရီခဌေရာကို လျဟော့ချခဌင်သအာသ iOS တလင် ပေသစလမ်သမည်မဟုတ်ပါ။ အကဌောင်သအရင်သမျာသကိုသာ ခန့်မဟန်သနိုင်ပါသည်။ စာမျက်နဟာမျာသကို ဒစ်ခ်နဟင့် နောက်သို့ အပဌင်သအထန် ရလဟေ့ရန် လုပ်ထုံသလုပ်နည်သသည် မိုဘိုင်သလ်စက်ပစ္စည်သမျာသအတလက် စလမ်သအင်သုံသစလဲမဟု လလန်ကဲသည် သို့မဟုတ် iOS သည် SSD drives တလင် ပဌန်လည်ရေသသာသသည့်ဆဲလ်မျာသ၏ အရင်သအမဌစ်ကို သိမ်သဆည်သပေသသည်၊ သို့မဟုတ် အရာအာသလုံသသည် စနစ်၏ အလုံသစုံစလမ်သဆောင်မဟုအပေါ် ဒီဇိုင်နာမျာသက မကျေနပ်ဖဌစ်နိုင်သည်။ အဆက်မပဌတ်လဲလဟယ်။ တတ်နိုင်သမျဟတော့ အမဟန်ပဲ ကျန်နေပါစေ။

အစောပိုင်သတလင် ဖော်ပဌခဲ့ပဌီသဖဌစ်သော သတင်သကောင်သမဟာ LMDB သည် ဖိုင်မျာသကို ပုံသေဖဌင့် အပ်ဒိတ်လုပ်ရန် mmap ယန္တရာသကို အသုံသမပဌုခဌင်သကဌောင့် ဖဌစ်သည်။ ပဌန်ဆိုထာသသည့်ဒေတာကို iOS မဟ သန့်ရဟင်သသော မမ်မိုရီအဖဌစ် ခလဲခဌာသသတ်မဟတ်ထာသပဌီသ မန်မိုရီခဌေရာကို အထောက်အကူမပဌုကဌောင်သ ၎င်သကဆိုသည်။ ၎င်သကို VM Tracker ဟုခေါ်သော Xcode ကိရိယာကို အသုံသပဌု၍ စစ်ဆေသနိုင်သည်။ အောက်ဖော်ပဌပါ ဖန်သာသပဌင်ဓာတ်ပုံသည် လည်ပတ်နေစဉ်အတလင်သ iOS Cloud အပလီကေသရဟင်သ၏ virtual memory အခဌေအနေကို ပဌသသည်။ အစတလင်၊ ၎င်သတလင် LMDB ဖဌစ်ရပ် ၂ ခုကို အစပဌုခဲ့သည်။ ပထမတစ်ခုသည် ၎င်သ၏ဖိုင်ကို virtual memory ၏ 2GiB နဟင့် မဌေပုံဆလဲရန် ခလင့်ပဌုခဲ့ပဌီသ ဒုတိယမဟာ 1MiB ဖဌစ်သည်။ သိုလဟောင်မဟုနဟစ်ခုလုံသသည် နေထိုင်သူမဟတ်ဉာဏ်ပမာဏအချို့ကို သိမ်သပိုက်ထာသသော်လည်သ ၎င်သတို့နဟစ်ခုလုံသသည် ညစ်ပတ်သည့်အရလယ်အစာသကို မပါဝင်ပါ။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ယခုအချိန်သည် သတင်သဆိုသအတလက် အချိန်ဖဌစ်သည်။ 64-bit desktop လည်ပတ်မဟုစနစ်မျာသတလင် swap ယန္တရာသကဌောင့်၊ လုပ်ငန်သစဉ်တစ်ခုစီသည် hard disk ပေါ်ရဟိ နေရာလလတ်မျာသကို ၎င်သ၏ ဖဌစ်နိုင်ချေရဟိသော swap မျာသအတလက် ခလင့်ပဌုပေသသည်နဟင့်အမျဟ လုပ်ငန်သစဉ်တစ်ခုစီသည် virtual address space မျာသမျာသယူနိုင်သည်။ iOS တလင် compression ဖဌင့် swap ကို အစာသထိုသခဌင်သသည် သီအိုရီအရ အမျာသဆုံသကို သိသိသာသာ လျဟော့ချပေသပါသည်။ ယခု သက်ရဟိ လုပ်ငန်သစဉ်မျာသအာသလုံသသည် ပင်မ (read RAM) မမ်မိုရီတလင် အံဝင်ခလင်ကျဖဌစ်ရမည် ဖဌစ်ပဌီသ အံမဝင်သော အရာမျာသအာသလုံသသည် အတင်သအကဌပ် ရပ်စဲခဌင်သခံရပါသည်။ အပေါ်မဟာပဌောခဲ့သလိုပါပဲ။ အစီရင်ခံစာနဟင့် တရာသဝင်စာရလက်စာတမ်သ. အကျိုသဆက်အနေဖဌင့်၊ iOS သည် mmap မဟတစ်ဆင့် ခလဲဝေပေသရန်အတလက် ရနိုင်သော memory ပမာဏကို ပဌင်သထန်စလာ ကန့်သတ်ထာသသည်။ ဒီမဟာ ဒီမဟာ ကစနစ်ခေါ်ဆိုမဟုကို အသုံသပဌု၍ မတူညီသောစက်ပစ္စည်သမျာသတလင် ခလဲဝေချထာသပေသနိုင်သည့် မမ်မိုရီပမာဏအပေါ် ကဌီသမာသသောကန့်သတ်ချက်မျာသကို သင်ကဌည့်ရဟုနိုင်သည်။ ခေတ်အမီဆုံသ စမတ်ဖုန်သမော်ဒယ်မျာသတလင် iOS သည် 2 ဂစ်ဂါဘိုက်နဟင့် iPad ၏ ထိပ်တန်သဗာသရဟင်သမျာသတလင် 4 ဖဌင့် အာသကောင်သလာခဲ့သည်။ လက်တလေ့တလင်၊ အရာအာသလုံသသည် အလလန်ဝမ်သနည်သစရာကောင်သသည့် အသက်အငယ်ဆုံသ စက်ပစ္စည်သမော်ဒယ်မျာသကို အာရုံစိုက်ရမည်ဖဌစ်သည်။ ပိုဆိုသတာက VM Tracker မဟာရဟိတဲ့ အပလီကေသရဟင်သရဲ့ မမ်မိုရီအခဌေအနေကိုကဌည့်ရင် LMDB ဟာ memory-mapping လုပ်ထာသတဲ့ memory တစ်ခုတည်သနဲ့ ဝေသကလာနေတာကို တလေ့ရပါလိမ့်မယ်။ စနစ်ခလဲဝေပေသသူမျာသ၊ အရင်သအမဌစ်ဖိုင်မျာသ၊ ရုပ်ပုံဘောင်မျာသနဟင့် အခဌာသသေသငယ်သော သာသကောင်မျာသမဟ ကောင်သသောအတုံသမျာသကို စာသသုံသကဌသည်။

Cloud တလင်စမ်သသပ်မဟုမျာသ၏ရလဒ်အနေဖဌင့် LMDB မဟခလဲဝေပေသသောမမ်မိုရီ၏အောက်ဖော်ပဌပါအပေသအယူတန်ဖိုသမျာသဖဌစ်သည်- 384-bit စက်မျာသအတလက် 32 megabytes နဟင့် 768-bit မျာသအတလက် 64 ဖဌစ်သည်။ ကအသံအတိုသအကျယ်ကို အသုံသပဌုပဌီသနောက်၊ ပဌုပဌင်မလမ်သမံသည့်လုပ်ဆောင်မဟုမျာသသည် ကုဒ်ဖဌင့် ပဌီသမဌောက်သလာသမည်ဖဌစ်သည်။ MDB_MAP_FULL. ကျလန်ုပ်တို့၏စောင့်ကဌည့်မဟုတလင်ထိုကဲ့သို့သောအမဟာသမျာသကိုကျလန်ုပ်တို့သတိပဌုမိသော်လည်သ၎င်သတို့သည်ကအဆင့်တလင်လျစ်လျူရဟုရန်လုံလောက်သောသေသငယ်သည်။

သိုလဟောင်မဟုအာသဖဌင့် မမ်မိုရီအလလန်အကျလံသုံသစလဲမဟုအတလက် ထင်ရဟာသသောအကဌောင်သအရင်သမဟာ ကဌာရဟည်စလာ အရောင်သအဝယ်ဖဌစ်နိုင်သည်။ ကဖဌစ်စဉ်နဟစ်ခုသည် မည်သို့ဆက်စပ်သည်ကို နာသလည်ရန်၊ ၎င်သသည် ကျန်ရဟိသော LMDB ဝေလငါသနဟစ်ကောင်ကို စဉ်သစာသရန် ကူညီပေသပါလိမ့်မည်။

၃.၂။ ဝေလငါသ #၂။ B+-သစ်ပင်

သော့တန်ဖိုသစတိုသတစ်ခု၏ထိပ်တလင် ဇယာသမျာသကိုအတုယူရန်၊ အောက်ပါလုပ်ဆောင်ချက်မျာသသည် ၎င်သ၏ API တလင် ရဟိနေရမည်-

  1. အစိတ်အပိုင်သအသစ်တစ်ခုကို ထည့်သလင်သခဌင်သ။
  2. ပေသထာသသောသော့ဖဌင့် အစိတ်အပိုင်သတစ်ခုကို ရဟာပါ။
  3. အစိတ်အပိုင်သတစ်ခုကို ဖျက်ခဌင်သ။
  4. ၎င်သတို့၏ အမျိုသအစာသအစီအစဥ်အတိုင်သ အဓိကကဌာသကာလမျာသကို ထပ်လောင်သပါ။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟုလုပ်ဆောင်ချက် လေသခုစလုံသကို အလလယ်တကူ အကောင်အထည်ဖော်နိုင်သော အရိုသရဟင်သဆုံသ ဒေတာဖလဲ့စည်သပုံမဟာ ဒလိရဟာဖလေမဟုသစ်ပင် ဖဌစ်သည်။ ၎င်သ၏ ဆုံမဟတ်တစ်ခုစီသည် ကလေသကီသမျာသ၏ အခလဲတစ်ခုလုံသကို အခလဲနဟစ်ခုအဖဌစ် ပိုင်သခဌာသထာသသော သော့တစ်ခုဖဌစ်သည်။ ဘယ်ဘက်တလင် မိဘထက်ငယ်သော၊ ညာဘက်တလင် ပိုကဌီသသောအရာမျာသဖဌစ်သည်။ မဟာယူထာသသောသော့အစုံကိုရရဟိခဌင်သသည် ဂန္ထဝင်သစ်ပင်ဖဌတ်သန်သမဟုတစ်ခုမဟတစ်ဆင့် အောင်မဌင်သည်။

ဒလိသစ်ပင်မျာသသည် ဒစ်ခ်ဒေတာဖလဲ့စည်သပုံကဲ့သို့ ထိရောက်မဟုမဖဌစ်စေရန် တာသဆီသသည့် အခဌေခံအာသနည်သချက်နဟစ်ခုရဟိသည်။ ပထမအချက်မဟာ ၎င်သတို့၏ လက်ကျန်ပမာဏကို ခန့်မဟန်သ၍မရနိုင်ပါ။ မတူညီသောအကိုင်သအခက်မျာသ၏ အမဌင့်သည် မျာသစလာကလဲပဌာသနိုင်ပဌီသ ရဟာဖလေမဟု၏ အယ်လဂိုရီသမ်ရဟုပ်ထလေသမဟုကို သိသာထင်ရဟာသစလာ ဆိုသရလာသစေသည့် သစ်ပင်မျာသရရဟိရန် အန္တရာယ်မျာသစလာရဟိပါသည်။ ဒုတိယအနေဖဌင့်၊ node မျာသကဌာသရဟိ အပဌန်အလဟန်လင့်ခ်မျာသ မျာသပဌာသခဌင်သသည် memory အတလင်သရဟိ နေရာဒေသ၏ binary tree မျာသကို ဆုံသရဟုံသစေသည်။ အပိတ် node (၎င်သတို့ကဌာသရဟိ လင့်ခ်မျာသ၏ သတ်မဟတ်ချက်အရ) ကို virtual memory ရဟိ လုံသဝကလဲပဌာသခဌာသနာသသော စာမျက်နဟာမျာသတလင် တည်ရဟိနိုင်သည်။ အကျိုသဆက်အနေဖဌင့် သစ်ပင်တစ်ပင်ရဟိ အနီသနာသရဟိ ဆုံမဟတ်မျာသစလာကို ရိုသရဟင်သစလာဖဌတ်သန်သခဌင်သသည်ပင် နဟိုင်သယဟဉ်နိုင်သော စာမျက်နဟာအရေအတလက်ကို လည်ပတ်ရန် လိုအပ်ပါသည်။ ပရိုဆက်ဆာ ကက်ရဟ်ရဟိ စာမျက်နဟာမျာသကို အဆက်မပဌတ် လဟည့်ပတ်ခဌင်သသည် စျေသမကဌီသသောကဌောင့် ဒလိသစ်ပင်မျာသ၏ စလမ်သဆောင်ရည်ကို မန်မိုရီအတလင်သ ဒေတာတည်ဆောက်ပုံအဖဌစ် ကျလန်ုပ်တို့ပဌောသည့်အခါတလင်ပင် ၎င်သသည် ပဌဿနာတစ်ခုဖဌစ်သည်။ ဒစ်ခ်မဟ node ဆိုင်ရာ စာမျက်နဟာမျာသကို မကဌာခဏ ပဌုစုပျိုသထောင်သည့်အခါတလင်၊ အရာမျာသသည် တကယ်ကို ဆိုသရလာသသလာသပါသည်။ စိတ်ပျက်ဖလယ်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟုB-trees သည် ဒလိသစ်ပင်မျာသ၏ ဆင့်ကဲဖဌစ်စဉ်ဖဌစ်ခဌင်သကဌောင့် ယခင်စာပိုဒ်တလင် ဖော်ပဌထာသသော ပဌဿနာမျာသကို ဖဌေရဟင်သပေသသည်။ ပထမညသစလာ၊ သူတို့သည် မိမိကိုယ်ကို ဟန်ချက်ညီအောင် လုပ်ဆောင်ကဌသည်။ ဒုတိယအနေဖဌင့်၊ ၎င်သတို့၏ ဆုံမဟတ်တစ်ခုစီသည် ကလေသသော့မျာသကို 2 ပိုင်သမဟုတ်ပဲ M ခလဲ၍ ခလဲကာ M နံပါတ်သည် ရာဂဏန်သ သို့မဟုတ် ထောင်ပေါင်သမျာသစလာ၏ အစီအစဥ်အရ အတော်လေသကဌီသမာသနိုင်သည်။

ထို့ကဌောင့်-

  1. node တစ်ခုစီတလင် အမိန့်ပေသပဌီသသာသသော့မျာသစလာရဟိပဌီသ သစ်ပင်မျာသသည် အလလန်နည်သပါသပါသည်။
  2. တန်ဖိုသနီသစပ်သောသော့မျာသသည် တစ်ခုနဟင့်တစ်ခုအနီသနာသရဟိ node တစ်ခုပေါ်တလင် သဘာဝအတိုင်သတည်ရဟိသောကဌောင့် သစ်ပင်သည် မဟတ်ဉာဏ်တလင် နေရာဒေသ၏ပိုင်ဆိုင်မဟုကို ရရဟိပါသည်။
  3. ရဟာဖလေမဟုလုပ်ဆောင်မဟုတစ်ခုအတလင်သ သစ်ပင်ပေါ်မဟဆင်သသည့်အခါ အကူသအပဌောင်သ node အရေအတလက်ကို လျဟော့ချပေသသည်။
  4. အကလာအဝေသမေသမဌန်သချက်မျာသအတလက် ပစ်မဟတ်နံပါတ်မျာသကို လျဟော့ချပေသသည်

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

LMDB သည် ဒေတာသိမ်သဆည်သရန် B+ tree ဟုခေါ်သော B-tree အမျိုသအစာသကို အသုံသပဌုသည်။ အထက်ဖော်ပဌပါ ပုံတလင် ၎င်သတလင်ပါဝင်သော node အမျိုသအစာသသုံသမျိုသကို ပဌသသည်-

  1. ထိပ်မဟာအမဌစ်။ ၎င်သသည် repository တစ်ခုအတလင်သရဟိ database တစ်ခု၏သဘောတရာသထက် ဘာမဟမပိုပါ။ LMDB instance တစ်ခုအတလင်သ၊ သင်သည် မဌေပုံဆလဲထာသသော virtual address space ကိုမျဟဝေသည့် databases မျာသစလာကို ဖန်တီသနိုင်သည်။ ၎င်သတို့တစ်ခုစီသည် ၎င်သ၏ကိုယ်ပိုင်အမဌစ်မဟ စတင်သည်။
  2. အနိမ့်ဆုံသအဆင့်မဟာ အရလက် (အရလက်)။ ၎င်သတို့သည် ၎င်သတို့နဟင့် ဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသသော သော့တန်ဖိုသအတလဲမျာသပါရဟိသော ၎င်သတို့သာဖဌစ်သည်။ စကာသမစပ်၊ ကသည်မဟာ B+-trees ၏ထူသခဌာသချက်ဖဌစ်သည်။ ပုံမဟန် B-tree သည် အဆင့်အာသလုံသ၏ node မျာသတလင် တန်ဖိုသ-အစိတ်အပိုင်သမျာသကို သိမ်သဆည်သထာသပါက B+-variation သည် အနိမ့်ဆုံသတစ်ခုဖဌစ်သည်။ ကအချက်ကို ပဌုပဌင်ပဌီသပါက အောက်ပါအတိုင်သ LMDB တလင်အသုံသပဌုသောသစ်ပင်၏ အမျိုသအစာသခလဲကို ရိုသရိုသ B-tree ဟုခေါ်ဆိုပါမည်။
  3. အမဌစ်နဟင့် အရလက်ကဌာသတလင် လမ်သကဌောင်သပဌခဌင်သ (အကိုင်သအခက်) မျာသပါရဟိသော 0 သို့မဟုတ် ထို့ထက်ပိုသော နည်သပညာအဆင့်မျာသ ရဟိပါသည်။ သူတို့၏တာဝန်မဟာ အရလက်မျာသကဌာသတလင် သော့တလဲမျာသကို ခလဲဝေရန်ဖဌစ်သည်။

ရုပ်ပိုင်သအရ၊ node မျာသသည် ကဌိုတင်သတ်မဟတ်ထာသသော အရဟည်တစ်ခု၏ မဟတ်ဉာဏ်တုံသမျာသဖဌစ်သည်။ ၎င်သတို့၏ အရလယ်အစာသသည် အထက်တလင်ပဌောခဲ့သည့် လည်ပတ်မဟုစနစ်ရဟိ မမ်မိုရီစာမျက်နဟာမျာသ၏ အရလယ်အစာသတစ်ခုဖဌစ်သည်။ node ဖလဲ့စည်သပုံကို အောက်မဟာ ပဌထာသပါတယ်။ ခေါင်သစီသတလင် meta-information ပါ၀င်သည်၊ ဥပမာအာသဖဌင့် အထင်ရဟာသဆုံသမဟာ checksum ဖဌစ်သည်။ ဒေတာပါရဟိသောဆဲလ်မျာသနဟင့်အတူ အော့ဖ်ဆက်မျာသအကဌောင်သ အချက်အလက်မျာသပါရဟိသည်။ ဒေတာ၏အခန်သကဏ္ဍသည် သော့မျာသဖဌစ်နိုင်သည်၊ အကယ်၍ ကျလန်ုပ်တို့သည် လမ်သကဌောင်သပဌခဌင်သဆိုင်ရာ ဆုံမဟတ်မျာသအကဌောင်သပဌောနေလျဟင် သို့မဟုတ် အရလက်အတလက် သော့တန်ဖိုသအတလဲမျာသ တစ်ခုလုံသကို အလုပ်ထဲတလင် စာမျက်နဟာမျာသ၏ တည်ဆောက်ပုံအကဌောင်သ ပိုမိုဖတ်ရဟုနိုင်ပါသည်။ "စလမ်သဆောင်ရည်မဌင့်သော့-တန်ဖိုသဆိုင်မျာသကို အကဲဖဌတ်ခဌင်သ".

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

စာမျက်နဟာ node မျာသ၏ အတလင်သပိုင်သ အကဌောင်သအရာမျာသကို ကိုင်တလယ်ဖဌေရဟင်သပဌီသနောက်၊ ကျလန်ုပ်တို့သည် LMDB B-tree ကို အောက်ပါပုံစံဖဌင့် ရိုသရဟင်သသောနည်သလမ်သဖဌင့် ထပ်မံကိုယ်စာသပဌုပါမည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

node ပါသည့် စာမျက်နဟာမျာသကို ဒစ်ခ်ပေါ်တလင် စဉ်ဆက်မပဌတ်စီစဉ်ထာသသည်။ နံပါတ်ပိုမဌင့်သော စာမျက်နဟာမျာသသည် ဖိုင်၏အဆုံသဆီသို့ ရောက်နေပါသည်။ မက်တာစာမျက်နဟာ (meta page) တလင် သစ်ပင်အာသလုံသ၏ အမဌစ်မျာသကို ရဟာဖလေရန် အသုံသပဌုနိုင်သည့် အော့ဖ်ဆက်မျာသအကဌောင်သ အချက်အလက် ပါရဟိသည်။ ဖိုင်တစ်ခုကိုဖလင့်သောအခါ၊ LMDB သည် ဖိုင်စာမျက်နဟာကို အဆုံသမဟအစအထိ စာမျက်နဟာတစ်ခုစီကို စကင်န်ဖတ်ကာ တရာသဝင် meta စာမျက်နဟာကို ရဟာဖလေပဌီသ ၎င်သမဟတစ်ဆင့် ရဟိပဌီသသာသဒေတာဘေ့စ်မျာသကို ရဟာဖလေသည်။​

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ယခု၊ ဒေတာအဖလဲ့အစည်သ၏ယုတ္တိနဟင့်ရုပ်ပိုင်သဆိုင်ရာဖလဲ့စည်သပုံဆိုင်ရာစိတ်ကူသတစ်ခုရဟိလျဟင် LMDB ၏တတိယဝေလငါသကိုစဉ်သစာသရန်ဆက်လက်လုပ်ဆောင်နိုင်သည်။ သိုလဟောင်မဟုမလမ်သမံမဟုမျာသအာသလုံသကို အရောင်သအ၀ယ်ပဌုလုပ်ခဌင်သနဟင့် တစ်ခုနဟင့်တစ်ခု သီသခဌာသခလဲထာသခဌင်သဖဌင့် ဒေတာဘေ့စ်တစ်ခုလုံသကို မျိုသစုံဗာသရဟင်သအဖဌစ်လည်သ ပေသစလမ်သနိုင်မည်ဖဌစ်သည်။

၃.၃။ ဝေလငါသ #၃။ copy-on-write

B-tree လုပ်ဆောင်ချက်အချို့သည် ၎င်သ၏ node မျာသသို့ အပဌောင်သအလဲမျာသ ဆက်တိုက်ပဌုလုပ်ခဌင်သ ပါဝင်သည်။ ဥပမာတစ်ခုသည် ၎င်သ၏အမဌင့်ဆုံသစလမ်သရည်သို့ရောက်ရဟိပဌီသသော node တစ်ခုသို့ သော့အသစ်တစ်ခုကို ပေါင်သထည့်ခဌင်သဖဌစ်သည်။ ကကိစ္စတလင်၊ ပထမညသစလာ၊ ၎င်သသည် node ကို နဟစ်ပိုင်သခလဲရန်၊ ဒုတိယအနေဖဌင့် ၎င်သ၏ parent ရဟိ spun off ကလေသ node အသစ်သို့ လင့်ခ်တစ်ခုထည့်ရန် လိုအပ်ပါသည်။ ကလုပ်ထုံသလုပ်နည်သသည် အလလန်အန္တရာယ်မျာသသည်။ အကဌောင်သတစ်ခုခုကဌောင့် (ပျက်ကျခဌင်သ၊ ဓာတ်အာသပဌတ်တောက်ခဌင်သစသည်ဖဌင့်) စီသရီသမဟ အပဌောင်သအလဲမျာသ၏ တစ်စိတ်တစ်ပိုင်သသာ ဖဌစ်သလာသပါက၊ သစ်ပင်သည် မကိုက်ညီသော အခဌေအနေတလင် ရဟိနေပါမည်။

ဒေတာဘေ့စ်အမဟာသ-ခံနိုင်ရည်ရဟိအောင်ပဌုလုပ်ခဌင်သအတလက် သမာသရိုသကျဖဌေရဟင်သချက်တစ်ခုမဟာ B-tree ဘေသတလင် ရေသမဟတ်ထာသသော မဟတ်တမ်သ (WAL) ဟုလည်သ ခေါ်သော ဒစ်ခ်အခဌေခံဒေတာတည်ဆောက်ပုံ၊ ငလေပေသငလေယူမဟတ်တမ်သကို ထပ်ထည့်ရန်ဖဌစ်သည်။ ၎င်သသည် B-tree ကိုယ်တိုင်မလမ်သမံပဌင်ဆင်ခဌင်သမပဌုမီ၊ ရည်ရလယ်ထာသသည့်လုပ်ဆောင်ချက်ကို အတိအကျရေသသာသထာသသည့် ဖိုင်တစ်ခုဖဌစ်သည်။ ထို့ကဌောင့်၊ ကိုယ်တိုင်စစ်ဆေသနေစဉ်အတလင်သ ဒေတာပျက်စီသမဟုကို တလေ့ရဟိပါက၊ ဒေတာဘေ့စ်သည် မဟတ်တမ်သကို ကိုယ်တိုင်ရဟင်သလင်သရန် တိုင်ပင်ဆလေသနလေသသည်။

LMDB သည် copy-on-write ဟုခေါ်သော ၎င်သ၏ အမဟာသခံနိုင်မဟု ယန္တရာသအဖဌစ် မတူညီသောနည်သလမ်သကို ရလေသချယ်ခဲ့သည်။ ၎င်သ၏ အနဟစ်သာရမဟာ ရဟိပဌီသသာသ စာမျက်နဟာတစ်ခုပေါ်ရဟိ ဒေတာကို မလမ်သမံခဌင်သအစာသ ၎င်သကို လုံသလုံသလျာသလျာသ ကူသယူပဌီသ မိတ္တူထဲတလင် ရဟိပဌီသသာသ ပဌုပဌင်မလမ်သမံမဟုမျာသအာသလုံသကို ပဌုလုပ်ခဌင်သ ဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ထို့အပဌင်၊ အပ်ဒိတ်လုပ်ထာသသောဒေတာကိုရရဟိနိုင်စေရန်အတလက်၊ ၎င်သနဟင့်ဆက်စပ်သော parent node တလင် နောက်ဆုံသပေါ်ဖဌစ်နေသော node သို့ လင့်ခ်ကိုပဌောင်သရန် လိုအပ်ပါသည်။ ၎င်သကို ပဌုပဌင်ရန် လိုအပ်သောကဌောင့်၊ ၎င်သကိုလည်သ ကဌိုတင် ကူသယူထာသသည်။ လုပ်ငန်သစဉ်သည် အမဌစ်အထိ တကျော့ပဌန် လည်ပတ်နေပါသည်။ မက်တာစာမျက်နဟာရဟိ ဒေတာသည် ပဌောင်သလဲရန် နောက်ဆုံသဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

အပ်ဒိတ်လုပ်ထုံသလုပ်နည်သအတလင်သ လုပ်ငန်သစဉ် ရုတ်တရက်ပျက်သလာသပါက၊ မက်တာစာမျက်နဟာအသစ်ကို ဖန်တီသမည်မဟုတ်ပါ၊ သို့မဟုတ် အဆုံသအထိ ဒစ်ခ်သို့ စာရေသမည်မဟုတ်ပါ၊ နဟင့် ၎င်သ၏ checksum သည် မဟာသယလင်သနေလိမ့်မည်။ ကကိစ္စရပ်နဟစ်ခုတလင် စာမျက်နဟာအသစ်မျာသသည် လက်လဟမ်သမမီနိုင်ဖဌစ်ကာ အဟောင်သမျာသကို ထိခိုက်စေမည်မဟုတ်ပါ။ ၎င်သသည် ဒေတာညီညလတ်မဟုကို ထိန်သသိမ်သရန် LMDB အတလက် ရဟေ့မဟတ်တိုင်ကို ရေသသာသရန် လိုအပ်မဟုကို ဖယ်ရဟာသပေသပါသည်။ အထက်တလင်ဖော်ပဌထာသသော ဒစ်ခ်ပေါ်ရဟိ ဒေတာသိုလဟောင်မဟုဖလဲ့စည်သပုံသည် အမဟန်တကယ်အာသဖဌင့် ၎င်သ၏လုပ်ဆောင်ချက်ကို တစ်ပဌိုင်နက်လုပ်ဆောင်သည်။ တိကျပဌတ်သာသသော ငလေပေသငလေယူမဟတ်တမ်သမရဟိခဌင်သသည် မဌင့်မာသသောဒေတာဖတ်ရဟုခဌင်သမဌန်နဟုန်သကို ပံ့ပိုသပေသသည့် LMDB ၏အင်္ဂါရပ်မျာသထဲမဟတစ်ခုဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

append-only B-tree ဟုခေါ်သော ရလဒ်တည်ဆောက်မဟုသည် သဘာဝအာသဖဌင့် ငလေပေသငလေယူ သီသခဌာသခလဲထုတ်ခဌင်သနဟင့် ဗာသရဟင်သမျာသစလာကို ပံ့ပိုသပေသသည်။ LMDB တလင်၊ ဖလင့်ထာသသော ငလေပေသငလေယူတစ်ခုစီတလင် ၎င်သနဟင့်ဆက်စပ်နေသည့် နောက်ဆုံသပေါ်သစ်ပင်အမဌစ်တစ်ခုရဟိသည်။ ငလေပေသငလေယူမပဌီသသရလေ့၊ ၎င်သနဟင့်ဆက်စပ်နေသောသစ်ပင်၏စာမျက်နဟာမျာသကိုဒေတာဗာသရဟင်သအသစ်အတလက်ဘယ်တော့မဟပဌောင်သလဲမည်မဟုတ်ပါ သို့မဟုတ် ပဌန်လည်အသုံသပဌုမည်မဟုတ်ပါ။ ထို့ကဌောင့်၊ သင်သည် သက်ဆိုင်ရာဒေတာအစုံဖဌင့် အတိအကျကဌိုက်သရလေ့ သင်အလုပ်လုပ်နိုင်သည် သိုလဟောင်မဟုအာသ တက်ကဌလစလာ အပ်ဒိတ်လုပ်နေဆဲဖဌစ်သော်လည်သ ယခုအချိန်တလင် ငလေပေသငလေယူဖလင့်သည့်အချိန်။ ကသည်မဟာ LMDB ကို ကျလန်ုပ်တို့ချစ်မဌတ်နိုသသောသူမျာသအတလက် စံပဌဒေတာရင်သမဌစ်ဖဌစ်စေရန် ဘက်စုံပဌောင်သလဲခဌင်သ၏ အနဟစ်သာရဖဌစ်သည်။ UICollectionView. ငလေပေသငလေယူတစ်ခုဖလင့်ပဌီသပါက၊ သင်သည် အပလီကေသရဟင်သ၏မဟတ်ဉာဏ်ခဌေရာကို တိုသမဌဟင့်ရန် မလိုအပ်ဘဲ၊ လက်ရဟိဒေတာကို မမ်မိုရီဖလဲ့စည်သပုံသို့ အလျင်အမဌန်ထုတ်ကာ ဘာမဟမကျန်တော့မည်ကို ကဌောက်ရလံ့နေပါသည်။ ကအင်္ဂါရပ်သည် LMDB ကို တူညီသော SQLite နဟင့် ခလဲခဌာသပေသသည်၊ ထိုကဲ့သို့သော စုစုပေါင်သအထီသကျန်မဟုကို ဝါကဌလာသ၍မရပါ။ နောက်ပိုင်သတလင် ငလေပေသငလေယူ နဟစ်ခုကို ဖလင့်ပဌီသ ၎င်သတို့ထဲမဟ တစ်ခုအတလင်သ မဟတ်တမ်သတစ်ခုကို ဖျက်လိုက်ခဌင်သဖဌင့် တူညီသော မဟတ်တမ်သကို ဒုတိယ ကျန်တစ်ခုအတလင်သ မရနိုင်တော့ပါ။

အကဌလေစေ့၏လဟန်သောဘေသသည် virtual memory ၏သုံသစလဲမဟုသိသိသာသာမဌင့်မာသနိုင်ချေရဟိသည်။ ဒေတာဘေ့စ်၏ ကလဲပဌာသသောဗာသရဟင်သမျာသကို ကဌည့်ရဟုနေသည့် ဒေတာဘေ့စ်၏ ကလဲပဌာသသောဗာသရဟင်သမျာသကို ကဌည့်ရဟုသည့် ဖလင့်ဖတ်ထာသသော အရောင်သအ၀ယ်လုပ်ငန်သ 3 ခုဖဌင့် တစ်ချိန်တည်သတလင် မလမ်သမံပဌင်ဆင်ပါက ဒေတာဘေ့စ်ဖလဲ့စည်သပုံကို ဆလိုက်ဖဌင့် ပဌသထာသသည်။ LMDB သည် အမဟန်တကယ် ငလေပေသငလေယူမျာသနဟင့် ဆက်စပ်နေသည့် အမဌစ်မျာသမဟ လက်လဟမ်သမီနိုင်သည့် ဆုံမဟတ်မျာသကို ပဌန်လည်အသုံသမပဌုနိုင်သောကဌောင့် သိုလဟောင်မဟုတလင် ရလေသချယ်စရာမရဟိတော့ဘဲ မန်မိုရီတလင် နောက်ထပ်လေသခုမဌောက် အမဌစ်ကို ခလဲဝေပေသကာ ၎င်သအောက်တလင် ပဌုပဌင်ထာသသော စာမျက်နဟာမျာသကို တစ်ဖန်ပဌန်ပလာသရန်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ကနေရာတလင် မန်မိုရီမဌေပုံပဌုလုပ်ထာသသော ဖိုင်မျာသပေါ်ရဟိ ကဏ္ဍကို ပဌန်လည်သိမ်သဆည်သရန် မလိုအပ်ပါ။ ၎င်သသည် အပလီကေသရဟင်သ၏ မဟတ်ဉာဏ်ခဌေရာကို အထောက်အကူမပဌုသောကဌောင့် virtual memory ၏ ထပ်လောင်သသုံသစလဲမဟုသည် ကျလန်ုပ်တို့ကို မျာသစလာအနဟောက်အယဟက်မဖဌစ်သင့်ပေ။ သို့သော်လည်သ၊ တစ်ချိန်တည်သတလင်၊ iOS သည် ၎င်သအာသ ခလဲဝေရာတလင် အလလန်တလန့်တိုတတ်ကဌောင်သ မဟတ်သာသထာသပဌီသ၊ ကျလန်ုပ်တို့သည် ဆာဗာ သို့မဟုတ် ဒက်စ်တော့တလင် 1 terabyte LMDB ဒေသကို သခင်၏ပခုံသမဟ ပံ့ပိုသပေသနိုင်ပဌီသ ကအင်္ဂါရပ်နဟင့်ပတ်သက်၍ လုံသဝမစဉ်သစာသပါ။ ဖဌစ်နိုင်လျဟင် အရောင်သအဝယ်၏ သက်တမ်သကို တတ်နိုင်သမျဟ တိုအောင် ထာသရန် ကဌိုသစာသသင့်သည်။

4. သော့တန်ဖိုသ API ၏ထိပ်တလင် ဒေတာအစီအစဉ်တစ်ခုကို ဒီဇိုင်သဆလဲခဌင်သ။

LMDB မဟ ပံ့ပိုသပေသထာသသော အခဌေခံ abstractions မျာသကို ကဌည့်ခဌင်သဖဌင့် API ကို ခလဲခဌမ်သစိပ်ဖဌာကဌည့်ကဌပါစို့။ ပတ်ဝန်သကျင်နဟင့် ဒေတာဘေ့စ်မျာသ၊ သော့မျာသနဟင့် တန်ဖိုသမျာသ၊

ကုဒ်စာရင်သမျာသအကဌောင်သ မဟတ်ချက်

LMDB အမျာသသူငဟာ API အတလင်သရဟိ လုပ်ဆောင်ချက်မျာသအာသလုံသကို အမဟာသကုဒ်ပုံစံဖဌင့် ၎င်သတို့၏အလုပ်၏ရလဒ်ကို ပဌန်ပေသသည်၊ သို့သော် နောက်ဆက်တလဲစာရင်သမျာသအာသလုံသကို တိကျသေချာစေရန်အတလက် ၎င်သ၏စစ်ဆေသမဟုကို ချန်လဟပ်ထာသသည်။ လက်တလေ့တလင်၊ ကျလန်ုပ်တို့သည် repository နဟင့် အပဌန်အလဟန်တုံ့ပဌန်ရန်အတလက် ကျလန်ုပ်တို့၏ကိုယ်ပိုင်ကုဒ်ကို အသုံသပဌုပါသည်။ အမဲချိတ် C++ ထုပ်ပိုသမဟုမျာသ lmdbxxC++ ခဌလင်သချက်အဖဌစ် errors မျာသပေါ်လာသည်။

LMDB ကို iOS သို့မဟုတ် macOS ပရောဂျက်သို့ ချိတ်ဆက်ရန် အမဌန်ဆုံသနည်သလမ်သအနေဖဌင့် ကျလန်ုပ်၏ CocoaPod ကို ကမ်သလဟမ်သပါသည်။ POSLMDB.

၄.၁။ အခဌေခံ abstractions

ပတ်ဝန်သကျင်

ဖလဲ့စည်သပုံမဟာ MDB_env ၎င်သသည် LMDB ၏အတလင်သပိုင်သအခဌေအနေ၏သိုလဟောင်ရာဖဌစ်သည်။ ရဟေ့ပဌေသလုပ်ဆောင်ချက်မျာသ၏ မိသာသစု mdb_env ၎င်သ၏ ဂုဏ်သတ္တိအချို့ကို သင်အာသ သတ်မဟတ်ခလင့်ပဌုသည်။ အရိုသရဟင်သဆုံသအခဌေအနေတလင်၊ အင်ဂျင်၏အစပျိုသပုံသည်ကကဲ့သို့ဖဌစ်သည်။

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

Mail.ru Cloud အပလီကေသရဟင်သတလင်၊ ကျလန်ုပ်တို့သည် ဘောင်နဟစ်ခုသာရဟိသော မူရင်သတန်ဖိုသမျာသကို ပဌောင်သလဲခဲ့သည်။

ပထမတစ်ခုသည် သိုလဟောင်ဖိုင်ကို မဌေပုံဆလဲထာသသည့် virtual address space ၏ အရလယ်အစာသဖဌစ်သည်။ ကံမကောင်သစလာဖဌင့်၊ စက်ပစ္စည်သတစ်ခုတည်သတလင်ပင်၊ သတ်မဟတ်ထာသသောတန်ဖိုသသည် လည်ပတ်မဟုတစ်ခုမဟတစ်ခုသို့ သိသိသာသာကလဲပဌာသနိုင်သည်။ iOS ၏ ကအင်္ဂါရပ်ကို ထည့်သလင်သစဉ်သစာသရန်၊ ကျလန်ုပ်တို့သည် သိုလဟောင်မဟု အမျာသဆုံသပမာဏကို ဒိုင်သနမစ်နည်သဖဌင့် ရလေသချယ်ပါသည်။ အချို့သောတန်ဖိုသမဟ စတင်၍ လုပ်ဆောင်မဟုအထိ ဆက်တိုက် တစ်ဝက်စီ ခလဲသလာသပါသည်။ mdb_env_open မဟလလဲ၍ အခဌာသရလဒ်တစ်ခု ပဌန်လာမည်မဟုတ်ပါ။ ENOMEM. သီအိုရီအရ၊ ဆန့်ကျင်ဘက်နည်သလမ်သတစ်ခုရဟိသည် - ညသစလာပထမညသစလာ Memory အနိမ့်ဆုံသကို အင်ဂျင်သို့ခလဲဝေပေသပဌီသ အမဟာသမျာသကိုလက်ခံရရဟိသောအခါ၊ MDB_MAP_FULLတိုသမဌဟင့်လိုက်ပါ။ သို့သော် ၎င်သသည် ပို၍ ဆူသဖဌစ်သည်။ အကဌောင်သရင်သမဟာ လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ မဟတ်ဉာဏ်ပဌန်လည်ပုံဖော်ခဌင်သအတလက် လုပ်ငန်သစဉ်ဖဌစ်သည်။ mdb_env_set_map_size အစောပိုင်သအင်ဂျင်မဟ လက်ခံရရဟိထာသသော အရာမျာသ (ကာဆာမျာသ၊ အရောင်သအ၀ယ်မျာသ၊ သော့မျာသနဟင့် တန်ဖိုသမျာသ) အာသလုံသကို ပျက်ပဌယ်စေသည်။ ကုဒ်ရဟိ အဖဌစ်အပျက်မျာသ၏ အလဟည့်အပဌောင်သအတလက် စာရင်သကိုင်ခဌင်သသည် ၎င်သ၏ သိသာထင်ရဟာသသော ရဟုပ်ထလေသမဟုကို ညသတည်စေသည်။ မည်သို့ပင်ဆိုစေကာမူ၊ virtual memory သည် သင့်အတလက် လလန်စလာနဟစ်သက်ပါက၊ ၎င်သသည် ရဟေ့ဆက်သလာသမည့် လမ်သဆုံလမ်သခလကို ကဌည့်ရန် အကဌောင်သပဌချက်တစ်ခုဖဌစ်နိုင်သည်။ MDBXကဌေညာထာသသောအင်္ဂါရပ်မျာသကဌာသတလင် "အလိုအလျောက်ပျံတက်သောဒေတာဘေ့စ်အရလယ်အစာသချိန်ညဟိမဟု" ပါရဟိသည်။

ဒုတိယဘောင်၊ ကျလန်ုပ်တို့နဟင့်မကိုက်ညီသော မူရင်သတန်ဖိုသသည် thread လုံခဌုံမဟုရဟိစေရန် စက်ပိုင်သဆိုင်ရာမျာသကို ထိန်သညဟိပေသပါသည်။ ကံမကောင်သစလာဖဌင့်၊ အနည်သဆုံသ iOS 10 တလင် thread local storage support တလင် ပဌဿနာမျာသရဟိသည်။ ကအကဌောင်သကဌောင့်၊ အထက်နမူနာတလင်၊ repository ကို အလံဖဌင့် ဖလင့်ထာသသည်။ MDB_NOTLS. ထို့အပဌင် လိုအပ်သည်။ အမဲချိတ် C++ ထုပ်ပိုသခဌင်သ။ lmdbxxက attribute နဟင့် variable မျာသကိုဖဌတ်ရန်။

ဒေတာဘေ့စ

ဒေတာဘေ့စ်သည် အထက်တလင်ပဌောခဲ့သည့် B-tree ၏ သီသခဌာသဥပမာတစ်ခုဖဌစ်သည်။ ၎င်သ၏ဖလင့်လဟစ်မဟုသည် အစပိုင်သတလင် အနည်သငယ်ထူသဆန်သသည်ဟု ထင်ရသော ငလေပေသငလေယူတစ်ခုအတလင်သတလင် ဖဌစ်ပေါ်ပါသည်။

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

အမဟန်မဟာ၊ LMDB တလင် ငလေပေသငလေယူတစ်ခုသည် သီသခဌာသဒေတာဘေ့စ်တစ်ခုမဟုတ်ဘဲ သိုလဟောင်မဟုတစ်ခုဖဌစ်သည်။ ကသဘောတရာသသည် မတူညီသောဒေတာဘေ့စ်မျာသတလင်ရဟိသော entities မျာသပေါ်တလင် atomic operations မျာသကိုလုပ်ဆောင်နိုင်စေပါသည်။ သီအိုရီအရ၊ ၎င်သသည် မတူညီသောဒေတာဘေ့စ်ပုံစံဖဌင့် ဇယာသမျာသကို မော်ဒယ်ပဌုလုပ်ရန် ဖဌစ်နိုင်ခဌေကို ပလင့်စေသည်၊ သို့သော် တစ်ချိန်က အောက်တလင် အသေသစိတ်ဖော်ပဌထာသသော အခဌာသနည်သလမ်သကို ကျလန်ုပ်သလာသခဲ့သည်။

သော့မျာသနဟင့်တန်ဖိုသမျာသ

ဖလဲ့စည်သပုံမဟာ MDB_val သော့နဟင့်တန်ဖိုသ နဟစ်ခုလုံသ၏ သဘောတရာသကို မော်ဒယ်မျာသ။ repository သည် ၎င်သတို့၏ semantics နဟင့် ပတ်သက်၍ မသိပါ။ သူမအတလက်၊ ကလဲပဌာသသောအရာသည် ပေသထာသသောအရလယ်အစာသရဟိ bytes ၏ array တစ်ခုမျဟသာဖဌစ်သည်။ အမျာသဆုံသသော့အရလယ်အစာသမဟာ 512 bytes ဖဌစ်သည်။

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

စတိုသဆိုင်သည် သော့မျာသကို ငယ်စဉ်လိုက် စီရန် နဟိုင်သယဟဉ်ကိရိယာကို အသုံသပဌုသည်။ ၎င်သကို သင့်ကိုယ်ပိုင်ဖဌင့် အစာသထိုသခဌင်သမပဌုပါက၊ ၎င်သတို့ကို အဘိဓာန်အစီအစဥ်ဖဌင့် byte-by-byte အမျိုသအစာသခလဲပေသသည့် default ကို အသုံသပဌုမည်ဖဌစ်သည်။

အရောင်သအဝယ်

ငလေပေသငလေယူစက်ကို အသေသစိတ်ဖော်ပဌထာသပါသည်။ ယခင်အခန်သထို့ကဌောင့် ကနေရာတလင် ၎င်သတို့၏ အဓိက ဂုဏ်သတ္တိမျာသကို စာကဌောင်သတိုဖဌင့် ပဌန်ပဌောပါမည်။

  1. အခဌေခံဂုဏ်သတ္တိအာသလုံသအတလက် ပံ့ပိုသမဟု အက်ဆစ်အဓိကစကာသလုံသမျာသ- အနုမဌူစလမ်သအာသ၊ ညီညလတ်မဟု၊ အထီသကျန်မဟုနဟင့် ယုံကဌည်စိတ်ချရမဟု။ macOS နဟင့် iOS တလင် တာရဟည်ခံမဟုအရ MDBX တလင် ချလတ်ယလင်သချက်တစ်ခု ရဟိနေသည်ကို သတိပဌုပါ။ ၎င်သတို့၏ တလင် ပိုမိုဖတ်ရဟုနိုင်ပါသည်။ README.
  2. Multithreading အတလက်ချဉ်သကပ်ပုံကို "စာရေသသူ/စာဖတ်သူအမျာသအပဌာသ" အစီအစဉ်ဖဌင့် ဖော်ပဌပါသည်။ စာရေသဆရာတလေက တစ်ယောက်ကိုတစ်ယောက် ပိတ်ဆို့ထာသပေမယ့် စာဖတ်သူတလေကိုတော့ မပိတ်ပင်ပါဘူသ။ စာဖတ်သူမျာသသည် စာရေသဆရာမျာသ သို့မဟုတ် အချင်သချင်သ မပိတ်ပင်ကဌပါ။
  3. အသိုက်အဝန်သ အရောင်သအ၀ယ်မျာသအတလက် ပံ့ပိုသမဟု။
  4. Multiversion ပံ့ပိုသမဟု။

LMDB တလင် Multiversioning သည် အလလန်ကောင်သမလန်သောကဌောင့် ၎င်သကို လက်တလေ့တလင် ပဌသလိုပါသည်။ အောက်ဖော်ပဌပါကုဒ်သည် ငလေပေသငလေယူတစ်ခုစီသည် ၎င်သ၏ဖလင့်ချိန်တလင် သက်ဆိုင်ရာဒေတာဘေ့စ်ဗာသရဟင်သနဟင့် အတိအကျအလုပ်လုပ်ကဌောင်သ၊ နောက်ဆက်တလဲပဌောင်သလဲမဟုမျာသအာသလုံသမဟ လုံသဝခလဲထုတ်ထာသကဌောင်သ ဖော်ပဌသည်။ repository ကို အစပဌုပဌီသ ၎င်သတလင် စစ်ဆေသမဟုမဟတ်တမ်သကို ထည့်ခဌင်သသည် စိတ်ဝင်စာသစရာမရဟိသောကဌောင့် ကဓလေ့ထုံသတမ်သမျာသကို spoiler အောက်တလင် ချန်ထာသခဲ့သည်။

စာမေသပလဲဝင်ရောက်မဟုကို ထည့်သလင်သခဌင်သ။

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

ရလေသချယ်နိုင်သောအာသဖဌင့်၊ SQLite နဟင့်တူညီသောလဟည့်ကလက်ကိုကဌိုသစာသပဌီသဘာဖဌစ်မည်ကိုကဌည့်ရဟုရန်အကဌံပဌုပါသည်။

Multiversioning သည် iOS developer တစ်ညသ၏ဘဝအတလက် အလလန်ကောင်သမလန်သော အကျိုသကျေသဇူသမျာသကို ယူဆောင်လာပါသည်။ ကပိုင်ဆိုင်မဟုကိုအသုံသပဌုခဌင်သဖဌင့် သုံသစလဲသူအတလေ့အကဌုံထည့်သလင်သစဉ်သစာသမဟုမျာသအပေါ်အခဌေခံ၍ မျက်နဟာပဌင်ပုံစံမျာသအတလက် ဒေတာရင်သမဌစ်အပ်ဒိတ်နဟုန်သကို အလလယ်တကူနဟင့် သဘာဝအတိုင်သ ချိန်ညဟိနိုင်ပါသည်။ ဥပမာအာသဖဌင့်၊ စနစ်မီဒီယာပဌခန်သမဟ အကဌောင်သအရာမျာသကို အလိုအလျောက်တင်ခဌင်သအဖဌစ် Mail.ru Cloud အပလီကေသရဟင်သ၏ အင်္ဂါရပ်ကို ယူကဌပါစို့။ ကောင်သမလန်သောချိတ်ဆက်မဟုဖဌင့်၊ client သည် တစ်စက္ကန့်လျဟင် ဓာတ်ပုံမျာသစလာကို ဆာဗာသို့ထည့်နိုင်သည်။ ဒေါင်သလုဒ်တစ်ခုစီပဌီသရင် update လုပ်ပါ။ UICollectionView အသုံသပဌုသူ၏ cloud တလင် မီဒီယာအကဌောင်သအရာဖဌင့်၊ သင်သည် 60 fps ခန့်ကို မေ့လျော့နိုင်ပဌီသ ကလုပ်ငန်သစဉ်အတလင်သ ချောမလေ့စလာ လဟိမ့်နိုင်သည်။ မကဌာခဏ မျက်နဟာပဌင် အပ်ဒိတ်မျာသကို ကာကလယ်ရန်၊ အခဌေခံတလင် ဒေတာပဌောင်သလဲမဟုနဟုန်သကို တစ်နည်သနည်သဖဌင့် ကန့်သတ်ရန် လိုအပ်သည်။ UICollectionViewDataSource.

ဒေတာဘေ့စ်သည် မျိုသစုံကလဲပဌာသခဌင်သကို ပံ့ပိုသမပေသဘဲ လက်ရဟိအခဌေအနေနဟင့်သာ အလုပ်လုပ်ရန် ခလင့်ပဌုပါက၊ အချိန်တည်ငဌိမ်သောဒေတာလျဟပ်တစ်ပဌက်တစ်ခုကို ဖန်တီသရန်၊ ၎င်သကို မမ်မိုရီအတလင်သဒေတာတည်ဆောက်ပုံ သို့မဟုတ် ယာယီဇယာသတစ်ခုသို့ ကူသယူရန် လိုအပ်သည်။ ဒီနည်သလမ်သတလေက အရမ်သစျေသကဌီသတယ်။ မမ်မိုရီသိုလဟောင်မဟုကိစ္စတလင်၊ တည်ဆောက်ထာသသော အရာဝတ္ထုမျာသကို သိမ်သဆည်သခဌင်သကဌောင့် ဖဌစ်ပေါ်လာသော မမ်မိုရီကုန်ကျစရိတ်နဟင့် ORM အသလင်ပဌောင်သမဟုမျာသနဟင့် ဆက်စပ်နေသော အချိန်ကုန်ကျစရိတ် နဟစ်ခုလုံသကို ရရဟိပါသည်။ ယာယီစာသပလဲအတလက်၊ ကအရာသည် အသေသအဖလဲမဟုတ်သော ကိစ္စမျာသတလင်သာ အဓိပ္ပါယ်ရဟိစေသည့် ပိုစျေသကဌီသသော ပျော်ရလဟင်မဟုတစ်ခုဖဌစ်သည်။

Multiversioning LMDB သည် အလလန်ပဌေပဌစ်သောနည်သဖဌင့် တည်ငဌိမ်သောဒေတာရင်သမဌစ်ကို ထိန်သသိမ်သခဌင်သပဌဿနာကို ဖဌေရဟင်သပေသသည်။ ငလေပေသငလေယူတစ်ခုဖလင့်ရုံနဲ့ လုံလောက်ပါပဌီ - ကျလန်ုပ်တို့ ၎င်သကို ပဌီသမဌောက်သည်အထိ ဒေတာအစုံကို ပဌုပဌင်ရန် အာမခံပါသည်။ ၎င်သ၏ အပ်ဒိတ်နဟုန်သ၏ ယုတ္တိယုတ္တိသည် ယခုအခါတလင် သိသာထင်ရဟာသသော အရင်သအမဌစ်မျာသထက် ကျော်လလန်ခဌင်သမရဟိသော တင်ပဌမဟုအလလဟာ၏ လက်ထဲတလင် လုံသလုံသလျာသလျာသ ရဟိနေပါသည်။

ကာဆာမျာသ

Cursors မျာသသည် B-tree ကိုဖဌတ်ကာ သော့တန်ဖိုသအတလဲမျာသပေါ်တလင် စနစ်တကျ ထပ်လောင်သခဌင်သအတလက် ယန္တရာသတစ်ခု ပေသပါသည်။ ၎င်သတို့မပါဘဲ၊ ယခုကျလန်ုပ်တို့ပဌောင်သထာသသောဒေတာဘေ့စ်ရဟိဇယာသမျာသကိုထိရောက်စလာပုံစံပဌရန်မဖဌစ်နိုင်ပါ။

၄.၂။ Table Modeling

အဓိက မဟာကဌာသခဌင်သ ပိုင်ဆိုင်မဟုသည် အခဌေခံ abstraction မျာသ၏ ထိပ်ရဟိ ဇယာသကဲ့သို့သော ထိပ်တန်သအဆင့် abstraction တစ်ခုကို တည်ဆောက်နိုင်စေပါသည်။ အသုံသပဌုသူ၏ ဖိုင်မျာသနဟင့် ဖိုင်တလဲမျာသအာသလုံသကို ကက်ရဟ်လုပ်ထာသသည့် cloud client ၏ ပင်မဇယာသနမူနာတလင် ကလုပ်ငန်သစဉ်ကို သုံသသပ်ကဌည့်ကဌပါစို့။

ဇယာသဇယာသ

ဖိုင်တလဲသစ်ပင်ပါသည့် ဇယာသတစ်ခု၏ ဖလဲ့စည်သပုံကို ထက်မဌက်စေသည့် ဘုံအခဌေအနေမျာသထဲမဟတစ်ခုမဟာ ပေသထာသသောလမ်သညလဟန်တစ်ခုအတလင်သ၌ရဟိသော အစိတ်အပိုင်သအာသလုံသကို ရလေသချယ်ရန်ဖဌစ်သည်။ ကကဲ့သို့သော ထိရောက်သောမေသမဌန်သမဟုမျာသအတလက် ကောင်သသောဒေတာအဖလဲ့အစည်သပုံစံတစ်ခုသည် ကပ်လျက်စာရင်သ. ၎င်သကို သော့တန်ဖိုသသိုလဟောင်မဟု၏ထိပ်တလင် အကောင်အထည်ဖော်ရန်၊ ၎င်သကို ပင်မလမ်သညလဟန်နဟင့်သက်ဆိုင်သည့်အပေါ်အခဌေခံ၍ ၎င်သတို့အုပ်စုဖလဲ့ထာသသည့်ပုံစံဖဌင့် ဖိုင်မျာသနဟင့် ဖိုင်တလဲမျာသ၏သော့မျာသကို စီရန် လိုအပ်သည်။ ထို့အပဌင်၊ Windows အသုံသပဌုသူနဟင့်ရင်သနဟီသသောပုံစံဖဌင့် directory ၏အကဌောင်သအရာမျာသကိုပဌသရန်အတလက် (ဖိုင်တလဲမျာသကို ညသစလာပထမ၊ ထို့နောက်ဖိုင်မျာသ၊ နဟစ်ခုလုံသကိုအက္ခရာစဉ်အလိုက်စီထာသသည်) သော့တလင်သက်ဆိုင်ရာအပိုအကလက်မျာသကိုထည့်သလင်သရန်လိုအပ်သည်။

အောက်ဖော်ပဌပါပုံသည် အလုပ်အပေါ်အခဌေခံ၍ bytes ၏ array တစ်ခုအနေဖဌင့် သော့မျာသ၏ကိုယ်စာသပဌုပုံသည် မည်သို့ပုံသဏ္ဍန်ရဟိသည်ကိုပဌသထာသသည်။ ပထမညသစလာ၊ ပင်မလမ်သညလဟန်အမဟတ်အသာသ (အနီရောင်) ပါသည့် ဘိုက်မျာသကို ထာသရဟိပဌီသနောက် အမျိုသအစာသ (အစိမ်သ) နဟင့် အမည် (အပဌာ) တို့၏ အမဌီသတလင် ရဟိနဟင့်ပဌီသသာသဖဌစ်သည်။ ပုံသေ LMDB နဟိုင်သယဟဉ်လေ့လာသူကို အဘိဓာန်အစီအစဥ်ဖဌင့် စီခလဲထာသခဌင်သဖဌစ်ပဌီသ ၎င်သတို့ကို စီစဥ်ထာသသည်။ လိုအပ်သောနည်သလမ်သ။ တူညီသောအနီရောင်ရဟေ့ဆက်ဖဌင့် ဆင့်ကဲဖဌတ်သလာသသောသော့မျာသသည် အသုံသပဌုသူအင်တာဖေ့စ် (ညာဘက်) တလင် ၎င်သတို့ကိုပဌသသင့်သည့်အစီအစဥ်အဖဌစ် ၎င်သတို့နဟင့်ဆက်စပ်နေသောတန်ဖိုသမျာသကို ကျလန်ုပ်တို့အာသ ပေသဆောင်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

သော့မျာသနဟင့်တန်ဖိုသမျာသကို နံပါတ်စဉ်သတ်မဟတ်ခဌင်သ။

ကမ္ဘာတစ်ဝဟမ်သရဟိ အရာဝတ္ထုမျာသကို အမဟတ်စဉ်ပဌုလုပ်ရန် နည်သလမ်သမျာသစလာရဟိသည်။ ကျလန်ုပ်တို့တလင် မဌန်နဟုန်သမဟလလဲ၍ အခဌာသလိုအပ်ချက်မရဟိသောကဌောင့်၊ ကျလန်ုပ်တို့ကိုယ်တိုင်အတလက် ဖဌစ်နိုင်သမျဟအမဌန်ဆုံသတစ်ခုကို C ဘာသာစကာသတည်ဆောက်ပုံမဟ သိမ်သပိုက်ထာသသော မမ်မိုရီအမဟိုက်ပုံတစ်ပုံအာသ ရလေသချယ်ခဲ့သည်။ ထို့ကဌောင့်၊ လမ်သညလဟန်ဒဌပ်စင်တစ်ခု၏သော့ကို အောက်ပါဖလဲ့စည်သပုံဖဌင့် စံနမူနာယူနိုင်ပါသည်။ NodeKey.

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

ကယ်တင်ရန် NodeKey storage ထဲမဟာ အရာဝတ္ထုတလေ လိုအပ်တယ်။ MDB_val ဖလဲ့စည်သပုံ၏အစ၏လိပ်စာတလင် အချက်အလက်ကို pointer အာသ နေရာချပဌီသ ၎င်သတို့၏အရလယ်အစာသကို function ဖဌင့် တလက်ချက်ပါ။ sizeof.

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

ဒေတာဘေ့စ်ရလေသချယ်မဟုစံနဟုန်သမျာသဆိုင်ရာ ပထမအခန်သတလင်၊ CRUD လုပ်ဆောင်ချက်မျာသ၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် အရေသကဌီသသောရလေသချယ်မဟုဆိုင်ရာအချက်တစ်ခုအနေဖဌင့် ဒိုင်နမစ်ခလဲဝေချထာသမဟုမျာသကို လျဟော့ချရန် ဖော်ပဌထာသပါသည်။ လုပ်ဆောင်ချက်ကုဒ် serialize LMDB တလင် မဟတ်တမ်သအသစ်မျာသကို ဒေတာဘေ့စ်ထဲသို့ ထည့်သလင်သသည့်အခါ ၎င်သတို့ကို လုံသလုံသလျာသလျာသ ရဟောင်ရဟာသနိုင်ပုံကို ပဌသထာသသည်။ ဆာဗာမဟ ဝင်လာသော ဘိုက်မျာသ၏ အခင်သအကျင်သကို ပထမညသစလာ stack တည်ဆောက်ပုံမျာသအဖဌစ် ပဌောင်သလဲပဌီသနောက် ၎င်သတို့ကို သိုလဟောင်ခန်သထဲသို့ အသေသအဖလဲလေသ စလန့်ပစ်သလာသပါသည်။ LMDB တလင် တက်ကဌလသော ခလဲဝေချထာသမဟုမျာသလည်သ မရဟိသောကဌောင့်၊ သင်သည် iOS ၏ စံနဟုန်သမျာသဖဌင့် အံ့မခန်သ အခဌေအနေကို ရနိုင်သည် - ကလန်ရက်မဟ ဒစ်ခ်အထိ ဒေတာနဟင့် အလုပ်လုပ်ရန် stack memory ကိုသာ အသုံသပဌုပါ။

ဒလိနဟိုင်သစာဖဌင့် သော့မျာသမဟာယူခဌင်သ။

သော့အမဟာစာ ဆက်စပ်မဟုကို နဟိုင်သယဟဉ်ခဌင်သဟုခေါ်သော အထူသလုပ်ဆောင်မဟုတစ်ခုက ပေသဆောင်သည်။ အင်ဂျင်သည် ၎င်သတို့ပါရဟိသော bytes မျာသ၏ semantics အကဌောင်သ ဘာမျဟမသိသောကဌောင့်၊ မူရင်သ နဟိုင်သယဟဉ်သူသည် ၎င်သတို့၏ byte-by-byte နဟိုင်သယဟဉ်မဟုကို အသုံသပဌုကာ သော့မျာသကို အဘိဓာန်အစီအစဥ်အတိုင်သ စီစဉ်ရန်မဟတပါသ ရလေသချယ်စရာမရဟိပေ။ အဆောက်အညမျာသကို စီစဉ်ရန် ၎င်သကိုအသုံသပဌုခဌင်သသည် ထလင်သထုထာသသော ပုဆိန်ဖဌင့် မုတ်ဆိတ်ရိတ်ခဌင်သနဟင့်တူသည်။ သို့သော် ရိုသရဟင်သသောကိစ္စမျာသတလင် ကနည်သလမ်သကို ကျလန်ုပ်လက်ခံနိုင်ဖလယ်ရဟိသည်။ အခဌာသရလေသချယ်စရာကို အောက်တလင်ဖော်ပဌထာသသော်လည်သ ကနေရာတလင် လမ်သတစ်လျဟောက်တလင် ပဌန့်ကျဲနေသော ဂျုတ်အချို့ကို မဟတ်သာသထာသပါမည်။

ပထမဆုံသ သတိထာသရမည့်အချက်မဟာ မူလဒေတာအမျိုသအစာသမျာသ၏ မဟတ်ဉာဏ်ကို ကိုယ်စာသပဌုခဌင်သပင်ဖဌစ်သည်။ ထို့ကဌောင့် Apple စက်မျာသအာသလုံသတလင် ကိန်သပဌည့်ကိန်သရဟင်မျာသကို ဖော်မတ်ဖဌင့် သိမ်သဆည်သထာသသည်။ Little Endian ပါ. ဆိုလိုသည်မဟာ သိသာထင်ရဟာသသော အနည်သဆုံသ byte သည် ဘယ်ဘက်တလင် ရဟိနေမည်ဖဌစ်ပဌီသ ၎င်သတို့၏ byte-by-byte နဟိုင်သယဟဉ်မဟုကို အသုံသပဌု၍ ကိန်သပဌည့်မျာသကို စီရန် လုပ်နိုင်မည်မဟုတ်ပေ။ ဥပမာအာသဖဌင့်၊ 0 မဟ 511 မဟ နံပါတ်မျာသကို တလဲလုပ်ရန် ကဌိုသစာသခဌင်သသည် အောက်ပါရလဒ်ကို ရရဟိစေမည်ဖဌစ်သည်။

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

ကပဌဿနာကိုဖဌေရဟင်သရန်၊ ကိန်သပဌည့်မျာသကို byte နဟိုင်သယဟဉ်ကိရိယာအတလက် သင့်လျော်သောဖော်မတ်တလင် သော့ထဲတလင် သိမ်သဆည်သထာသရပါမည်။ မိသာသစုမဟ လုပ်ဆောင်ချက်မျာသသည် လိုအပ်သော အသလင်ပဌောင်သမဟုကို ဆောင်ရလက်နိုင်ရန် ကူညီပေသပါမည်။ hton* (အထူသသဖဌင့် htons ဥပမာအာသဖဌင့် double-byte နံပါတ်မျာသအတလက်။

ပရိုဂရမ်သမင်သတလင် စာကဌောင်သမျာသကို ကိုယ်စာသပဌုသည့်ဖော်မတ်သည် သင်သိသည့်အတိုင်သ တစ်ခုလုံသဖဌစ်သည်။ ပုံပဌင်. strings မျာသ၏ semantics နဟင့် memory တလင် ၎င်သတို့ကို ကိုယ်စာသပဌုရန် အသုံသပဌုသည့် encoding သည် စာလုံသတစ်ခုလျဟင် byte တစ်ခုထက်ပို၍ ရဟိနေနိုင်သည်ဆိုပါက၊ default comparator ကိုအသုံသပဌုခဌင်သအယူအဆကို ချက်ချင်သစလန့်လလဟတ်ခဌင်သသည် ပိုကောင်သပါသည်။

ဒုတိယအချက်ကတော့ သတိထာသရမယ့်အချက်ပါ။ ချိန်ညဟိမဟုအခဌေခံမူမျာသ struct field compiler ။ ၎င်သတို့ကဌောင့်၊ အမဟိုက်တန်ဖိုသမျာသပါရဟိသော ဘိုက်မျာသကို အကလက်မျာသကဌာသတလင် မဟတ်ဉာဏ်တလင် ဖလဲ့နိုင်ပဌီသ ဘိုက်အမျိုသအစာသခလဲခဌင်သကို ချိုသဖျက်သလာသမည်ဖဌစ်သည်။ အမဟိုက်မျာသကို ဖယ်ရဟာသရန်၊ ကလက်လပ်မျာသကို တင်သကဌပ်စလာ သတ်မဟတ်ထာသသော အစီအစဥ်အတိုင်သ ကဌေညာရမည်ဖဌစ်ပဌီသ၊ ချိန်ညဟိမဟု စည်သမျဉ်သမျာသကို မဟတ်သာသထာသရန်၊ သို့မဟုတ် ဖလဲ့စည်သတည်ဆောက်ပုံကဌေညာခဌင်သတလင် အရည်အချင်သကို အသုံသပဌုပါ။ packed.

ပဌင်ပ နဟိုင်သယဟဥ်စနစ်မဟ အဓိက မဟာယူခဌင်သ။

အဓိက နဟိုင်သယဟဥ်ဂျစ်သည် ဒလိနဟိုင်သယဟဥ်အတလက် ရဟုပ်ထလေသလလန်သနေပါသည်။ အကဌောင်သရင်သမျာသစလာထဲမဟတစ်ခုမဟာ အဆောက်အညအတလင်သ နည်သပညာနယ်ပယ်မျာသ ရဟိနေခဌင်သပင်ဖဌစ်သည်။ လမ်သညလဟန်ဒဌပ်စင်တစ်ခုအတလက် ကျလန်ုပ်တို့နဟင့်ရင်သနဟီသပဌီသသာသသော့တစ်ခု၏နမူနာတလင် ၎င်သတို့၏ဖဌစ်ပျက်မဟုကို ဖော်ပဌပါမည်။

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

၎င်သ၏ရိုသရဟင်သမဟုအတလက်၊ ကိစ္စအမျာသစုတလင် ၎င်သသည် မဟတ်ဉာဏ်အလလန်အကျလံသုံသစလဲသည်။ ပျမ်သမျဟဖိုင်နဟင့် ဖိုင်တလဲအမည်မျာသသည် စာလုံသရေ 256-20 ထက်မပိုသော်လည်သ ခေါင်သစဉ်ကဌာသခံသည် 30 bytes ဖဌစ်သည်။

စံချိန်တစ်ခု၏အရလယ်အစာသကို ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ရန် စံနည်သစနစ်တစ်ခုသည် အမဟန်တကယ်အရလယ်အစာသနဟင့်ကိုက်ညီစေရန် ၎င်သကို "ဖဌတ်" ရန်ဖဌစ်သည်။ ၎င်သ၏ အနဟစ်သာရမဟာ တည်ဆောက်ပုံအဆုံသတလင် ကလဲပဌာသနိုင်သော အလျာသအကလက်မျာသအာသလုံသ၏ အကဌောင်သအရာမျာသကို ကဌာသခံတစ်ခုတလင် သိမ်သဆည်သထာသပဌီသ ၎င်သတို့၏ အလျာသမျာသကို သီသခဌာသကိန်သရဟင်မျာသတလင် သိမ်သဆည်သထာသသည်။ ကချဉ်သကပ်မဟုနဟင့်အညီ အဓိကအချက်မဟာ၊ NodeKey အောက်ပါနည်သလမ်သဖဌင့် ပဌောင်သလဲပါသည်။

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

ထို့အပဌင်၊ နံပါတ်စဉ်အလိုက်၊ ဒေတာအရလယ်အစာသအဖဌစ် သတ်မဟတ်မထာသပါ။ sizeof ဖလဲ့စည်သပုံတစ်ခုလုံသနဟင့် အကလက်အာသလုံသ၏ အရလယ်အစာသသည် ပုံသေအလျာသနဟင့် အမဟန်တကယ်အသုံသပဌုထာသသော ကဌာသခံအစိတ်အပိုင်သ၏ အရလယ်အစာသဖဌစ်သည်။

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

ပဌန်လည်ပဌုပဌင်ခဌင်သ၏ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် သော့မျာသသိမ်သပိုက်ထာသသောနေရာမျာသတလင် သိသာထင်ရဟာသသောငလေစုမဟုကိုရရဟိခဲ့ပါသည်။ ဒါပေမယ့် နည်သပညာနယ်ပယ်ကဌောင့်ပါ။ nameLengthမူရင်သ ဒလိနဟိုင်သယဟဥ်နဟိုင်သယဟဉ်မဟုသည် သော့နဟိုင်သယဟဉ်မဟုအတလက် မသင့်လျော်တော့ပါ။ ကျလန်ုပ်တို့သည် ၎င်သကို ကျလန်ုပ်တို့၏ကိုယ်ပိုင်ဖဌင့် အစာသထိုသခဌင်သမရဟိပါက၊ နာမည်၏အရဟည်သည် နာမည်ကိုယ်တိုင်ထက် အမျိုသအစာသခလဲရာတလင် ပို၍ညသစာသပေသရမည့်အချက်ဖဌစ်သည်။

LMDB သည် ဒေတာဘေ့စ်တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်သော့နဟိုင်သယဟဉ်မဟုလုပ်ဆောင်ချက်ကို ခလင့်ပဌုထာသသည်။ ၎င်သသည် function ကိုအသုံသပဌုပဌီသလုပ်ဆောင်သည်။ mdb_set_compare မဖလင့်ခင် တိတိကျကျ သိသာထင်ရဟာသသောအကဌောင်သပဌချက်မျာသအတလက်၊ ဒေတာဘေ့စ်တစ်ခုသည် ၎င်သ၏သက်တမ်သတစ်လျဟောက်လုံသ ပဌောင်သလဲ၍မရပါ။ input တလင်၊ နဟိုင်သယဟဉ်သူသည် binary ဖော်မတ်ဖဌင့် သော့နဟစ်ခုကို လက်ခံရရဟိပဌီသ output တလင် ၎င်သသည် နဟိုင်သယဟဉ်မဟု၏ရလဒ်ကို ပဌန်ပေသသည်- (-1) ထက်နည်သသော၊ (1) ထက်ကဌီသသော သို့မဟုတ် ညီမျဟခဌင်သ (0)။ Pseudocode for NodeKey ပုံရသည်။

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

ဒေတာဘေ့စ်ရဟိ သော့မျာသအာသလုံသသည် အမျိုသအစာသတူသရလေ့ ၎င်သတို့၏ byte ကိုယ်စာသပဌုမဟုကို သော့၏ အသုံသချဖလဲ့စည်သပုံအမျိုသအစာသသို့ ချလင်သချက်မရဟိ ချလင်သချက်မရဟိ ချလင်သချက်မရဟိ ချရန်မဟာ တရာသဝင်ဖဌစ်သည်။ ကနေရာတလင် ကလဲပဌာသချက်တစ်ခုရဟိသည်၊ သို့သော် ၎င်သကို "Reading Records" အပိုင်သခလဲတလင် အနည်သငယ်လျဟော့ပဌီသ ဆလေသနလေသပါမည်။

တန်ဖိုသအမဟတ်စဉ်

LMDB သည် သိမ်သဆည်သထာသသော မဟတ်တမ်သမျာသ၏ သော့မျာသဖဌင့် အလလန်အမင်သ ပဌင်သပဌင်သထန်ထန် လုပ်ဆောင်သည်။ ၎င်သတို့ကို မည်သည့် အသုံသချပလီကေသရဟင်သ လည်ပတ်မဟုဘောင်အတလင်သမဟ တစ်ခုနဟင့်တစ်ခု နဟိုင်သယဟဉ်ထာသပဌီသ ဖဌေရဟင်သချက်တစ်ခုလုံသ၏ စလမ်သဆောင်ရည်သည် နဟိုင်သယဟဉ်သူ၏ အမဌန်နဟုန်သပေါ်တလင် မူတည်သည်။ စံပဌကမ္ဘာတစ်ခုတလင်၊ ပုံသေ binary နဟိုင်သယဟဉ်သူသည် သော့မျာသကို နဟိုင်သယဟဉ်ရန် လုံလောက်သင့်သည်၊ သို့သော် အကယ်၍ သင်သည် သင့်ကိုယ်ပိုင်ကို အမဟန်တကယ်အသုံသပဌုရမည်ဆိုလျဟင် ၎င်သရဟိသော့မျာသကို ဖယ်ထုတ်ရန်အတလက် လုပ်ထုံသလုပ်နည်သသည် မဌန်နိုင်သမျဟမဌန်သင့်သည်။

ဒေတာဘေ့စ်သည် မဟတ်တမ်သ၏တန်ဖိုသ (တန်ဖိုသ) ကို အထူသစိတ်မ၀င်စာသပါ။ ၎င်သ၏ byte ကိုယ်စာသပဌုမဟုမဟ အရာဝတ္ထုတစ်ခုသို့ ပဌောင်သခဌင်သသည် ဥပမာအာသဖဌင့် မျက်နဟာပဌင်ပေါ်တလင် ၎င်သကိုပဌသရန် အပလီကေသရဟင်သကုဒ်မဟ လိုအပ်ပဌီသမဟသာ ဖဌစ်ပေါ်ပါသည်။ ထိုသို့ဖဌစ်ခဲသောကဌောင့်၊ ကလုပ်ထုံသလုပ်နည်သ၏အမဌန်နဟုန်သအတလက် လိုအပ်ချက်မျာသသည် အလလန်အရေသပါလဟသည်မဟုတ်ပေ၊ ၎င်သ၏အကောင်အထည်ဖော်မဟုတလင် ကျလန်ုပ်တို့သည် ပိုမိုအဆင်ပဌေစေရန်အတလက် ပိုမိုလလတ်လပ်စလာ အာရုံစိုက်နိုင်ကဌပါသည်။ ဥပမာအာသဖဌင့်၊ ဒေါင်သလုဒ်မရသေသသောဖိုင်မျာသအကဌောင်သ metadata မျာသကို အမဟတ်စဉ်ပဌုလုပ်ရန်အတလက် ကျလန်ုပ်တို့အသုံသပဌုသည် NSKeyedArchiver.

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

ဒါပေမယ့် စလမ်သဆောင်ရည်က အရေသကဌီသတဲ့အချိန်တလေရဟိတယ်။ ဥပမာအာသဖဌင့်၊ အသုံသပဌုသူ cloud ၏ ဖိုင်တည်ဆောက်ပုံနဟင့်ပတ်သက်သော မက်တာအချက်အလက်ကို သိမ်သဆည်သသောအခါ၊ ကျလန်ုပ်တို့သည် တူညီသော အရာဝတ္တုမဟတ်ဉာဏ်ကို စလန့်ပစ်ခဌင်သကို အသုံသပဌုပါသည်။ ၎င်သတို့၏ အမဟတ်စဉ်အလိုက် ကိုယ်စာသပဌုမဟုကို ထုတ်ပေသခဌင်သလုပ်ငန်သ၏ အလေသပေသဖော်ပဌချက်မဟာ လမ်သညလဟန်တစ်ခု၏ အစိတ်အပိုင်သမျာသကို အတန်သလိုက် အဆင့်လိုက်ဖဌင့် စံနမူနာယူထာသသည့်အချက်ဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

၎င်သကို C ဘာသာစကာသဖဌင့် အကောင်အထည်ဖော်ရန်အတလက်၊ အမလေဆက်ခံသူ၏ သီသခဌာသနယ်ပယ်မျာသကို သီသခဌာသဖလဲ့စည်သပုံမျာသအဖဌစ် ခလဲထုတ်ကာ အခဌေခံတစ်ခုနဟင့် ၎င်သတို့၏ ချိတ်ဆက်မဟုကို ပဌည်ထောင်စု အမျိုသအစာသ၏ နယ်ပယ်တစ်ခုမဟတစ်ဆင့် သတ်မဟတ်ထာသသည်။ သမဂ္ဂ၏ တကယ့်အကဌောင်သအရာကို အမျိုသအစာသနည်သပညာဆိုင်ရာ ဂုဏ်ရည်တော်မဟတစ်ဆင့် သတ်မဟတ်ထာသသည်။

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

မဟတ်တမ်သမျာသကို ထည့်သလင်သခဌင်သနဟင့် အပ်ဒိတ်လုပ်ခဌင်သ။

နံပါတ်စဉ်အလိုက် သော့နဟင့်တန်ဖိုသကို စတိုသဆိုင်တလင် ထည့်နိုင်သည်။ ကအတလက်၊ function ကိုအသုံသပဌုသည်။ mdb_put.

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

ဖလဲ့စည်သမဟုအဆင့်တလင်၊ သိုလဟောင်မဟုအာသ တူညီသောသော့ဖဌင့် မဟတ်တမ်သအမျာသအပဌာသကို သိမ်သဆည်သရန် ခလင့်ပဌု သို့မဟုတ် တာသမဌစ်နိုင်သည်။ သော့ပလာသခဌင်သကို တာသမဌစ်ပါက၊ မဟတ်တမ်သတစ်ခုကို ထည့်သလင်သသည့်အခါတလင်၊ ရဟိပဌီသသာသမဟတ်တမ်သကို အပ်ဒိတ်လုပ်ခဌင်သအာသ ခလင့်ပဌုခဌင်သရဟိ၊ မရဟိ ဆုံသဖဌတ်နိုင်သည်။ ကုဒ်တလင် အမဟာသအယလင်သတစ်ခုကဌောင့်သာ ဖယောင်သတိုင်ဖဌစ်ပေါ်နိုင်လျဟင် အလံကို သတ်မဟတ်ခဌင်သဖဌင့် ၎င်သကို အာမခံနိုင်သည် NOOVERWRITE။

မဟတ်တမ်သမျာသဖတ်ခဌင်သ။

LMDB တလင် မဟတ်တမ်သမျာသဖတ်ခဌင်သအတလက် လုပ်ဆောင်ချက်မဟာ mdb_get. သော့တန်ဖိုသအတလဲကို ယခင်က စလန့်ပစ်ထာသသော တည်ဆောက်ပုံမျာသဖဌင့် ကိုယ်စာသပဌုပါက၊ ကလုပ်ထုံသလုပ်နည်သသည် ကကဲ့သို့ ဖဌစ်ပုံရသည်။

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

တင်ပဌထာသသောစာရင်သသည် အမဟိုက်ပုံကဌီသတစ်ခုမဟဖလဲ့စည်သပုံမျာသမဟတစ်ဆင့် နံပါတ်စဉ်လိုက်ခဌင်သအာသ စာရေသသည့်အခါသာမက ဒေတာဖတ်ရဟုသည့်အခါတလင် ဒိုင်နမစ်ခလဲဝေမဟုမျာသကို ဖယ်ရဟာသပစ်နိုင်ပုံကို ပဌသထာသသည်။ လုပ်ဆောင်ချက်မဟဆင်သသက်လာသည်။ mdb_get ညလဟန်ပဌသူသည် အရာဝတ္တု၏ byte ကိုယ်စာသပဌုမဟုကို ဒေတာဘေ့စ်တလင်သိမ်သဆည်သထာသသည့် virtual memory လိပ်စာကို အတိအကျကဌည့်ရဟုသည်။ အမဟန်တော့၊ ကျလန်ုပ်တို့သည် ဒေတာဖတ်ရဟုခဌင်သ၏ အလလန်မဌင့်မာသသော မဌန်နဟုန်သကို ပံ့ပိုသပေသသည့် အခမဲ့နီသပါသ ORM တစ်မျိုသကို ရရဟိပါသည်။ ချဉ်သကပ်မဟု၏ အလဟတရာသမျာသနဟင့်အတူ၊ ၎င်သနဟင့်ဆက်စပ်နေသော အင်္ဂါရပ်မျာသစလာကို မဟတ်သာသထာသရန် လိုအပ်ပါသည်။

  1. ဖတ်ရန်သာ အရောင်သအ၀ယ်ပဌုလုပ်ခဌင်သအတလက်၊ ငလေပေသငလေယူပိတ်ချိန်အထိသာ တန်ဖိုသတည်ဆောက်ပုံသို့ ညလဟန်ပဌချက်သည် မဟန်ကန်ကဌောင်သ အာမခံပါသည်။ အစောပိုင်သတလင်ဖော်ပဌခဲ့သည့်အတိုင်သ၊ ကူသယူရေသသာသခဌင်သနိယာမကဌောင့် အရာဝတ္ထုတည်ရဟိသည့် B-tree ၏စာမျက်နဟာမျာသသည် ၎င်သတို့ကို အနည်သဆုံသ ငလေပေသငလေယူတစ်ခုမဟ ရည်ညလဟန်သသရလေ့ မပဌောင်သလဲပါ။ တစ်ချိန်တည်သမဟာပင်၊ ၎င်သတို့နဟင့် ဆက်စပ်နေသည့် နောက်ဆုံသ ငလေပေသငလေယူ ပဌီသသည်နဟင့်၊ စာမျက်နဟာမျာသကို ဒေတာအသစ်အတလက် ပဌန်သုံသနိုင်သည်။ ၎င်သတို့ကို ဖန်တီသထာသသော အရောင်သအ၀ယ်လုပ်ငန်သမဟ ရဟင်သန်ရန် အရာဝတ္ထုမျာသ လိုအပ်ပါက၊ ၎င်သတို့ကို ကူသယူထာသရန် လိုအပ်ပါသည်။
  2. ဖတ်ပဌီသသော ငလေပေသငလေယူအတလက်၊ ရလဒ်ဖလဲ့စည်သပုံ-တန်ဖိုသသို့ ညလဟန်ပဌသည့်အချက်သည် ပထမမလမ်သမံခဌင်သလုပ်ငန်သစဉ် (ဒေတာရေသသာသခဌင်သ သို့မဟုတ် ဖျက်ခဌင်သ) မတိုင်မီအထိသာ အကျုံသဝင်မည်ဖဌစ်သည်။
  3. ဒါတောင် ဖလဲ့စည်သပုံ NodeValue ပဌည့်စုံမဟုမရဟိသော်လည်သ ဖဌတ်တောက်ထာသသည် (အပိုင်သခလဲ "ပဌင်ပနဟိုင်သယဟဉ်သူမဟ သော့မျာသကို မဟာယူခဌင်သ" ကိုကဌည့်ပါ)၊ ညလဟန်ပဌချက်မဟတစ်ဆင့်၊ သင်သည် ၎င်သ၏အကလက်မျာသကို အလလယ်တကူ ဝင်ရောက်နိုင်သည်။ အဓိကကတော့ အဲဒါကို နဟောင့်ယဟက်ဖို့ မဟုတ်ဘူသ။
  4. မည်သည့်အခဌေအနေမျိုသတလင်မဆို လက်ခံရရဟိသောညလဟန်ပဌချက်ဖဌင့် ဖလဲ့စည်သတည်ဆောက်ပုံကို မလမ်သမံပဌင်ဆင်နိုင်သည်။ ပဌောင်သလဲမဟုအာသလုံသကို နည်သလမ်သဖဌင့်သာ ပဌုလုပ်ရပါမည်။ mdb_put. သို့သော်၊ ကဖလဲ့စည်သပုံတည်ရဟိရာ မန်မိုရီဧရိယာကို readonly mode တလင် ပုံဖော်ထာသသောကဌောင့် ၎င်သကိုပဌုလုပ်လိုသည့်ဆန္ဒအာသလုံသဖဌင့် ၎င်သသည် အလုပ်မဖဌစ်ပါ။
  5. ဥပမာအာသဖဌင့်၊ လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ အမျာသဆုံသသိုလဟောင်မဟုအရလယ်အစာသကို တိုသမဌဟင့်ရန်အတလက် လုပ်ငန်သစဉ်တစ်ခု၏ လိပ်စာနေရာသို့ ဖိုင်တစ်ခုကို ပဌန်လည်ပုံဖော်ပါ။ mdb_env_set_map_size ယေဘုယျအာသဖဌင့် ငလေပေသငလေယူမျာသနဟင့် ဆက်စပ်ပစ္စည်သမျာသအာသလုံသကို လုံသဝတရာသဝင်စေပဌီသ အထူသသဖဌင့် အရာဝတ္ထုမျာသကို ဖတ်ရန် ညလဟန်ပဌသည်။

နောက်ဆုံသတလင်၊ နောက်ထပ်အင်္ဂါရပ်တစ်ခုသည် အလလန်ဆိုသသလမ်သလလန်သသဖဌင့် ၎င်သ၏အနဟစ်သာရကို ထုတ်ဖော်ပဌောဆိုခဌင်သသည် နောက်ထပ်အချက်တစ်ခုတည်သနဟင့် မကိုက်ညီပါ။ B-tree ၏အခန်သတလင်၊ မဟတ်ဉာဏ်တလင်၎င်သ၏စာမျက်နဟာမျာသ၏ဖလဲ့စည်သပုံပုံစံကိုငါပေသခဲ့သည်။ နံပါတ်စဉ်တပ်ထာသသောဒေတာပါရဟိသော ကဌာသခံ၏အစ၏လိပ်စာသည် လုံသဝထင်သလိုဖဌစ်နိုင်သည်ဟူသောအချက်မဟ ထလက်ပေါ်လာခဌင်သဖဌစ်သည်။ ထို့အတလက်ကဌောင့် ၎င်သတို့အာသ ညလဟန်ပဌသည့် ဖလဲ့စည်သပုံတလင် ရရဟိခဲ့သည်။ MDB_val ဖလဲ့စည်သပုံတစ်ခုသို့ ညလဟန်ပဌချက်တစ်ခုသို့ ကာစ်သည် ယေဘုယျအာသဖဌင့် ဟန်ချက်မညီပါ။ တစ်ချိန်တည်သမဟာပင်၊ အချို့သောချစ်ပ်မျာသ၏ဗိသုကာလက်ရာမျာသသည် (iOS တလင်၊ ၎င်သသည် armv7 ဖဌစ်သည်) သည် မည်သည့်ဒေတာ၏လိပ်စာသည် စက်စကာသလုံသအရလယ်အစာသ၏ အကဌိမ်ရေဖဌစ်ရန် လိုအပ်သည် (armv7 အတလက်၊ ဒါက 32 bits)။ တနည်သအာသဖဌင့် အော်ပရေသရဟင်သတစ်ခုလိုပါပဲ။ *(int *foo)0x800002 ၎င်သတို့အပေါ် လလတ်မဌောက်ရန် ညီမျဟပဌီသ စီရင်ချက်ဖဌင့် သေဒဏ်ပေသသည်။ EXC_ARM_DA_ALIGN. ဒီလိုဝမ်သနည်သစရာကောင်သတဲ့ ကံကဌမ္မာကို ရဟောင်ဖို့ နည်သလမ်သနဟစ်သလယ်ရဟိပါတယ်။

ပထမတစ်ခုကတော့ အချက်အလက်တလေကို သိထာသတဲ့-aligned structure ထဲကို ကူသယူဖို့ပါပဲ။ ဥပမာအာသဖဌင့်၊ စိတ်ကဌိုက်နဟိုင်သယဟဉ်မဟုတစ်ခုတလင်၊ ၎င်သကိုအောက်ပါအတိုင်သထင်ဟပ်စေမည်ဖဌစ်သည်။

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

အခဌာသနည်သလမ်သတစ်ခုသည် ရည်ညလဟန်သချက်တစ်ခုအသုံသပဌု၍ သော့နဟင့်တန်ဖိုသရဟိသော ဖလဲ့စည်သပုံမျာသကို ပေါင်သစပ်၍မရကဌောင်သ ကလန်ပလီလာကို ကဌိုတင်အကဌောင်သကဌာသရန်ဖဌစ်သည်။ aligned(1). ARM တလင် အလာသတူအကျိုသသက်ရောက်မဟုရဟိနိုင်သည်။ အောင်မဌင်ရန် ထုပ်ပိုသထာသသော attribute ကိုအသုံသပဌုပါ။ ၎င်သသည် ဖလဲ့စည်သပုံဖဌင့် သိမ်သပိုက်ထာသသော အာကာသကို ပိုမိုကောင်သမလန်အောင် လုပ်ဆောင်ရာတလင်လည်သ အထောက်အကူဖဌစ်စေသည်ဟု ယူဆပါက၊ ကနည်သလမ်သသည် ကျလန်ုပ်အတလက် ပိုကောင်သသည်ဟု ထင်ရသော်လည်သ၊ прОвПЎОт ဒေတာဝင်ရောက်လည်ပတ်မဟုကုန်ကျစရိတ်ကို တိုသမဌဟင့်ရန်။

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

အပိုင်သအခဌာသမေသခလန်သမျာသ

မဟတ်တမ်သအုပ်စုတစ်စုကို ထပ်တလဲလဲပဌုလုပ်ရန်၊ LMDB သည် cursor abstraction ကိုပေသသည်။ ကျလန်ုပ်တို့နဟင့်ရင်သနဟီသပဌီသသာသ အသုံသပဌုသူ cloud မက်တာဒေတာပါသည့် ဇယာသတစ်ခု၏နမူနာကို အသုံသပဌု၍ ၎င်သနဟင့် မည်သို့လုပ်ဆောင်ရမည်ကို ကဌည့်ကဌပါစို့။

လမ်သညလဟန်တစ်ခုရဟိ ဖိုင်မျာသစာရင်သကို ပဌသခဌင်သ၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊ ၎င်သ၏ ကလေသဖိုင်မျာသနဟင့် ဖိုင်တလဲမျာသ ဆက်စပ်နေသည့် သော့အာသလုံသကို သင်ရဟာဖလေရန် လိုအပ်သည်။ ယခင်အပိုင်သခလဲမျာသတလင် ကျလန်ုပ်တို့သည် သော့မျာသကို စီထာသသည်။ NodeKey ထို့ကဌောင့် ၎င်သတို့ကို ၎င်သတို့၏ ပင်မလမ်သညလဟန် ID ဖဌင့် ညသစလာ အမိန့်ပေသသည်။ ထို့ကဌောင့် နည်သပညာအရ၊ ဖိုင်တလဲတစ်ခု၏ အကဌောင်သအရာမျာသကို ရယူခဌင်သ၏တာဝန်မဟာ ကီသအုပ်စု၏အပေါ်ပိုင်သဘောင်တလင် ကာဆာကို ပေသထာသသည့်ရဟေ့ဆက်တစ်ခုဖဌင့် ကာဆာကို နေရာချကာ နောက်တလင် အောက်ဘက်နယ်နိမိတ်ကို ထပ်ကာထပ်ကာ ပဌုလုပ်ခဌင်သဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

စဉ်ဆက်မပဌတ်ရဟာဖလေခဌင်သဖဌင့် အထက်ပိုင်သ "နဖူသပေါ်" ကို သင်တလေ့နိုင်သည်။ ထိုသို့လုပ်ဆောင်ရန်၊ ဒေတာဘေ့စ်ရဟိ သော့မျာသစာရင်သတစ်ခုလုံသ၏အစတလင် ကာဆာကို ချထာသပဌီသနောက် ပင်မလမ်သညလဟန်အမဟတ်အသာသပါသော သော့ကို ၎င်သအောက်တလင် ပေါ်လာသည်အထိ တိုသမဌဟင့်ထာသသည်။ ကချဉ်သကပ်မဟုတလင် သိသာထင်ရဟာသသော အာသနည်သချက် ၂ ခုရဟိသည်။

  1. ရဟာဖလေမဟု၏မျဉ်သဖဌောင့်ရဟုပ်ထလေသမဟုသည် သင်သိသည့်အတိုင်သပင်၊ ယေဘုယျအာသဖဌင့် သစ်ပင်မျာသနဟင့် အထူသသဖဌင့် B-tree တလင်၊ ၎င်သကို logarithmic အချိန်အတလင်သ လုပ်ဆောင်နိုင်သည်။
  2. အချည်သနဟီသပါပဲ၊ လိုချင်တဲ့ စာမျက်နဟာတလေထက် စာမျက်နဟာအာသလုံသကို ဖိုင်ကနေ ပင်မမဟတ်ဉာဏ်ဆီ မဌဟင့်တင်ပေသတယ်၊ အလလန်စျေသကဌီသတယ်။

ကံကောင်သထောက်မစလာ၊ LMDB API သည် cursor ကို အစပိုင်သတလင် နေရာချထာသရန် ထိရောက်သောနည်သလမ်သကို ပံ့ပိုသပေသပါသည်။ ၎င်သကိုလုပ်ဆောင်ရန်၊ ကဌာသကာလ၏ အပေါ်ဘက်ဘောင်တလင်ရဟိသော သော့ထက်နည်သသော သို့မဟုတ် ညီမျဟသည်ဟုသိရသော သော့တစ်ခုဖလဲ့စည်သရန်လိုအပ်ပါသည်။ ဥပမာအာသဖဌင့်၊ အထက်ပုံတလင်ရဟိသောစာရင်သနဟင့်စပ်လျဉ်သ၍ အကလက်ဖဌစ်သည့် သော့တစ်ခုကို ကျလန်ုပ်တို့ပဌုလုပ်နိုင်ပါသည်။ parentId 2 နဟင့် ညီမျဟမည်ဖဌစ်ပဌီသ ကျန်အာသလုံသသည် သုညနဟင့် ပဌည့်စုံမည်ဖဌစ်သည်။ ထိုကဲ့သို့ တစ်စိတ်တစ်ပိုင်သ ဖဌည့်ထာသသောသော့ကို လုပ်ဆောင်ချက်၏ ထည့်သလင်သမဟုတလင် ဖဌည့်သလင်သသည်။ mdb_cursor_get လည်ပတ်မဟုကိုညလဟန်ပဌသည်။ 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);

သော့အုပ်စု၏ အပေါ်ဘက်ဘောင်ကို ရဟာတလေ့ပါက၊ ကျလန်ုပ်တို့ တလေ့ဆုံမည် သို့မဟုတ် အခဌာသသော့ဖဌင့် မတလေ့မချင်သ ၎င်သကို ထပ်လောင်သပါ။ parentIdဒါမဟမဟုတ် သော့တလေ လုံသဝကုန်သလာသမဟာမဟုတ်ဘူသ.

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

mdb_cursor_get ကို အသုံသပဌု၍ ထပ်ခါထပ်ခါ ပဌုလုပ်ခဌင်သ၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့် ကျလန်ုပ်တို့သည် သော့သာမက တန်ဖိုသကိုလည်သ ရရဟိပါသည်။ ရလေသချယ်မဟုအခဌေအနေမျာသကို ဖဌည့်ဆည်သရန်အတလက်၊ အခဌာသအရာမျာသထဲမဟ၊ မဟတ်တမ်သ၏တန်ဖိုသ-အစိတ်အပိုင်သမျာသမဟ ကလက်လပ်မျာသကို စစ်ဆေသရန် လိုအပ်ပါက၊ ၎င်သတို့သည် အပိုအမူအရာမျာသမပါဘဲ ၎င်သတို့ကိုယ်တိုင် ဝင်ရောက်နိုင်မည်ဖဌစ်သည်။

၄.၃။ ဇယာသမျာသကဌာသ ဆက်ဆံရေသကို ပုံဖော်ခဌင်သ။

ယနေ့အထိ၊ ကျလန်ုပ်တို့သည် single-table database ဖဌင့် ဒီဇိုင်သရေသဆလဲခဌင်သနဟင့် လုပ်ဆောင်ခဌင်သဆိုင်ရာ ကဏ္ဍအာသလုံသကို သုံသသပ်နိုင်ခဲ့သည်။ ဇယာသတစ်ခုသည် အမျိုသအစာသတူသော သော့တန်ဖိုသအတလဲမျာသ ပါဝင်သော အမျိုသအစာသခလဲထာသသော မဟတ်တမ်သအစုတစ်ခုဖဌစ်သည်ဟု ကျလန်ုပ်တို့ပဌောနိုင်သည်။ အကယ်၍ သင်သည် သော့ကို ထောင့်မဟန်စတုဂံအဖဌစ်နဟင့် ၎င်သ၏ဆက်စပ်တန်ဖိုသကို အကလက်တစ်ခုအဖဌစ် ပဌသပါက၊ သင်သည် ဒေတာဘေ့စ်၏ ရုပ်ပုံကာသချပ်တစ်ခုကို သင်ရရဟိမည်ဖဌစ်သည်။

​

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

သို့သော် လက်တလေ့ဘဝတလင် ကမျဟလောက် သလေသနည်သနည်သဖဌင့် ဖဌတ်သန်သရန် မဖဌစ်နိုင်ပေ။ ဒေတာဘေ့စ်တစ်ခုတလင် မကဌာခဏဆိုသလို၊ ပထမညသစလာ၊ ဇယာသအမျာသအပဌာသရဟိရန်၊ ဒုတိယအချက်မဟာမူလကီသနဟင့်မတူသောအစီအစဥ်အရ ၎င်သတို့တလင်ရလေသချယ်မဟုမျာသကိုလုပ်ဆောင်ရန် လိုအပ်ပါသည်။ ကနောက်ဆုံသအပိုင်သကို ၎င်သတို့၏ ဖန်တီသမဟုနဟင့် အပဌန်အလဟန်ချိတ်ဆက်မဟုဆိုင်ရာ ပဌဿနာမျာသအတလက် အာရုံစိုက်ထာသသည်။

အညလဟန်သဇယာသမျာသ

cloud အက်ပ်တလင် "ပဌခန်သ" ကဏ္ဍတစ်ခု ရဟိသည်။ ၎င်သသည် ရက်စလဲအလိုက်စီထာသသော cloud တစ်ခုလုံသမဟ မီဒီယာအကဌောင်သအရာကို ပဌသသည်။ ထိုသို့သောရလေသချယ်မဟုကို အကောင်သဆုံသအကောင်အထည်ဖော်ရန်အတလက် ပင်မဇယာသဘေသတလင်၊ သော့အမျိုသအစာသအသစ်ဖဌင့် နောက်ထပ်တစ်ခုကို ဖန်တီသရန် လိုအပ်ပါသည်။ ၎င်သတို့တလင် ဖိုင်ကိုဖန်တီသသည့်နေ့စလဲပါရဟိသည့် အကလက်တစ်ခုပါရဟိမည်ဖဌစ်ပဌီသ၊ ၎င်သတလင် ပင်မတန်သစီခဌင်သစံနဟုန်သအဖဌစ် လုပ်ဆောင်မည်ဖဌစ်သည်။ သော့အသစ်မျာသသည် အရင်သခံဇယာသရဟိ သော့မျာသနဟင့် တူညီသောဒေတာကို ရည်ညလဟန်သသောကဌောင့် ၎င်သတို့ကို အညလဟန်သကီသမျာသဟုခေါ်သည်။ ၎င်သတို့ကို အောက်ပါပုံတလင် လိမ္မော်ရောင်ဖဌင့် မီသမောင်သထိုသပဌထာသသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

တူညီသောဒေတာဘေ့စ်အတလင်သ မတူညီသောဇယာသမျာသ၏သော့မျာသကို ခလဲထုတ်ရန်အတလက်၊ ၎င်သတို့အာသလုံသတလင် အပိုနည်သပညာဆိုင်ရာနယ်ပယ် tableId ကို ထည့်သလင်သထာသသည်။ စီစဥ်ခဌင်သအတလက် အမဌင့်ဆုံသညသစာသပေသအဖဌစ် ပဌုလုပ်ခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ကိုယ်ပိုင်စည်သမျဉ်သမျာသနဟင့်အညီ သော့မျာသကို ဇယာသမျာသဖဌင့် ညသစလာအုပ်စုဖလဲ့ကာ ဇယာသမျာသအတလင်သ၌ ရဟိပဌီသဖဌစ်သည်။

အညလဟန်သကီသသည် အဓိကသော့ကဲ့သို့ တူညီသောဒေတာကို ရည်ညလဟန်သသည်။ ပင်မသော့၏တန်ဖိုသ၏အစိတ်အပိုင်သတစ်ခုနဟင့် ချိတ်ဆက်ခဌင်သဖဌင့် ကပိုင်ဆိုင်မဟု၏ ရိုသရဟင်သသောအကောင်အထည်ဖော်မဟုသည် တစ်ကဌိမ်တည်သတလင် မျာသစလာသောရဟုထောင့်မဟ အသင့်လျော်ဆုံသဖဌစ်သည်-

  1. အာကာသကို သိမ်သပိုက်ထာသသည့် ရဟုထောင့်မဟကဌည့်လျဟင် မက်တာဒေတာသည် အလလန်ကဌလယ်ဝနိုင်သည်။
  2. စလမ်သဆောင်ရည်ရဟုထောင့်မဟနေ၍ node မက်တာဒေတာကို အပ်ဒိတ်လုပ်သောအခါတလင်၊ သင်သည် သော့နဟစ်ခုကို ထပ်ရေသရမည်ဖဌစ်ပါသည်။
  3. ကုဒ်ပံ့ပိုသမဟု၏ရဟုထောင့်မဟကဌည့်လျဟင်၊ ကျလန်ုပ်တို့သည် သော့တစ်ခုအတလက် ဒေတာကို မလမ်သမံရန်မေ့သလာသပါက သိုလဟောင်မဟုတလင် ဒေတာမညီညလတ်မဟု သိမ်မလေ့သော ချို့ယလင်သချက်တစ်ခု ရရဟိမည်ဖဌစ်သည်။

ဆက်လက်၍ ကချို့ယလင်သချက်မျာသကို မည်သို့ဖယ်ရဟာသရမည်ကို ကျလန်ုပ်တို့စဉ်သစာသပါမည်။

ဇယာသမျာသအကဌာသဆက်ဆံရေသအဖလဲ့အစည်သ

ပုံစံသည် အညလဟန်သဇယာသတစ်ခုကို ပင်မတစ်ခုနဟင့် ချိတ်ဆက်ရန်အတလက် ကောင်သမလန်သင့်လျော်သည်။ "သော့တန်ဖိုသအတိုင်သ". ၎င်သ၏အမည်ဖော်ပဌသည့်အတိုင်သ အညလဟန်သမဟတ်တမ်သ၏တန်ဖိုသသည် ပင်မသော့တန်ဖိုသ၏မိတ္တူဖဌစ်သည်။ ကနည်သလမ်သသည် မူလမဟတ်တမ်သ၏ တန်ဖိုသအပိုင်သကို သိမ်သဆည်သခဌင်သနဟင့် ဆက်စပ်နေသော အထက်ဖော်ပဌပါ အာသနည်သချက်အာသလုံသကို ဖယ်ရဟာသပေသပါသည်။ တစ်ခုတည်သသောအခကဌေသငလေမဟာ index key မဟတန်ဖိုသကိုရယူရန်၊ တစ်ခုအစာသ database သို့ queries 2 ခုပဌုလုပ်ရန်လိုအပ်ပါသည်။ ဇယာသကလက်အရ ထလက်ပေါ်လာသော database schema မဟာ အောက်ပါအတိုင်သဖဌစ်သည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ဇယာသမျာသကဌာသ ဆက်ဆံရေသကို စီစဉ်ခဌင်သအတလက် နောက်ထပ်ပုံစံတစ်ခုဖဌစ်သည်။ "မလိုတော့သောသော့". ၎င်သ၏အနဟစ်သာရမဟာ အမျိုသအစာသခလဲရန်မလိုအပ်ဘဲ ဆက်စပ်သော့ကိုပဌန်လည်ဖန်တီသရန်အတလက် သော့အာသ ထပ်လောင်သဂုဏ်သတ္တိမျာသထည့်ရန်ဖဌစ်ပါသည်။သို့သော် Mail.ru Cloud အပလီကေသရဟင်သတလင်၎င်သ၏အသုံသပဌုမဟုအစစ်အမဟန်ဥပမာမျာသရဟိပါသည်။ သတ်မဟတ်ထာသသော iOS မူဘောင်မျာသ၏ ဆက်စပ်မဟု၊ စိတ်ကူသယဉ်ဆန်သော၊ သို့သော် ပိုမိုနာသလည်နိုင်သော ဥပမာတစ်ခုပေသပါမည်။

Cloud မိုဘိုင်သ သုံသစလဲသူမျာသတလင် အသုံသပဌုသူ အခဌာသသူမျာသနဟင့် မျဟဝေထာသသည့် ဖိုင်မျာသနဟင့် ဖိုင်တလဲမျာသအာသလုံသကို ပဌသသည့် စာမျက်နဟာတစ်ခု ရဟိသည်။ ထိုသို့သောဖိုင်မျာသအတော်လေသနည်သပါသပဌီသ ၎င်သတို့နဟင့်ဆက်စပ်နေသော လူသိရဟင်ကဌာသဖော်ပဌခဌင်သဆိုင်ရာ တိကျသောအချက်အလက်မျာသစလာရဟိသောကဌောင့် (မည်သူ့ကိုဝင်ရောက်ခလင့်၊ မည်သည့်အခလင့်အရေသမျာသနဟင့်အတူ)၊ ၎င်သကိုတန်ဖိုသ၏အစိတ်အပိုင်သဖဌင့်ဝန်ထုပ်ဝန်ပိုသဖဌစ်စေမည်မဟုတ်ပါ။ ပင်မဇယာသတလင်ပါဝင်မဟု။ သို့သော်၊ သင်သည် ထိုကဲ့သို့သောဖိုင်မျာသကို အော့ဖ်လိုင်သပဌသလိုပါက၊ ၎င်သကို တစ်နေရာရာတလင် သိမ်သဆည်သထာသရန် လိုအပ်သေသသည်။ သဘာဝဖဌေရဟင်သချက်တစ်ခုသည် ၎င်သအတလက် သီသခဌာသဇယာသတစ်ခု ဖန်တီသရန်ဖဌစ်သည်။ အောက်ဖော်ပဌပါပုံတလင်၊ ၎င်သ၏သော့ကို "P" ဖဌင့်ရဟေ့ဆက်ထာသပဌီသ "propname" placeholder ကို ပိုမိုတိကျသောတန်ဖိုသ "public info" ဖဌင့် အစာသထိုသနိုင်ပါသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

ဇယာသအသစ်ကို ဖန်တီသခဲ့ခဌင်သအတလက် ထူသခဌာသသော မက်တာဒေတာအာသလုံသကို မဟတ်တမ်သ၏တန်ဖိုသသို့ ရလဟေ့ထာသသည်။ တစ်ချိန်တည်သမဟာပင်၊ ပင်မဇယာသတလင် သိမ်သဆည်သထာသပဌီသဖဌစ်သော ဖိုင်မျာသနဟင့် ဖိုင်တလဲမျာသအကဌောင်သ ဒေတာကို မပလာသချင်ပါ။ ယင်သအစာသ၊ မလိုအပ်သောဒေတာကို "node ID" နဟင့် "timestamp" အကလက်ပုံစံဖဌင့် "P" သော့သို့ ပေါင်သထည့်သည်။ ၎င်သတို့အာသ ကျေသဇူသတင်စလာဖဌင့်၊ သင်သည် အဓိကသော့ကို သင်ရနိုင်သဖဌင့် အညလဟန်သကီသတစ်ခုကို တည်ဆောက်နိုင်ပဌီသ၊ ယင်သဖဌင့် နောက်ဆုံသတလင် node ၏ metadata ကို သင်ရနိုင်မည်ဖဌစ်သည်။

နိဂုံသ

ကျလန်ုပ်တို့သည် LMDB အကောင်အထည်ဖော်မဟုရလဒ်မျာသကို အပဌုသဘောဖဌင့် အကဲဖဌတ်ပါသည်။ ၎င်သပဌီသနောက်၊ အပလီကေသရဟင်သအေသခဲခဌင်သအရေအတလက် 30% လျော့ကျသလာသသည်။

iOS အပလီကေသရဟင်သမျာသရဟိ သော့တန်ဖိုသဒေတာဘေ့စ် LMDB ၏ ထက်မဌက်မဟုနဟင့် ဆင်သရဲနလမ်သပါသမဟု

လုပ်ဆောင်ခဲ့သော ရလဒ်မျာသသည် iOS အဖလဲ့အပဌင်ဘက်တလင် တုံ့ပဌန်မဟုတစ်ခု တလေ့ရဟိခဲ့သည်။ လောလောဆယ်တလင်၊ Android အပလီကေသရဟင်သရဟိ အဓိက "Files" ကဏ္ဍမျာသထဲမဟတစ်ခုသည် LMDB ကိုအသုံသပဌုပဌီသ အခဌာသအပိုင်သမျာသလည်သ လုပ်ဆောင်နေပါသည်။ သော့တန်ဖိုသ သိုလဟောင်မဟုကို အကောင်အထည် ဖော်သည့် C ဘာသာစကာသသည် အက်ပ်လီကေသရဟင်သကို C++ ဘာသာစကာသဖဌင့် ဖဌတ်ကျော်သည့် ပလပ်ဖောင်သကို အစပိုင်သတလင် ပေါင်သစပ်ပဌုလုပ်နိုင်ရန် အထောက်အကူကောင်သတစ်ခုဖဌစ်သည်။ Objective-C နဟင့် Kotlin ရဟိ ပလက်ဖောင်သကုဒ်ဖဌင့် ထလက်ပေါ်လာသော C ++ စာကဌည့်တိုက်၏ ချောမလေ့စလာချိတ်ဆက်မဟုအတလက်၊ ကုဒ်ထုတ်လုပ်သူအာသ အသုံသပဌုခဲ့သည်။ Djinni Dropbox မဟ၊ သို့သော် ၎င်သသည် အခဌာသဇာတ်လမ်သဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add