2019 áá¯ááŸá
Ạáá±á¬ááºážáŠážááœááºá Mail.ru Cloud iOS á¡ááœá²á·ááœáẠááŒá¬ááŸááºá
áœá¬ á
á±á¬áá·áºáá»áŸá±á¬áºáá²á·áá±á¬ ááŒá
áºáááºáá
áºáᯠááŒá
áºááœá¬ážáá²á·áááºá á¡ááá®áá±ážááŸááºážá¡ááŒá±á¡áá±á ááŒá²ááŒá¶á
áœá¬ááá¯ááŸá±á¬ááºááŸá¯á¡ááœáẠá¡ááááá±áá¬áá±á·á
áºááẠááá¯ááá¯ááºážáá±á¬áá¡ááœáẠá¡ááœááºáá°ážááŒá¬ážáááºážááŒá¬ážáá¬áááºá
á¡ááŒá±á¬ááºážá¡áá¬
á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ Motivation LMDB áá±áá¬áá»áá¬ážááŒááºážá áá±ááá«áž LMDB áá¯á¶ážáá±á¬ááº
3.1 ááá±ááá«áž #áá Memory-mapping ááá¯ááºáá»á¬áž
3.2 ááá±ááá«áž #áá B+-áá áºáááº
3.3 ááá±ááá«áž #áá copy-on-write áá±á¬á·áááºááá¯áž API áááááºááœáẠáá±áá¬á¡á á®á¡á ááºáá áºáá¯ááᯠáá®ááá¯ááºážááœá²ááŒááºážá
4.1 áá¡ááŒá±áᶠabstractions
4.2 áTable Modeling
4.3 áááá¬ážáá»á¬ážá¡ááŒá¬áž áááºáá¶áá±ážááᯠáá¯á¶áá±á¬áºááŒááºážá
1. á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ á á±á·áá±á¬áºááŸá¯
áá
áºááŸá
áºáá»áŸááºáá
áºááŒáááºá 2015 áá¯ááŸá
áºááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá¡ááá®áá±ážááŸááºážáá¡ááºáá¬áá±á·á
áºááẠáááºáá»áŸááŒá¬ááŒá¬ ááŸá±ážááœá±ážáá±áááºááᯠááá¯ááŒá¯áá²á·áá«áááºá áá«ááá¯áá² áá«ááá¯á·áá¯ááºáá²á·áá¬ááá¯ááºáá°ážá áá
áºáá«áá
áºáá¶ááœáẠá¡ááá®áá±ážááŸááºážááẠá¡áá¯á¶ážááŒá¯áá°ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯á¶á·ááŒááºááŸá¯áááºááá·áºááœá¬ážáááº- ááá¯ááºáá»á¬ážááá¯áááŸáááºáá á
á¬áááºážáá»á¬ážáááœáŸá±á·ááŒááºážá
áááºááá¯á·ááŸáá·áº áááºáááºá áá»áœááºá¯ááºááá¯á·ááœáẠááá¯ááºááŒá¬ážááŸá¯áá»á¬áž ááá¯áá»á¬ážáá¬áá«áááºá ááá¯ááºážáá¬ááŸá¯á
ááºááŒááºáá»á¬ážá¡ááŒá±á¬ááºáž
ááá¯ááºážáá¬ááŸá¯ááááºáá»á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡á±ážááŒáá±á¬áá±áá»áá¯ážááŸá¯ááŒá
áºáá¬áá²á·áááºá á¡á±ážáá²ááŒááºážááŒá±á¬áá·áº ááŒá
áºáá±á«áºáá¬áá±á¬ ááŒá¿áá¬áá»á¬ážááẠá¡ááŒá¬ážáááºááá·áºá¡áá¬áá»á¬ážáááºáááᯠááá¯ááá¯áá»á¬ážááŒá¬ážááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá á¡áááºá á€á¡áá»ááºááᯠááá±á¬ááá±á«ááºáá®á á¡áááºá¡ááœá±ážá áááºááááºážááá¬ááá¯ááºáᬠááœáŸááºááŒáá»ááºááẠáá»ááºá
á®ážááŸá¯ áááºážáááºááá¯áá«áá ááá¯á·áá±á¬áẠá¡á¬áá¯á¶á
áá¯ááºááŒá®ážáá±á¬ááº
áá±á¬ááºááŒá®ážááŸ
á áá áºá¡ááœá²á·á¡á ááºážá áá¬ááºáá±á¬ááºáá¯á¶á á¶á Multithreading ááẠáááºážááá¯áááá¡ááŸá áºáá¬áááŒá áºáá¬áááºáᯠáá°ááááºá áááºážááœááºááŸááá±á¬ á¡áá¬ááá¹áá¯áá»á¬ážááẠáá»ááºá ááºážáá»ááºážáá»á¬ážááᯠááŒááºáá»á±á¬áºááááá¯áá»áá¯ážá ááŒá®ážáá±á¬á· áá°ááá¯á·á áá«ááᯠáá áºáá«ááá±áá²á· ááá»áá¯á·áá±áá¬ááœá±ááŸá¬ ááá¯ááºáááºáá±ááá·áº á¡ááŒá²ááá¯ááᯠáá±áá¬ááá¯ááºážááá¯ááᯠáá¯ááºáááºá
áá±áá¬áá±á·á
áºááẠáááºááŒáá¬ážáá±á¬ áá¯á¶ááŒááºážááœáẠá¡á¯ááºááŒá
áºáá»áá±á¬ á¡á
áááºá¡ááá¯ááºážáá»á¬ážáá²á០áá
áºáá¯ááŒá
áºáááºá áááºážá á¡ááááá¬áááºááŸá¬ áááºáááá¯áá¯á¶á
á¶áá
áºáá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºááŒá
áºáááºá
áá±áá¬áá±á·á
áºááœá±ážáá»ááºááŸá¯ááᯠááœáŸááºážááá¯ážááá·áº áá¯áááá¡áá±ážááŒá®ážáá±á¬á¡áá»ááºááŸá¬ áá»áœááºá¯ááºááá¯á·á cloud API ááŒá
áºáááºá áá
áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááŒááºážá¡ááœáẠgit áá»ááºážáááºááŸá¯á០ááŸá¯á¶á·áá±á¬áºááŸá¯áá¶áá²á·ááááºá áá°á·ááá¯áá² áá»áœááºáá±á¬áºááá¯á· áááºááœááºáá«áááºá
ááá¯á·ááŒá±á¬áá·áº 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 áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºááŸá¯ááŒá áºáááºá
á¡ááŒá¬ážááá¯á¡ááºáá»ááºáá»á¬ážááẠááá¯ážáá¬áááºážáá»á¬ážááŒá áºááŒá®áž áááºážááá¯á·áá á¬áááºážá¡ááŒáá·áºá¡á á¯á¶ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
- áá»ááºááœááºá
- á¡áá»áá¯ážáá»áá¯ážáá¯ááºáá±á¬ááºááŒááºážá threads áá»á¬ážááŒá¬ážáá¬áá áááºáá¡ááá®áá±ážááŸááºážááŸáá·áº iOS extension áá»á¬ážááŒá¬ážááœááºáááºáž áá°áá®áá±á¬áá±áá¬áá±á·á áºá¥ááá¬ááᯠá¡áá¯á¶ážááŒá¯ááá¯áá±á¬ááá¹áááŒáá·áº ááœáŸááºááŒá¬ážáá¬ážáááºá
- áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ á¡áá¬áá»á¬ážá¡ááŒá Ạááááºážáááºážáá¬ážáá±á¬ á¡áá¬áá»á¬ážááᯠááá¯ááºá á¬ážááŒá¯ááá¯ááºá áœááºáž
- CRUD áá¯ááºáááºážáá»á¬ážá¡ááœááºáž ááá¯ááºážááá áºááœá²áá±ááŸá¯ áááŸáááŒááºážá
- á¡ááŒá±áá¶ááá¯ááºááá¯ááºááŸá¯áá»á¬ážá¡ááœáẠááœá±áá±ážááœá±áá°áá¶á·ááá¯ážááŸá¯
á¡ááºáá Ạá¡áááá áá¬ážáá¯á¶ážáá»á¬áž- á¡áá¯ááŒá°á áœááºážá¡á¬ážá áá®ááœááºááŸá¯á á¡áá®ážáá»ááºááŸá¯ááŸáá·áº áá¯á¶ááŒááºá áááºáá»áááŸá¯á - á¡ááŸáááºá¡áá¯ááºááœáẠáá±áááºážá¡á á¬ážáá¯á¶ážááá á¹á áá»á¬ážá
á€ááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áºá¡áá° SQLite ááẠáá±á¬ááºážááœááºáá±á¬ááœá±ážáá»ááºááŸá¯áá
áºáá¯á¡ááŒá
ẠááŸááá±áá±ážáááºá ááá¯á·áá±á¬áº á¡ááŒá¬ážááœá±ážáá»ááºá
áá¬áá»á¬ážááᯠáá±á·áá¬ááŒááºážá áá
áºá
áááºáá
áºááá¯ááºážá¡áá±ááŒáá·áº áá»áœááºáá±á¬áºááẠá
á¬á¡á¯ááºáá
áºá¡á¯ááºááᯠááœá±á·ááŸááá²á·áááºá
2. LMDB áá±áá¬áá»áá¬ážááŒááºážá
LMDB ááẠáá±áá¬áá±á·á áºáá»á¬ážá á¡ááŒá±áá¶á¡áá»áá¯á¶áž á¡ááœáŸá¬ - ááá¯ááŸá±á¬ááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº á¡ááœááºáá±ážáááºáá±á¬ (ááK ááá¯ááºážáá»á¬áž) á á¬ááŒáá·áºááá¯ááºáá áºáá¯ááŒá áºáááºá
á¡áááºáá±á¬áºááŒáá« áá¯á¶ááŒááºážááœáẠLMDB ááŸáá·áº ááá¯ááááºá¡ááá·áºááŒáá·áºáá±á¬ á¡ááá·áºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá±ážááá·áº SQLite ááŸáá·áº ááŸáá¯ááºážááŸááºááŒááºážááẠáá±áá¯áá»á¡á¬ážááŒáá·áº Core Data ááŸáá·áº SQLite ááẠááá¯ááŸááºáááºááá¯ááºááŒá±á¬ááºáž ááŒááááºá BerkeleyDBá LevelDBá Sophiaá RocksDB á
áááºááŒáá·áº áá°áá®áá±á¬ ááá¯ááŸá±á¬ááºááŸá¯á¡ááºáá»ááºáá»á¬ážááᯠáá°áá®áá±á¬ ááŒáá¯ááºáááºáá»á¬ážá¡ááŒá
Ạááá¯ážáá¬ážááŒááºážááẠááá¯áááá¬ážáá»áŸááá±áááá·áºáááºá LMDB ááẠSQLite á¡ááœáẠááá¯ááŸá±á¬ááºááŸá¯á¡ááºáá»áẠá¡á
áááºá¡ááá¯ááºážáá
áºáá¯á¡ááŒá
Ạáá¯ááºáá±á¬ááºááá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá»á¬ážááẠááŸááá«áááºá 2012 áá¯ááŸá
áºááŸá¬ ááááá¯á¶áž á
ááºážáááºááŸá¯áá«á
LMDB áá¡áááá¡áá¯á¶ážááŒá¯ááŸá¯ááẠapplication databases á¡ááœááºá¡ááºáá»ááºáá
áºáá¯ááŒá
áºáááºá á
á¬ááŒáá·áºááá¯ááºááẠáá±á¬á·ááºáá²áá±ážáá¬ážáá°áá»á¬ážá¡ááœáẠáááºážááá¯á¶áááºážááá¹áá¬ááºááᯠáá±ážáá±á¬ááºáá«áááºá
LMDB ááᯠááá¯ááŸá±á¬ááºááŸá¯á¡ááŒá
áºáááºáž áááŒá¬ááá¡áá¯á¶ážááŒá¯áááºá á¥ááá¬á¡á¬ážááŒáá·áºá Mozilla Firefox ááá±á¬ááºáá¬
á¡ááºáá»ááºááẠááá¯ááá¯ááºážááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážáá±á¬áááœáẠáááºážá
á¬ážááá¯ááºáá²á·áááºá áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááŒá±áá¬áá»á¬ážááŒá
áºááá¯ááºáááºá
LMDB ááẠOracle áááááºážáá»á¯ááºááŸá¯á¡á±á¬ááºááœááºá¡áá°ážá¡ááŒá±á¬ááºážááŒá®ážáá±á¬áẠBerkeleyDB ááŸáá¬ážáá²á·áá±á¬áá±áá±á¬ááºá¡á±á¬ááºááœááºáá±áá¬áá
áºáá¯á¡ááœááºá¡á±á¬ááºááŒááºá
áœá¬ááá¯ááºááœá²áááºáá±áááºá á
á¬ááŒáá·áºááá¯ááºááẠáááºážáááá¯ááºááá¯ááºá¡áá»áá¯ážá¡á
á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºáá»áŸááºááẠáááºážáááŒááºááŸá¯ááºážááŸáá·áº áá¯á¶ááŒááºá
áááºáá»áááŸá¯á¡ááœáẠááŸá
áºáááºáááºá áááºááááá·áºá¡ááá¯ááºážá á¡ááá²á·áá±á·áááºá
á¬áá»á¬ážáááŸááá«á LMDB ááŸáá·áº SQLite ááá¯ááœá±ážáá»ááºáá¬ááœááºáááºáááºááá¯ááºáááá·áºá¡áá±ážá¡áá°ááá¯á¡áá±ážáá±ážáá±á¬áºááŒááá¯áá«áááºá á¡áááºáá±á¬áºááŒáá« áá¯á¶ááŒááºážááẠááá¯ážááŒáŸáá·áºáá¬ážáá±á¬ ááŒááºááŸá¯ááºážááᯠáááºááá¯á·á¡á±á¬ááºááŒááºááŒá±á¬ááºáž ááŸááºážáááºážá
áœá¬ ááŒááá¬ážáááºá ááááŠážá
áœá¬á áá»áœááºá¯ááºááá¯á·ááẠdisk ááá¯ááŸá±á¬ááºááŸá¯á¡áá±á«áºááŸá áá±á¬ááºááẠabstraction á¡ááœáŸá¬áá»á¬ážá¡ááœáẠááá±ážáá»á±áá«á áá¯ááºáá«áááºá áá±á¬ááºážááœááºáá²á· áááá¯áá¬áááºáá¬áá
áºáá¯ááŸá¬á á¡á²áá«ááœá±ááá«áá² áááºááá¯ááºááá¯ááºáá±ážáá²á áá°ááá¯á·á á¡ááá®áá±ážááŸááºážáá¯ááºááŸá¬ áááœáŸá²áááŸá±á¬ááºáᬠáá±á«áºáá¬áááá·áºáááºá áá«áá±ááá·áº áá°ááá¯á·á ááá¯áá«ážááœá¬ážáááá·áºáááºá áááºážááá¯á·ááœáẠáá®ážááŒá¬áž á¡ááá®áá±ážááŸááºážáá
áºáá¯á០áááá¯á¡ááºáá±á¬ á¡ááºá¹áá«áááºáá»á¬áž á¥ááᬠSQL áá¬áá¬á
áá¬ážááŸá áá±ážááŒááºážáá»ááºáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ ááŸááááºááá¯ááºáá«á áá¯áááá¡áá±ááŒáá·áºá áááºážááẠdisk ááá¯ááŸá±á¬ááºááŸá¯áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá¡ááœáẠapplication áááºáááºááŸá¯ááŒá±áá¯á¶ááá¯á¡áá±á¬ááºážáá¯á¶ážá¡áá±á¬ááºá¡áááºáá±á¬áºáááºááŒá
áºááá¯ááºáááºá SQLite ááá¯áááº
3. áá±ááá«áž LMDB áá¯á¶ážáá±á¬ááº
ááŸááºáá»ááºáá¯á¶áž ááŒááºááœááºážááá± LMDB ááᯠááŒáá·áºááŒá®ážá ááá¯ááŒá®áž áááºááŸáá¯ááºážááá¯á· á¡áá»áááºáááºáá«ááŒá®á áá±á¬ááºá¡ááá¯ááºážáá¯á¶ážááá¯ááºážááᯠááá¯ááŸá±á¬ááºááŸá¯áááá¯áá¬áá»ááá·áº á¡ááááá±ááá«ážáá»á¬ážá ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááœáẠá¡á¬áá¯á¶á áá¯ááºááœá¬ážáá«áááº-
- áá áºááºááŸáá·áºáá¯ááºáá±á¬ááºáááºááŸáá·áº á¡ááœááºážáá±áá¬áááºáá±á¬ááºáá¯á¶áá»á¬ážááᯠáá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááẠááá¹ááá¬ážáá áºáá¯á¡áá±ááŒáá·áº áááºááá¯áá®-ááŒá±áá¯á¶ááŒá¯áá¯ááºáá¬ážáá±á¬ ááá¯ááºáá»á¬ážá
- B+-tree ááẠááááºážáááºážáá¬ážáá±á¬ áá±áá¬ááœá²á·á ááºážáá¯á¶á á¡ááœá²á·á¡á ááºážáá áºáá¯ááŒá áºáááºá
- ACID á¡áá±á¬ááºážá¡áááºááá¯ááºáᬠáá¯ááºááá¹áááá»á¬ážááŸáá·áº áá¬ážááŸááºážáá»á¬ážá áœá¬ááᯠáá¶á·ááá¯ážáá±ážáááºá¡ááœáẠáá»ááºážáááºááŸá¯áá áºáá¯á¡áá±ááŒáá·áº áá°ážáá°áá±ážáá¬ážááŒááºážá
á.áá áá±ááá«áž #áá Memory-mapping ááá¯ááºáá»á¬áž
Memory-mapped ááá¯ááºáá»á¬ážááẠrepository á¡áááºááŒáá·áºááẠáá±á«áºáá¬ááá·áº á¡áá±ážááŒá®ážáá±á¬ áááá¯áá¬ááŒááºá ááºáá áºáá¯ááŒá áºáááºá ááááºážáááºážáá¬ážáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááá¯á· áááºááŸáºáá»ááŒááºážááŸáá·áº áá áºááŒáá¯ááºáááºážáááºáá±á¬ááºááŒááºážááá¯ááºáᬠááŒá¿áá¬áá»á¬ážááẠáááºáááºááŸá¯á áá áºá ááá¯áá¬ááŒáá·áº áá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬ážááŒá áºáááºá LMDB ááœáẠáááºááá·áº áááºááŸáºáá»á¬áž ááá«áááºáá«á ááŒá±áá¯á¶ááœá²áá¬ážáá±á¬ááá¯ááºáá»á¬ážá០áá±áá¬áá»á¬ážááᯠááá¯ááºááá¯ááºáááºááŸá¯ááŒááºážááŒáá·áº á¡ááºáá»ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ááœáẠáá±á¬áá·áºáá»á¬ážá áœá¬ááᯠááŒááºáá±á¬ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº á€áááºááŸá¬ á á¬áá±ážáá°á áááááŸááá¯á¶ážááŒááºáá»ááºáá áºáá¯ááŒá áºáááºá á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáááºááŸá¬ áááºážááá¯á·áá²ááŸá¡áá»áá¯á·á ááŒá®ážááŒáá·áºá á¯á¶áá±á¬á á¬áááºážááŸáá·áº áá±ážááœá¬áááºá
- áá¯ááºáááºážá ááºáá»á¬ážá áœá¬á០áááºážááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá« ááá¯ááŸá±á¬ááºááŸá¯ááœáẠáá±áá¬ááá®ááœááºááŸá¯ááᯠááááºážááááºážááŒááºážááẠáááºáááºááŸá¯á áá áºááá¬áááºááŒá áºáá¬áááºá áá±á¬ááºá¡ááá¯ááºážááŸá¬áá±á¬á· áá®á ááºááŒááºááá¬ááᯠáá¯á¶ááœá±áá²á· á¡áá±ážá ááẠááœá±ážááœá±ážáá¬ážáá«áááºá
- áááºááŸáºáá»á¬ážáááŸáááŒááºážááẠáááºááŒáœáá±á¬ááœá²áá±áá±ážááŸá¯áá»á¬ážááŸáá·áº áááºá ááºáá±áá±á¬ overhead á LMDB ááᯠáá¯á¶ážááááºáá¬á á±áááºá áááºááœá±á·ááœáẠáá±áá¬áááºááŒááºážááẠááœáŸááºááŒáá»ááºááᯠvirtual memory ááœáẠááŸááºáááºáá±á¬ááááºá á¬ááá¯á· áááºááŸááºáá±ážááŒááºážááŒá áºááŒá®áž áá±á¬ááºáááºáá¬áá»áŸáááŸááá«á á áááºáá°ážáááºáááºáá°áá±á¬áºáááºáž repository source ááœáẠcalloc áá±á«áºááá¯ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠrepository configuration function ááœáẠá á¯á ááºážáá¬ážáááºá
- áááºááŸáºáá»á¬ážáááŸáááŒááºážááẠáááºážááá¯á·ááá¯áááºáá±á¬ááºááŒáá·áºááŸá¯ááẠáááºáá°ááŒá¯ááŒááºážááŸáá·áºáááºá ááºáá±á¬áá±á¬á·ááá±á¬ááºáá»á¬ážáááŸáááŒááºážááá¯ááá¯ááá¯áááºá áá áºáá»áááºáááºážááŸá¬ ááááºáááᯠááááºážááááºážáá áºáᯠáááºááŸáááá¯ááºááá·áº á á¬áááºáá°áá»á¬ážááẠáá±áá¬ááá¯á·ááœá¬ážáá¬áááºážááœáẠmutex áá áºáá¯áááºážááŸáá·áº áááœá±á·ááá«á ááá¯á·á¡ááœááºááŒá±á¬áá·áº áááºááŸá¯ááŸá¯á¡ááŒááºááŸá¯ááºážááẠCPU á¡áá±á¡ááœááºá¡á á á¶ááŒáá»ááºážá¡ááá¯ááºáž áá»á²á·ááœááºááá¯ááºá áœááºážááŸááááºá LMDB ááœááºá ááŒá¯ááŒááºááœááºážáá¶ááŸá¯áá»á¬ážáᬠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááºáá°ááŒá¯áá«áááºá áá áºááŒáááºáá»áŸáẠá á¬áá±ážááá¬áá áºáá±á¬ááºáᬠááŸáááá¯ááºáááºá
- caching ááŸáá·áº synchronization logic ááẠá¡áááºážáá¯á¶áž áá¯ááºááᯠááŒáá¯ážáá»áá¯ážá
á¯á¶áááºáááºáž áá»ááºááœáẠá¡áá¯ááºáá¯ááºááŒááºážááŸáá·áº áááºá
ááºáá±áá±á¬ á¡ááœááºááŸá¯ááºááœá±ážáá±á¬ á¡ááŸá¬ážá¡áá»áá¯ážá¡á
á¬ážá០áá¯ááºááᯠááááºážáááºážáá«áááºá Usenix OSDI 2014 ááœááºáááá·áºááœáẠá
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážáá±á¬ áá±áá¬áá±á·á
áºáá±á·áá¬ááŸá¯ááŸá
áºáá¯ááŸááá²á·áááºá
"ááá¯ááºá áá áºá¡á¬ážáá¯á¶ážááẠáá®áá»áŸá áœá¬áááºáá®ážáá¬ážááŒááºážááá¯ááºáá«- áá»ááºá á®ážááŸá¯-ááá¯ááºáá®áá±á¬ á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠáááºáá®ážááŒááºážá ááŸá¯ááºááœá±ážááŸá¯á¡áá±á«áº" Оáá»á±á¬áºááœáŸááºááŸá¯ááŸáá·áº á¡áá»áá¯ážá¡ááŒááºá¡ááœáẠáá±áá¬áá±á·á áºáá»á¬ážááᯠááŸááºážáááºážááŸáááºá ááºááŒááºážá . áááºážááá¯á·áá¶á០áááºááẠLMDB á áááŒá¯á¶á áá°áž áá¯á¶ááŒááºá áááºáá»áááŸá¯ááŸáá·áº áá°áá®áá±á¬ SQLite áááºáá¬ááœááºáá±á¬ á¡áá±á¬ááºážá¡áááºáá»á¬ážá ACID áá¯ááºááá¹áááá»á¬ážááᯠáá»áá¯á·ááœááºážáá»ááºáááŸááá®ážáá«áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ ááŸá áºáá¯áá¯á¶ážááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠáááºáááá¯ááºáááºá - LMDB á á¡áááºážáááºáá»áŸáá¬ááœááºáááºááŸá¯ááẠáááºážááá¯ááºáá»á¬ážá á ááºááá¯ááºá á¬ážááŒá¯ááŸá¯ááᯠááááºá¡ááŒááºááŸá¯ááºážááá¹ááá¬áá»á¬ážááŸáá·áºá¡áá° áááá¯áááºáá¬á L1 cache ááœáẠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬ážáá¬ážááŸáááá¯ááºá á±áá«áááºá
áá¶ááá±á¬ááºážá áœá¬áá²á iOS ááœáẠMemory-mapped ááá¯ááºáá»á¬ážááẠáá»áœááºá¯ááºááá¯á·ááŸá áºáááºááá±á¬áẠááŸááºážáá®áááºážáá»á¬ážááá¯ááºáá±á áááºážááá¯á·ááŸáá·áº áááºá ááºáá±áá±á¬ á¡á¬ážáááºážáá»ááºáá»á¬ážááᯠááá¯ááá¯áááááŸáá áœá¬ ááŒá±á¬ááá¯áááºá áááºáááºááŸá¯á áá áºáá»á¬ážááœáẠá€ááá¹ááá¬ážá¡á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá¡ááœáẠáá±áá°áá»á¡ááŒá±áá¶áá°áá»á¬ážááᯠááŒááºáááºááááááẠááá¯á¡ááºáá«áááºá
áááºááá¯áá®ááŒá±áá¯á¶ááŒá¯áá¯ááºáá¬ážáá±á¬ ááá¯ááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡ááœá±ááœá±á¡áá»ááºá¡áááº
áááºáááºááá¯ááºáá±á¬ á¡ááá®áá±ážááŸááºážáá áºáá¯á á®ááŸáá·áºá áááºáááºááŸá¯á áá áºááẠáá¯ááºáááºážá ááºáá¯áá±á«áºáá±á¬ á¡áá¬áá áºáá¯ááŸáá·áº áááºá ááºáááºá áá¯ááºáááºážá ááºáá áºáá¯á á®ááẠá¡áá¯ááºáá¯ááºááẠááá¯á¡ááºááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠáá±áá¬áá»áá±ážááá·áº áááºá ááºáá±áá±á¬ ááááºá á¬áá»á¬ážá¡ááœá¬á¡áá±ážááᯠááœá²áá±áá±ážáá¬ážáááºá á¡áááá·áºáá¯á¶ážááááºá á¬áá»á¬ážááœáẠáá¯ááºááŸáá·áº hardcoded data ááŸáá·áº á¡áááºážá¡ááŒá áºáá»á¬ážáá«ááá·áº á¡ááá¯ááºážáá»á¬ážáá«ááŸááááºá áá±á¬ááºáá áºáá¯ááá±á¬á· á¡ááŸáá¯ááºáá¯á¶ááá¯á· áá°áááá»á¬ážáá²á· ááá¯ááºážááá áºááááºá á¬áá±áá¬áá²á· á¡áááº-ááŒá®ážááœá¬ážáá¬áá²á· ááá±á¬ááºáá áºáᯠáá±á«áºáá¬áá«áááºá áááºážááœáẠáááá¯ááááºá áá¯ááºáá±á¬ááºááŸá¯á¡ááœááºáž áá±á«áºáá¬ááá·áº á¡áá¬áá»á¬ážá ááááºá á¬áá»á¬áž áá«áááºáááºá ááááºááœáẠá¡ááá®áá±ážááŸááºáž stack ááŸá¡áá¯á¶ážááŒá¯áá±á¬ memory á§áááá¬á ááŒá®ážááœá¬ážáááºááŒá áºá á± áá»á¯á¶á·áááºááŒá áºá á± áá áºáááºážá¡á¬ážááŒáá·áº áááºážáá¡ááœááºá¡á á¬ážáááºáááºáž áááºááŒáœáá±á¬ááá±á¬ááŸááááºá stack ááŸáá·áº heap ááẠáá áºáá¯ááŸáá·áºáá áºáᯠááœááºážáááŸá±á¬áá·áºááŸááºá á±áááºá áááºážááá¯á·ááᯠaddress space á ááá°áá®áá±á¬á¡áá¯á¶ážáá»á¬ážááœáẠááá¯ááºážááŒá¬ážáá¬ážáááºá á¡áá±á«áºááŸáá·áºá¡á±á¬ááºááŒá±ááœáẠdynamic section ááŸá áºáá¯ááŒá¬ážááœáẠá¡áá±á«ááºáá áºáá¯ááŸááááºá á€á¡áááºá¡áááºá¡ááá¯ááºážááŸá ááááºá á¬áá»á¬ážááᯠáááºáááºááŸá¯á áá áºá á¡áá»áá¯ážáá»áá¯ážáá±á¬ ááŒá áºá ááºáá áºáá¯ááŸáá·áº áááºá ááºááẠá¡áá¯á¶ážááŒá¯áá«áááºá á¡áá°ážáááŒáá·áºá áááºážááẠáá áºááºáá±á«áºááŸá ááá¯ááºáá áºáá¯ááá¯á· á ááºáááºáááŒáẠááááºá á¬á¡áá»áá¯á·ááᯠááŒá±áá¯á¶ááœá²ááá¯ááºáááºá ááá¯ááá¯á·áá±á¬ááá¯ááºááᯠmemory-mapped file áá¯áá±á«áºáááºá
áá¯ááºáááºážá ááºáá áºáá¯á¡ááœáẠááœá²áá±áá±ážáá¬ážááá·áº ááááºá á¬áá±áá¬ááẠááŒá®ážáá¬ážáááºá áá®á¡áá¯áá®á¡áá á áá áºá bitness ááŒáá·áºáá¯á¶ážááŒááºááá·áº pointer áá¡ááœááºá¡á á¬ážááŒáá·áºáᬠááááºá á¬á¡áá±á¡ááœááºááᯠááá·áºáááºáá¬ážáááºá á¡áááºá áá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºááᯠ1-in-1 ááœáẠáááºááŸááºáá±ážáá²á·áá«áá ááááá¯ááºáááºážá ááºááẠRAM áá áºáá¯áá¯á¶ážááᯠá á¯ááºáá°ááœá¬ážáááºááŒá áºááŒá®áž Multitasking á¡ááœáẠáá±ážááœááºážáá¯ááºá áá¬áááŸááá«á
ááá¯á·áá±á¬áºá áá±ááºáá®áááºáááºááŸá¯á áá áºáá»á¬ážááẠáááºá¡ááá¯ááŸáááá±á¬áẠáá áºáá»áááºáááºážááœáẠáá¯ááºáá±á¬ááºááá¯ááºáááºáá°áá±á¬ á¡ááœá±á·á¡ááŒá¯á¶á០áá»áœááºá¯ááºááá¯á·áááá«áááºá áááºážááá¯á·ááẠá á¬ááœááºáá±á«áºááœááºáᬠáá¯ááºáá±á¬ááºááẠáááºááá¯áá®á¡áá»á¬ážá¡ááŒá¬ážááᯠááœá²áá±áá»áá¬ážááŒááºážááŒá±á¬áá·áº ááŒá áºááá¯ááºáá±á¬áºáááºáž á¡ááŸááºááááºááœáẠáááºážááá¯á·ááẠá€áá±áá¬ááŸáá·áº ááá¯áááºááŸá ááá¯á¡ááºáá±ááá·áº áááºááá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºáá²ááá¯á· áááºážááá¯á·ááᯠááá·áºááœááºážáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº áá¯ááºáááºážá ááºááŸáá·áº áááºá ááºáá±áá±á¬ memory ááᯠvirtual áá¯áá±á«áºáááºá
áááºáááºááŸá¯á áá áºááẠá¡áá»áá¯á·áá±á¬á¡ááœááºá¡á á¬ážááŸá á á¬áá»ááºááŸá¬áá»á¬ážá¡ááŒá Ạvirtual ááŸáá·áº áá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºááᯠá á¯á ááºážáá±ážáááºá á¡áá»áá¯á·áá±á¬ virtual memory á á á¬áá»ááºááŸá¬áá áºáᯠáá±á¬ááºážááá¯áá¬áááºááŸáá·áºáááŒáá¯ááºáááºá áááºáááºááŸá¯á áá áºááẠáááºážááᯠáá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºááœáẠááá·áºááœááºážááŒá®áž áááºážááá¯á·ááŒá¬ážááŸá á á¬áá±ážá á¬áá°ááᯠá¡áá°ážááá¬ážáá áºáá¯ááœáẠáá»áá¬ážáááºá á¡ááá²á· slot áá»á¬ážáááŸááá«áá ááááºá áááºáá¬ážáá±á¬ á á¬áá»ááºááŸá¬áá»á¬ážáá²á០áá áºáá¯ááᯠdisk ááá¯á· áá°ážáá°ááŒá®áž áá±á¬ááºážááá¯áá¬ážáá±á¬ á á¬áá»ááºááŸá¬ááẠáááºážáá±áá¬ááá¯á· áá±á¬ááºááœá¬ážáá«áááºá áááŒá¬áá® áá»áœááºá¯ááºááá¯á·ááŒááºááœá¬ážááá·áº á€áá¯ááºáááºážá ááºááᯠswapping áá¯áá±á«áºáááºá á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááẠááŒá áºá ááºááᯠááá¯ááºáá±á¬áºáá¬ážáááºá áááºážááœáẠááááºá ᬠ0 áá«áá±á¬ á á¬áá»ááºááŸá¬ A ááᯠáááºááŒá®áž ááááºá ᬠ4 áá«áá±á¬ áááºáááŸááºáá¬ááºá á¬áá»ááºááŸá¬ááœáẠáá¬ážááŸááá²á·áááºá á€á¡áá»ááºááᯠáá²ááºáá¶áá«áẠ0 ááŸá á á¬áá±ážá á¬áá°ááá¬ážááœáẠáááºáááºáá²á·áááºá
Memory-mapped ááá¯ááºáá»á¬ážááŒáá·áºá áá¬ááºáááºážááẠá¡áá°áá°áááºááŒá
áºáááºá áá¯áá¹áááá±áá¡áá áááºážááá¯á·ááᯠvirtual address space ááœáẠá
ááºáááºáááŒááºááŸáá·áº áá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž áá¬ážááŸááá¬ážáááºá ááá¯á·áá±á¬áºá áááºážááá¯á·ááẠá
á¬áá»ááºááŸá¬áá
áºáá¯ááŒá®ážáá
áºáᯠáá°áááŸááºáá¬ááºá
á¬áá»ááºááŸá¬ááá¯á· áá±á¬ááºááŸáááŒá®áž áá±á¬ááºážááá¯ááŸá¯á¡ááᬠááŒá
áºáááºá ááá¯á
á¬áá»ááºááŸá¬áá»á¬ážááᯠááœááºážáá¶ááŒááºáááºááŒááºážááẠáá
áºááºáá±á«áºááŸá ááá¯ááºááŸáá·áº áááºáá°ááŒá¯áá«áááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠááá¯áẠI/O ááᯠáá¯ááºáá±á¬ááºááá¯ááºááŒá®áž áááºááá¯áá®ááœáẠááá¯ááºáá»á¬ážááŒáá·áº ááá¯ážááŸááºážá
áœá¬ áá¯ááºáá±á¬ááºááá¯ááºááẠ- ááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠoperating system kernel á០áá°áááºážááá¯ááºááá¯á· á¡ááá¯á¡áá»á±á¬áẠááœáŸá²ááŒá±á¬ááºážáá±ážáááºááŒá
áºáááºá
â
á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááẠááá°áá®áá±á¬áá¯ááºáááºážá
ááºáá»á¬ážááŸáá±áá¬áá±á·á
áºááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá« LMDB ááẠáááºážáá¡ááŒá±á¡áá±ááá¯áá
áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºáá¯á¶ááᯠááá¯ááºááŒáááºá ááá°áá®áá±á¬ áá¯ááºáááºážá
ááºáá»á¬ážá virtual memory ááᯠáá°áá®áá±á¬ááá¯ááºááœáẠááŒá±áá¯á¶ááœá²ááŒááºážááŒáá·áºá LMDB ááŸááŒáá·áºááŸá¯ááá·áºáá±áá¬ááŒá
áºááá·áº áááºážááá¯á·áááááºá
á¬áá±áá¬áááºáá¯á¶ážá¡áá»áá¯á·ááᯠáá
áºáá¯ááŸáá·áºáá
áºáᯠá¡áá°ážá¡ááŒá±á¬ááºážá¡áá»áááºááá¯ááºáá¯ááºáá±á¬ááºááẠá
áá
áºá¡á¬áž áá»áœááºá¯ááºááá¯á·á ááá¯á¡ááºáá«áááºá
â
á¡áá±ážááŒá®ážáá±á¬ ááœá²ááŒá¬ážáá»ááºááŸá¬ LMDB ááẠáá±áá¬ááá¯ááºááᯠáá±ážá áá áºáá±á«áºááá¯ááŸá¯ ááá¹ááá¬ážááŸáá áºááá·áº áá¯á¶áá±ááŒáá·áº ááœááºážáá¶ááŒááºáááºááŒá®áž ááá¯ááºááá¯ááºááá¯ááºá áááºáááº-áááºáááºáá¯ááºááœáẠááŒáááŒááºážááŒá áºáááºá á€áá»ááºážáááºááŸá¯ááœáẠá¡áá±ážááŒá®ážáá±á¬ áááºáá±á¬ááºááŸá¯ ááŸá áºáá¯ááŸááááºá
áááá¡áá»áá¯ážáááºá áááºáááºááŸá¯á
áá
áºá¡á¬ážáá¯á¶ážááŸá¬ ááŒá
áºááá¯ážááŒá
áºá
ááºáá«á áááºážá á¡ááŸá
áºáá¬áááŸá¬ ááŸá¬ážááœááºážáá±á¬ áá¯ááºááŒáá·áº áá±áá¬áá±á·á
áºááá¯á· ááááºááœááºáá² áá»ááºá
á®ážááŒááºážá០áá¬ááœááºááŸá¯ áá±á«ááºážááá·áºááẠááŒá
áºáááºá áááºááááá·áºá¡ááá¯ááºážá áá¯ááºáááºážá
ááºáá
áºáá¯á á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááẠáááºážáááááºá
á¬áá±áá¬ááŸá áááºááá·áºáá±áá¬ááŸáááᯠáá±áá¬ááᯠá¡ááá²á·ááá°ááá¯ááºáá«áááºá áá
áºáá»áááºáááºážááŸá¬áááºá áá»áœááºá¯ááºááá¯á·ááŸááºááááá±á¬ááºá áááºááŸá¯áá±ážáá¯ááºááœáẠááá¯ááºáá
áºáá¯ááŒáááŒááºážááẠáááºááá·áºááœáŸááºááŒá¬ážáá»ááºááá¯áááᯠáááºážá¡ááŒáẠáááºážááá¯ááŒááºááá¯ááºáááºáᯠááá¯ááá¯áááºá á¡áááºá áá°áááẠáááºážááᯠááŸá¬ážááœááºážá
áœá¬ááŒá¯áá¯ááºáááá«áá á¥ááá¬á¡á¬ážááŒáá·áºá áááá¯ááŸáááá±áá±á¬ á¡ááœáŸááºážáá
áºáá¯ááœáẠarray element áá
áºáá¯ááᯠá¡ááŸááºáááẠoverwrite áá¯ááºáá«áá á€áááºážááŒáá·áº áááºážááẠdatabase áá±á¬ááºááŒááºááŒááºážááá¯á· áŠážáááºááœá¬ážá
á±ááá·áº á€áááºážá¡á¬ážááŒáá·áº áá°áááẠááŒá±áá¯á¶áá±á«áºááœáẠáá±á¬áºááŒáá¬ážáá±á¬ááá¯ááºááᯠááá±á¬áºáá ááŒá±á¬ááºážáá²ááá¯ááºáááºá ááá¯ááºááᯠáááºáááº-áááºáááºáá¯ááºááœáẠááŒááá«áá áááºážááŸáá·áºáááºááá¯ááºááá·áº ááááºá
á¬áá±áá¬á¡á¬áž ááŒá±á¬ááºážáá²ááẠááŒáá¯ážáááºážááŒááºážááẠá¡áá»ááºááŒááŸá¯ááŒáá·áº áááá¯áááẠáá»ááºá
á®ážááœá¬ážáááºááŒá
áºáááºá SIGSEGV
á ááá¯ááºááẠáááá¯á¡ááá¯ááºáž ááŸááá±áá«áááºá
áá¯áááá¡áá»áá¯ážáááºá iOS á¡ááœáẠáá®ážááá·áºááŒá áºáá±áá«ááŒá®á á á¬áá±ážááá¬ááŸáá·áº á¡ááŒá¬ážááááºážáááºážááŒá áºáá»á¬ážá áááºážááᯠá¡ááá¡áááºážáá±á¬áºááŒáá¬ážááŒááºážáááŸááá±á¬áºáááºážá áááºážáááŸááá²á LMDB ááẠá€ááá¯ááá¯ááºážáááºáááºááŸá¯á áá áºááœáẠáá¯ááºáá±á¬ááºááẠáááá·áºáá»á±á¬áºáá«á áá±á¬ááºá¡ááá¯ááºážááá¯áá±á¬á· ááá·áºááœááºážá ááºážá á¬ážáá¬ážáá«áááºá
iOS ááœáẠMemory-mapped ááá¯ááºáá»á¬ážá á¡áá±ážá áááºá¡áá»ááºáá»á¬áž
2018 ááœáẠWWDC á á¡á¶á·ááŒááœááºáá±á¬ááºážáá±á¬ á¡á
á®áááºáá¶á
á¬áá
áºáᯠááŸááá²á·áááºá
ááá·áºááŸááºážáá±á¬ááŸááºáá¬ááºááẠáá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºá០áá±ážáááºážá
áœá¬ áá°ážááŒá±á¬ááºážááá¯ááºáá±á¬ á
á¬áá»ááºááŸá¬áá»á¬ážá
á¯á
ááºážááŸá¯ááŒá
áºáááºá áááºážááá¯á·áá«ááŸááá±á¬ áá±áá¬áá»á¬ážááᯠááá¯á¡ááºáááᯠáááºážááá¯á·á áá°áááºážáááºážááŒá
áºáá»á¬ážá០ááŒááºáááºááá°ááá¯ááºáá«áááºá áááºáááº-áá®ážááá·áº áááºááá¯áá®-áá¯á¶áá±á¬áºáá¬ážáá±á¬ ááá¯ááºáá»á¬ážááẠá€á¡áá»áá¯ážá¡á
á¬ážááœáẠááŸááááºá 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 ááŒá áºáááºá ááá¯ááŸá±á¬ááºááŸá¯ááŸá áºáá¯áá¯á¶ážááẠáá±ááá¯ááºáá°ááŸááºáá¬ááºááá¬áá¡áá»áá¯á·ááᯠááááºážááá¯ááºáá¬ážáá±á¬áºáááºáž áááºážááá¯á·ááŸá áºáá¯áá¯á¶ážááẠáá áºáááºááá·áºá¡ááœááºá¡á á¬ážááᯠááá«áááºáá«á
ááá¯á¡áá»áááºááẠááááºážááá¯ážá¡ááœáẠá¡áá»áááºááŒá
áºáááºá 64-bit desktop áááºáááºááŸá¯á
áá
áºáá»á¬ážááœáẠswap ááá¹ááá¬ážááŒá±á¬áá·áºá áá¯ááºáááºážá
ááºáá
áºáá¯á
á®ááẠhard disk áá±á«áºááŸá áá±áá¬ááœááºáá»á¬ážááᯠáááºážá ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ swap áá»á¬ážá¡ááœáẠááœáá·áºááŒá¯áá±ážáááºááŸáá·áºá¡áá»áŸ áá¯ááºáááºážá
ááºáá
áºáá¯á
á®ááẠvirtual address space áá»á¬ážáá»á¬ážáá°ááá¯ááºáááºá iOS ááœáẠcompression ááŒáá·áº swap ááᯠá¡á
á¬ážááá¯ážááŒááºážááẠáá®á¡áá¯áá®á¡á á¡áá»á¬ážáá¯á¶ážááᯠáááááá¬áᬠáá»áŸá±á¬á·áá»áá±ážáá«áááºá ááᯠáááºááŸá áá¯ááºáááºážá
ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠáááºá (read RAM) áááºááá¯áá®ááœáẠá¡á¶áááºááœááºáá»ááŒá
áºáááẠááŒá
áºááŒá®áž á¡á¶ááááºáá±á¬ á¡áá¬áá»á¬ážá¡á¬ážáá¯á¶ážááẠá¡áááºážá¡ááŒáẠáááºá
á²ááŒááºážáá¶ááá«áááºá á¡áá±á«áºááŸá¬ááŒá±á¬áá²á·áááá¯áá«áá²á
Cloud ááœááºá
ááºážáááºááŸá¯áá»á¬ážáááááºá¡áá±ááŒáá·áº LMDB ááŸááœá²áá±áá±ážáá±á¬áááºááá¯áá®áá¡á±á¬ááºáá±á¬áºááŒáá«á¡áá±ážá¡áá°áááºááá¯ážáá»á¬ážááŒá
áºáááº- 384-bit á
ááºáá»á¬ážá¡ááœáẠ32 megabytes ááŸáá·áº 768-bit áá»á¬ážá¡ááœáẠ64 ááŒá
áºáááºá á€á¡áá¶á¡ááá¯ážá¡áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááŒá®ážáá±á¬ááºá ááŒá¯ááŒááºááœááºážáá¶ááá·áºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááẠáá¯ááºááŒáá·áº ááŒá®ážááŒá±á¬ááºááœá¬ážáááºááŒá
áºáááºá MDB_MAP_FULL
. áá»áœááºá¯ááºááá¯á·áá
á±á¬áá·áºááŒáá·áºááŸá¯ááœááºááá¯áá²á·ááá¯á·áá±á¬á¡ááŸá¬ážáá»á¬ážááá¯áá»áœááºá¯ááºááá¯á·áááááŒá¯áááá±á¬áºáááºážáááºážááá¯á·áááºá€á¡ááá·áºááœááºáá»á
áºáá»á°ááŸá¯áááºáá¯á¶áá±á¬ááºáá±á¬áá±ážáááºáááºá
ááá¯ááŸá±á¬ááºááŸá¯á¡á¬ážááŒáá·áº áááºááá¯áá®á¡ááœááºá¡áá»áœá¶áá¯á¶ážá áœá²ááŸá¯á¡ááœáẠáááºááŸá¬ážáá±á¬á¡ááŒá±á¬ááºážá¡áááºážááŸá¬ ááŒá¬ááŸááºá áœá¬ á¡áá±á¬ááºážá¡áááºááŒá áºááá¯ááºáááºá á€ááŒá áºá ááºááŸá áºáá¯ááẠáááºááá¯á·áááºá ááºáááºááᯠáá¬ážáááºáááºá áááºážááẠáá»ááºááŸááá±á¬ LMDB áá±ááá«ážááŸá áºáá±á¬ááºááᯠá ááºážá á¬ážááẠáá°áá®áá±ážáá«áááá·áºáááºá
á.áá áá±ááá«áž #áá B+-áá áºáááº
áá±á¬á·áááºááá¯ážá ááá¯ážáá áºáá¯áááááºááœáẠááá¬ážáá»á¬ážááá¯á¡áá¯áá°áááºá á¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠáááºážá API ááœáẠááŸááá±ááááº-
- á¡á áááºá¡ááá¯ááºážá¡áá áºáá áºáá¯ááᯠááá·áºááœááºážááŒááºážá
- áá±ážáá¬ážáá±á¬áá±á¬á·ááŒáá·áº á¡á áááºá¡ááá¯ááºážáá áºáá¯ááᯠááŸá¬áá«á
- á¡á áááºá¡ááá¯ááºážáá áºáá¯ááᯠáá»ááºááŒááºážá
- áááºážááá¯á·á á¡áá»áá¯ážá¡á á¬ážá¡á á®á¡á á¥áºá¡ááá¯ááºáž á¡áááááŒá¬ážáá¬ááá»á¬ážááᯠáááºáá±á¬ááºážáá«á
áá¯ááºáá±á¬ááºáá»áẠáá±ážáá¯á áá¯á¶ážááᯠá¡ááœááºááá° á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá±á¬ á¡ááá¯ážááŸááºážáá¯á¶áž áá±áá¬ááœá²á·á ááºážáá¯á¶ááŸá¬ ááœáááŸá¬ááœá±ááŸá¯áá áºááẠááŒá áºáááºá áááºážá áá¯á¶ááŸááºáá áºáá¯á á®ááẠááá±ážáá®ážáá»á¬ážá á¡ááœá²áá áºáá¯áá¯á¶ážááᯠá¡ááœá²ááŸá áºáá¯á¡ááŒá Ạááá¯ááºážááŒá¬ážáá¬ážáá±á¬ áá±á¬á·áá áºáá¯ááŒá áºáááºá áááºáááºááœáẠááááááºáááºáá±á¬á áá¬áááºááœáẠááá¯ááŒá®ážáá±á¬á¡áá¬áá»á¬ážááŒá áºáááºá ááŸá¬áá°áá¬ážáá±á¬áá±á¬á·á¡á á¯á¶ááá¯áááŸáááŒááºážááẠááá¹ááááºáá áºáááºááŒááºáááºážááŸá¯áá áºáá¯ááŸáá áºááá·áº á¡á±á¬ááºááŒááºáááºá
ááœááá
áºáááºáá»á¬ážááẠáá
áºááºáá±áá¬ááœá²á·á
ááºážáá¯á¶áá²á·ááá¯á· áááá±á¬ááºááŸá¯áááŒá
áºá
á±ááẠáá¬ážáá®ážááá·áº á¡ááŒá±áá¶á¡á¬ážáááºážáá»ááºááŸá
áºáá¯ááŸááááºá áááá¡áá»ááºááŸá¬ áááºážááá¯á·á áááºáá»ááºááá¬áááᯠááá·áºááŸááºážáááááá¯ááºáá«á ááá°áá®áá±á¬á¡ááá¯ááºážá¡áááºáá»á¬ážá á¡ááŒáá·áºááẠáá»á¬ážá
áœá¬ááœá²ááŒá¬ážááá¯ááºááŒá®áž ááŸá¬ááœá±ááŸá¯á á¡ááºáááá¯áá®áááºááŸá¯ááºááœá±ážááŸá¯ááᯠáááá¬áááºááŸá¬ážá
áœá¬ ááá¯ážááœá¬ážá
á±ááá·áº áá
áºáááºáá»á¬ážáááŸáááẠá¡áá¹ááá¬ááºáá»á¬ážá
áœá¬ááŸááá«áááºá áá¯áááá¡áá±ááŒáá·áºá node áá»á¬ážááŒá¬ážááŸá á¡ááŒááºá¡ááŸááºááá·áºááºáá»á¬áž áá»á¬ážááŒá¬ážááŒááºážááẠmemory á¡ááœááºážááŸá áá±áá¬áá±áá binary tree áá»á¬ážááᯠáá¯á¶ážááŸá¯á¶ážá
á±áááºá á¡áááẠnode (áááºážááá¯á·ááŒá¬ážááŸá ááá·áºááºáá»á¬ážá áááºááŸááºáá»ááºá¡á) ááᯠvirtual memory ááŸá áá¯á¶ážáááœá²ááŒá¬ážááŒá¬ážáá¬ážáá±á¬ á
á¬áá»ááºááŸá¬áá»á¬ážááœáẠáááºááŸáááá¯ááºáááºá á¡áá»áá¯ážáááºá¡áá±ááŒáá·áº áá
áºáááºáá
áºáááºááŸá á¡áá®ážáá¬ážááŸá áá¯á¶ááŸááºáá»á¬ážá
áœá¬ááᯠááá¯ážááŸááºážá
áœá¬ááŒááºáááºážááŒááºážáááºááẠááŸáá¯ááºážááŸááºááá¯ááºáá±á¬ á
á¬áá»ááºááŸá¬á¡áá±á¡ááœááºááᯠáááºáááºááẠááá¯á¡ááºáá«áááºá áááá¯áááºáᬠáááºááŸáºááŸá á
á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡áááºáááŒáẠááŸáá·áºáááºááŒááºážááẠá
á»á±ážáááŒá®ážáá±á¬ááŒá±á¬áá·áº ááœááá
áºáááºáá»á¬ážá á
áœááºážáá±á¬ááºáááºááᯠáááºááá¯áá®á¡ááœááºáž áá±áá¬áááºáá±á¬ááºáá¯á¶á¡ááŒá
Ạáá»áœááºá¯ááºááá¯á·ááŒá±á¬ááá·áºá¡áá«ááœááºááẠáááºážááẠááŒá¿áá¬áá
áºáá¯ááŒá
áºáááºá áá
áºááºá០node ááá¯ááºáᬠá
á¬áá»ááºááŸá¬áá»á¬ážááᯠáááŒá¬áá ááŒá¯á
á¯áá»áá¯ážáá±á¬ááºááá·áºá¡áá«ááœááºá á¡áá¬áá»á¬ážááẠááááºááᯠááá¯ážááœá¬ážááœá¬ážáá«áááºá
B-trees ááẠááœááá áºáááºáá»á¬ážá ááá·áºáá²ááŒá áºá ááºááŒá áºááŒááºážááŒá±á¬áá·áº ááááºá á¬ááá¯ááºááœáẠáá±á¬áºááŒáá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážáá±ážáááºá ááááŠážá áœá¬á áá°ááá¯á·ááẠááááááá¯ááºááᯠáááºáá»ááºáá®á¡á±á¬áẠáá¯ááºáá±á¬ááºááŒáááºá áá¯áááá¡áá±ááŒáá·áºá áááºážááá¯á·á áá¯á¶ááŸááºáá áºáá¯á á®ááẠááá±ážáá±á¬á·áá»á¬ážááᯠ2 ááá¯ááºážááá¯ááºáá² M ááœá²á ááœá²áᬠM áá¶áá«ááºááẠáá¬ááááºáž ááá¯á·ááá¯áẠáá±á¬ááºáá±á«ááºážáá»á¬ážá áœá¬á á¡á á®á¡á á¥áºá¡á á¡áá±á¬áºáá±ážááŒá®ážáá¬ážááá¯ááºáááºá
ááá¯á·ááŒá±á¬áá·áº-
- node áá áºáá¯á á®ááœáẠá¡áááá·áºáá±ážááŒá®ážáá¬ážáá±á¬á·áá»á¬ážá áœá¬ááŸáááŒá®áž áá áºáááºáá»á¬ážááẠá¡ááœááºáááºážáá«ážáá«áááºá
- áááºááá¯ážáá®ážá ááºáá±á¬áá±á¬á·áá»á¬ážááẠáá áºáá¯ááŸáá·áºáá áºáá¯á¡áá®ážáá¬ážááŸá node áá áºáá¯áá±á«áºááœáẠááá¬áá¡ááá¯ááºážáááºááŸááá±á¬ááŒá±á¬áá·áº áá áºáááºááẠááŸááºáá¬ááºááœáẠáá±áá¬áá±ááááá¯ááºááá¯ááºááŸá¯ááᯠáááŸááá«áááºá
- ááŸá¬ááœá±ááŸá¯áá¯ááºáá±á¬ááºááŸá¯áá áºáá¯á¡ááœááºáž áá áºáááºáá±á«áºááŸáááºážááá·áºá¡áá« á¡áá°ážá¡ááŒá±á¬ááºáž node á¡áá±á¡ááœááºááᯠáá»áŸá±á¬á·áá»áá±ážáááºá
- á¡ááœá¬á¡áá±ážáá±ážááŒááºážáá»ááºáá»á¬ážá¡ááœáẠáá áºááŸááºáá¶áá«ááºáá»á¬ážááᯠáá»áŸá±á¬á·áá»áá±ážáááº
LMDB ááẠáá±áá¬ááááºážáááºážááẠB+ tree áá¯áá±á«áºáá±á¬ B-tree á¡áá»áá¯ážá¡á á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá á¡áááºáá±á¬áºááŒáá« áá¯á¶ááœáẠáááºážááœááºáá«áááºáá±á¬ node á¡áá»áá¯ážá¡á á¬ážáá¯á¶ážáá»áá¯ážááᯠááŒááááº-
- ááááºááŸá¬á¡ááŒá áºá áááºážááẠrepository áá áºáá¯á¡ááœááºážááŸá database áá áºáá¯áááá±á¬ááá¬ážááẠáá¬ááŸáááá¯áá«á LMDB instance áá áºáá¯á¡ááœááºážá áááºááẠááŒá±áá¯á¶ááœá²áá¬ážáá±á¬ virtual address space ááá¯áá»áŸáá±ááá·áº databases áá»á¬ážá áœá¬ááᯠáááºáá®ážááá¯ááºáááºá áááºážááá¯á·áá áºáá¯á á®ááẠáááºážáááá¯ááºááá¯ááºá¡ááŒá áºá០á áááºáááºá
- á¡áááá·áºáá¯á¶ážá¡ááá·áºááŸá¬ á¡ááœáẠ(á¡ááœááº)á áááºážááá¯á·ááẠáááºážááá¯á·ááŸáá·áº áá±áá¬áá±á·á áºááœáẠááááºážáááºážáá¬ážáá±á¬ áá±á¬á·áááºááá¯ážá¡ááœá²áá»á¬ážáá«ááŸááá±á¬ áááºážááá¯á·áá¬ááŒá áºáááºá á áá¬ážáá ááºá á€áááºááŸá¬ B+-trees ááá°ážááŒá¬ážáá»ááºááŒá áºáááºá áá¯á¶ááŸáẠB-tree ááẠá¡ááá·áºá¡á¬ážáá¯á¶ážá node áá»á¬ážááœáẠáááºááá¯áž-á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠááááºážáááºážáá¬ážáá«á B+-variation ááẠá¡áááá·áºáá¯á¶ážáá áºáá¯ááŒá áºáááºá á€á¡áá»ááºááᯠááŒá¯ááŒááºááŒá®ážáá«á á¡á±á¬ááºáá«á¡ááá¯ááºáž LMDB ááœááºá¡áá¯á¶ážááŒá¯áá±á¬áá áºáááºá á¡áá»áá¯ážá¡á á¬ážááœá²ááᯠááá¯ážááá¯áž B-tree áá¯áá±á«áºááá¯áá«áááºá
- á¡ááŒá áºááŸáá·áº á¡ááœááºááŒá¬ážááœáẠáááºážááŒá±á¬ááºážááŒááŒááºáž (á¡ááá¯ááºážá¡áááº) áá»á¬ážáá«ááŸááá±á¬ 0 ááá¯á·ááá¯áẠááá¯á·áááºááá¯áá±á¬ áááºážááá¬á¡ááá·áºáá»á¬áž ááŸááá«áááºá áá°ááá¯á·ááá¬áááºááŸá¬ á¡ááœááºáá»á¬ážááŒá¬ážááœáẠáá±á¬á·ááœá²áá»á¬ážááᯠááœá²áá±áááºááŒá áºáááºá
áá¯ááºááá¯ááºážá¡áá node áá»á¬ážááẠááŒáá¯áááºáááºááŸááºáá¬ážáá±á¬ á¡ááŸááºáá
áºáá¯á ááŸááºáá¬ááºáá¯á¶ážáá»á¬ážááŒá
áºáááºá áááºážááá¯á·á á¡ááœááºá¡á
á¬ážááẠá¡áááºááœááºááŒá±á¬áá²á·ááá·áº áááºáááºááŸá¯á
áá
áºááŸá áááºááá¯áá®á
á¬áá»ááºááŸá¬áá»á¬ážá á¡ááœááºá¡á
á¬ážáá
áºáá¯ááŒá
áºáááºá node ááœá²á·á
ááºážáá¯á¶ááᯠá¡á±á¬ááºááŸá¬ ááŒáá¬ážáá«áááºá áá±á«ááºážá
á®ážááœáẠmeta-information áá«áááºáááºá á¥ááá¬á¡á¬ážááŒáá·áº á¡áááºááŸá¬ážáá¯á¶ážááŸá¬ checksum ááŒá
áºáááºá áá±áá¬áá«ááŸááá±á¬áá²ááºáá»á¬ážááŸáá·áºá¡áá° á¡á±á¬á·ááºáááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážáá«ááŸááááºá áá±áá¬áá¡áááºážááá¹áááẠáá±á¬á·áá»á¬ážááŒá
áºááá¯ááºáááºá á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºážááŒá±á¬ááºážááŒááŒááºážááá¯ááºáᬠáá¯á¶ááŸááºáá»á¬ážá¡ááŒá±á¬ááºážááŒá±á¬áá±áá»áŸáẠááá¯á·ááá¯áẠá¡ááœááºá¡ááœáẠáá±á¬á·áááºááá¯ážá¡ááœá²áá»á¬áž áá
áºáá¯áá¯á¶ážááᯠá¡áá¯ááºáá²ááœáẠá
á¬áá»ááºááŸá¬áá»á¬ážá áááºáá±á¬ááºáá¯á¶á¡ááŒá±á¬ááºáž ááá¯ááá¯áááºááŸá¯ááá¯ááºáá«áááºá
á á¬áá»ááºááŸá¬ node áá»á¬ážá á¡ááœááºážááá¯ááºáž á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááá¯ááºááœááºááŒá±ááŸááºážááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠLMDB B-tree ááᯠá¡á±á¬ááºáá«áá¯á¶á á¶ááŒáá·áº ááá¯ážááŸááºážáá±á¬áááºážáááºážááŒáá·áº áááºáá¶ááá¯ááºá á¬ážááŒá¯áá«áááºá
node áá«ááá·áº á á¬áá»ááºááŸá¬áá»á¬ážááᯠáá áºááºáá±á«áºááœáẠá ááºáááºáááŒááºá á®á ááºáá¬ážáááºá áá¶áá«ááºááá¯ááŒáá·áºáá±á¬ á á¬áá»ááºááŸá¬áá»á¬ážááẠááá¯ááºáá¡áá¯á¶ážáá®ááá¯á· áá±á¬ááºáá±áá«áááºá áááºáá¬á á¬áá»ááºááŸá¬ (meta page) ááœáẠáá áºáááºá¡á¬ážáá¯á¶ážá á¡ááŒá áºáá»á¬ážááᯠááŸá¬ááœá±ááẠá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº á¡á±á¬á·ááºáááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡ááẠáá«ááŸááááºá ááá¯ááºáá áºáá¯ááá¯ááœáá·áºáá±á¬á¡áá«á LMDB ááẠááá¯ááºá á¬áá»ááºááŸá¬ááᯠá¡áá¯á¶ážááŸá¡á á¡áá á á¬áá»ááºááŸá¬áá áºáá¯á á®ááᯠá áááºááºáááºáᬠááá¬ážááẠmeta á á¬áá»ááºááŸá¬ááᯠááŸá¬ááœá±ááŒá®áž áááºážááŸáá áºááá·áº ááŸáááŒá®ážáá¬ážáá±áá¬áá±á·á áºáá»á¬ážááᯠááŸá¬ááœá±áááºáâ
ááá¯á áá±áá¬á¡ááœá²á·á¡á ááºážááá¯áá¹ááááŸáá·áºáá¯ááºááá¯ááºážááá¯ááºáá¬ááœá²á·á ááºážáá¯á¶ááá¯ááºáá¬á áááºáá°ážáá áºáá¯ááŸááá»áŸáẠLMDB ááááááá±ááá«ážááá¯á ááºážá á¬ážáááºáááºáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá ááá¯ááŸá±á¬ááºááŸá¯ááœááºážáá¶ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááŒááºážááŸáá·áº áá áºáá¯ááŸáá·áºáá áºáᯠáá®ážááŒá¬ážááœá²áá¬ážááŒááºážááŒáá·áº áá±áá¬áá±á·á áºáá áºáá¯áá¯á¶ážááᯠáá»áá¯ážá á¯á¶áá¬ážááŸááºážá¡ááŒá áºáááºáž áá±ážá áœááºážááá¯ááºáááºááŒá áºáááºá
á.áá áá±ááá«áž #áá copy-on-write
B-tree áá¯ááºáá±á¬ááºáá»ááºá¡áá»áá¯á·ááẠáááºážá node áá»á¬ážááá¯á· á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž áááºááá¯ááºááŒá¯áá¯ááºááŒááºáž áá«áááºáááºá á¥ááá¬áá áºáá¯ááẠáááºážáá¡ááŒáá·áºáá¯á¶ážá áœááºážáááºááá¯á·áá±á¬ááºááŸáááŒá®ážáá±á¬ node áá áºáá¯ááá¯á· áá±á¬á·á¡áá áºáá áºáá¯ááᯠáá±á«ááºážááá·áºááŒááºážááŒá áºáááºá á€ááá á¹á ááœááºá ááááŠážá áœá¬á áááºážááẠnode ááᯠááŸá áºááá¯ááºážááœá²áááºá áá¯áááá¡áá±ááŒáá·áº áááºážá parent ááŸá spun off ááá±áž node á¡áá áºááá¯á· ááá·áºááºáá áºáá¯ááá·áºááẠááá¯á¡ááºáá«áááºá á€áá¯ááºáá¯á¶ážáá¯ááºáááºážááẠá¡ááœááºá¡áá¹ááá¬ááºáá»á¬ážáááºá á¡ááŒá±á¬ááºážáá áºáá¯áá¯ááŒá±á¬áá·áº (áá»ááºáá»ááŒááºážá áá¬ááºá¡á¬ážááŒááºáá±á¬ááºááŒááºážá áááºááŒáá·áº) á á®ážáá®ážá០á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá áá áºá áááºáá áºááá¯ááºážáᬠááŒá áºááœá¬ážáá«áá áá áºáááºááẠáááá¯ááºáá®áá±á¬ á¡ááŒá±á¡áá±ááœáẠááŸááá±áá«áááºá
áá±áá¬áá±á·á áºá¡ááŸá¬áž-áá¶ááá¯ááºáááºááŸáá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážá¡ááœáẠááá¬ážááá¯ážáá»ááŒá±ááŸááºážáá»ááºáá áºáá¯ááŸá¬ B-tree áá±ážááœáẠáá±ážááŸááºáá¬ážáá±á¬ ááŸááºáááºáž (WAL) áá¯áááºáž áá±á«áºáá±á¬ áá áºááºá¡ááŒá±áá¶áá±áá¬áááºáá±á¬ááºáá¯á¶á ááœá±áá±ážááœá±áá°ááŸááºáááºážááᯠáááºááá·áºáááºááŒá áºáááºá áááºážááẠB-tree ááá¯ááºááá¯ááºááœááºážáá¶ááŒááºáááºááŒááºážáááŒá¯áá®á áááºááœááºáá¬ážááá·áºáá¯ááºáá±á¬ááºáá»ááºááᯠá¡ááá¡áá»áá±ážáá¬ážáá¬ážááá·áº ááá¯ááºáá áºáá¯ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá ááá¯ááºááá¯ááºá á áºáá±ážáá±á ááºá¡ááœááºáž áá±áá¬áá»ááºá á®ážááŸá¯ááᯠááœá±á·ááŸááá«áá áá±áá¬áá±á·á áºááẠááŸááºáááºážááᯠááá¯ááºááá¯ááºááŸááºážáááºážááẠááá¯ááºáááºááœá±ážááœá±ážáááºá
LMDB ááẠcopy-on-write áá¯áá±á«áºáá±á¬ áááºážá á¡ááŸá¬ážáá¶ááá¯ááºááŸá¯ ááá¹ááá¬ážá¡ááŒá Ạááá°áá®áá±á¬áááºážáááºážááᯠááœá±ážáá»ááºáá²á·áááºá áááºážá á¡ááŸá áºáá¬áááŸá¬ ááŸáááŒá®ážáá¬áž á á¬áá»ááºááŸá¬áá áºáá¯áá±á«áºááŸá áá±áá¬ááᯠááœááºážáá¶ááŒááºážá¡á á¬áž áááºážááᯠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž áá°ážáá°ááŒá®áž áááá¹áá°áá²ááœáẠááŸáááŒá®ážáá¬áž ááŒá¯ááŒááºááœááºážáá¶ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒá¯áá¯ááºááŒááºáž ááŒá áºáááºá
ááá¯á·á¡ááŒááºá á¡ááºááááºáá¯ááºáá¬ážáá±á¬áá±áá¬ááá¯áááŸáááá¯ááºá á±áááºá¡ááœááºá áááºážááŸáá·áºáááºá ááºáá±á¬ parent node ááœáẠáá±á¬ááºáá¯á¶ážáá±á«áºááŒá áºáá±áá±á¬ node ááá¯á· ááá·áºááºááá¯ááŒá±á¬ááºážááẠááá¯á¡ááºáá«áááºá áááºážááᯠááŒá¯ááŒááºááẠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áºá áááºážááá¯áááºáž ááŒáá¯ááẠáá°ážáá°áá¬ážáááºá áá¯ááºáááºážá ááºááẠá¡ááŒá áºá¡áá ááá»á±á¬á·ááŒáẠáááºáááºáá±áá«áááºá áááºáá¬á á¬áá»ááºááŸá¬ááŸá áá±áá¬ááẠááŒá±á¬ááºážáá²ááẠáá±á¬ááºáá¯á¶ážááŒá áºáááºá
á¡ááºááááºáá¯ááºáá¯á¶ážáá¯ááºáááºážá¡ááœááºáž áá¯ááºáááºážá áẠáá¯ááºááááºáá»ááºááœá¬ážáá«áá áááºáá¬á á¬áá»ááºááŸá¬á¡áá áºááᯠáááºáá®ážáááºááá¯ááºáá«á ááá¯á·ááá¯áẠá¡áá¯á¶ážá¡áá áá áºááºááá¯á· á á¬áá±ážáááºááá¯ááºáá«á ááŸáá·áº áááºážá checksum ááẠááŸá¬ážááœááºážáá±áááá·áºáááºá á€ááá á¹á áááºááŸá áºáá¯ááœáẠá á¬áá»ááºááŸá¬á¡áá áºáá»á¬ážááẠáááºááŸááºážááá®ááá¯ááºááŒá áºáᬠá¡áá±á¬ááºážáá»á¬ážááᯠááááá¯ááºá á±áááºááá¯ááºáá«á áááºážááẠáá±áá¬áá®ááœááºááŸá¯ááᯠááááºážááááºážááẠLMDB á¡ááœáẠááŸá±á·ááŸááºááá¯ááºááᯠáá±ážáá¬ážááẠááá¯á¡ááºááŸá¯ááᯠáááºááŸá¬ážáá±ážáá«áááºá á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ áá áºááºáá±á«áºááŸá áá±áá¬ááá¯ááŸá±á¬ááºááŸá¯ááœá²á·á ááºážáá¯á¶ááẠá¡ááŸááºááááºá¡á¬ážááŒáá·áº áááºážááá¯ááºáá±á¬ááºáá»ááºááᯠáá áºááŒáá¯ááºáááºáá¯ááºáá±á¬ááºáááºá áááá»ááŒááºáá¬ážáá±á¬ ááœá±áá±ážááœá±áá°ááŸááºáááºážáááŸáááŒááºážááẠááŒáá·áºáá¬ážáá±á¬áá±áá¬áááºááŸá¯ááŒááºážááŒááºááŸá¯ááºážááᯠáá¶á·ááá¯ážáá±ážááá·áº LMDB áá¡ááºá¹áá«áááºáá»á¬ážáá²ááŸáá áºáá¯ááŒá áºáááºá
append-only B-tree áá¯áá±á«áºáá±á¬ ááááºáááºáá±á¬ááºááŸá¯ááẠááá¬áá¡á¬ážááŒáá·áº ááœá±áá±ážááœá±áá° áá®ážááŒá¬ážááœá²áá¯ááºááŒááºážááŸáá·áº áá¬ážááŸááºážáá»á¬ážá
áœá¬ááᯠáá¶á·ááá¯ážáá±ážáááºá LMDB ááœááºá ááœáá·áºáá¬ážáá±á¬ ááœá±áá±ážááœá±áá°áá
áºáá¯á
á®ááœáẠáááºážááŸáá·áºáááºá
ááºáá±ááá·áº áá±á¬ááºáá¯á¶ážáá±á«áºáá
áºáááºá¡ááŒá
áºáá
áºáá¯ááŸááááºá ááœá±áá±ážááœá±áá°áááŒá®ážáááœá±á·á áááºážááŸáá·áºáááºá
ááºáá±áá±á¬áá
áºáááºáá
á¬áá»ááºááŸá¬áá»á¬ážááá¯áá±áá¬áá¬ážááŸááºážá¡áá
áºá¡ááœááºáááºáá±á¬á·ááŸááŒá±á¬ááºážáá²áááºááá¯ááºáá« ááá¯á·ááá¯áẠááŒááºáááºá¡áá¯á¶ážááŒá¯áááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áºá áááºááẠáááºááá¯ááºáá¬áá±áá¬á¡á
á¯á¶ááŒáá·áº á¡ááá¡áá»ááŒáá¯ááºáááœá±á· áááºá¡áá¯ááºáá¯ááºááá¯ááºááẠááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž áááºááŒáœá
áœá¬ á¡ááºááááºáá¯ááºáá±áá²ááŒá
áºáá±á¬áºáááºáž ááá¯á¡áá»áááºááœáẠááœá±áá±ážááœá±áá°ááœáá·áºááá·áºá¡áá»áááºá á€áááºááŸá¬ LMDB ááᯠáá»áœááºá¯ááºááá¯á·áá»á
áºááŒááºááá¯ážáá±á¬áá°áá»á¬ážá¡ááœáẠá
á¶ááŒáá±áá¬áááºážááŒá
áºááŒá
áºá
á±ááẠáááºá
á¯á¶ááŒá±á¬ááºážáá²ááŒááºážá á¡ááŸá
áºáá¬áááŒá
áºáááºá UICollectionView
. ááœá±áá±ážááœá±áá°áá
áºáá¯ááœáá·áºááŒá®ážáá«áá áááºááẠá¡ááá®áá±ážááŸááºážáááŸááºáá¬ááºááŒá±áá¬ááᯠááá¯ážááŒáŸáá·áºááẠáááá¯á¡ááºáá²á áááºááŸááá±áá¬ááᯠáááºááá¯áá®ááœá²á·á
ááºážáá¯á¶ááá¯á· á¡áá»ááºá¡ááŒááºáá¯ááºáᬠáá¬ááŸááá»ááºáá±á¬á·áááºááᯠááŒá±á¬ááºááœá¶á·áá±áá«áááºá á€á¡ááºá¹áá«áááºááẠLMDB ááᯠáá°áá®áá±á¬ SQLite ááŸáá·áº ááœá²ááŒá¬ážáá±ážáááºá ááá¯áá²á·ááá¯á·áá±á¬ á
á¯á
á¯áá±á«ááºážá¡áá®ážáá»ááºááŸá¯ááᯠáá«ááŒáœá¬ážááááá«á áá±á¬ááºááá¯ááºážááœáẠááœá±áá±ážááœá±áá° ááŸá
áºáá¯ááᯠááœáá·áºááŒá®áž áááºážááá¯á·áá²á០áá
áºáá¯á¡ááœááºáž ááŸááºáááºážáá
áºáá¯ááᯠáá»ááºááá¯ááºááŒááºážááŒáá·áº áá°áá®áá±á¬ ááŸááºáááºážááᯠáá¯ááá áá»ááºáá
áºáá¯á¡ááœááºáž ááááá¯ááºáá±á¬á·áá«á
á¡ááŒáœá±á á±á·áááŸááºáá±á¬áá±ážááẠvirtual memory ááá¯á¶ážá áœá²ááŸá¯áááááá¬áá¬ááŒáá·áºáá¬ážááá¯ááºáá»á±ááŸááááºá áá±áá¬áá±á·á áºá ááœá²ááŒá¬ážáá±á¬áá¬ážááŸááºážáá»á¬ážááᯠááŒáá·áºááŸá¯áá±ááá·áº áá±áá¬áá±á·á áºá ááœá²ááŒá¬ážáá±á¬áá¬ážááŸááºážáá»á¬ážááᯠááŒáá·áºááŸá¯ááá·áº ááœáá·áºáááºáá¬ážáá±á¬ á¡áá±á¬ááºážá¡áááºáá¯ááºáááºáž 3 áá¯ááŒáá·áº áá áºáá»áááºáááºážááœáẠááœááºážáá¶ááŒááºáááºáá«á áá±áá¬áá±á·á áºááœá²á·á ááºážáá¯á¶ááᯠáááá¯ááºááŒáá·áº ááŒááá¬ážáááºá LMDB ááẠá¡ááŸááºáááẠááœá±áá±ážááœá±áá°áá»á¬ážááŸáá·áº áááºá ááºáá±ááá·áº á¡ááŒá áºáá»á¬ážá០áááºááŸááºážáá®ááá¯ááºááá·áº áá¯á¶ááŸááºáá»á¬ážááᯠááŒááºáááºá¡áá¯á¶ážáááŒá¯ááá¯ááºáá±á¬ááŒá±á¬áá·áº ááá¯ááŸá±á¬ááºááŸá¯ááœáẠááœá±ážáá»ááºá áá¬áááŸááá±á¬á·áá² áááºááá¯áá®ááœáẠáá±á¬ááºáááºáá±ážáá¯ááŒá±á¬áẠá¡ááŒá áºááᯠááœá²áá±áá±ážáᬠáááºážá¡á±á¬ááºááœáẠááŒá¯ááŒááºáá¬ážáá±á¬ á á¬áá»ááºááŸá¬áá»á¬ážááᯠáá áºáááºááŒááºááœá¬ážáááºá
á€áá±áá¬ááœáẠáááºááá¯áá®ááŒá±áá¯á¶ááŒá¯áá¯ááºáá¬ážáá±á¬ ááá¯ááºáá»á¬ážáá±á«áºááŸá ááá¹áááᯠááŒááºáááºááááºážáááºážááẠáááá¯á¡ááºáá«á áááºážááẠá¡ááá®áá±ážááŸááºážá ááŸááºáá¬ááºááŒá±áá¬ááᯠá¡áá±á¬ááºá¡áá°áááŒá¯áá±á¬ááŒá±á¬áá·áº virtual memory á áááºáá±á¬ááºážáá¯á¶ážá áœá²ááŸá¯ááẠáá»áœááºá¯ááºááá¯á·ááᯠáá»á¬ážá áœá¬á¡ááŸá±á¬ááºá¡ááŸááºáááŒá áºááá·áºáá±á ááá¯á·áá±á¬áºáááºážá áá áºáá»áááºáááºážááœááºá iOS ááẠáááºážá¡á¬áž ááœá²áá±áá¬ááœáẠá¡ááœááºááœáá·áºááá¯áááºááŒá±á¬ááºáž ááŸááºáá¬ážáá¬ážááŒá®ážá áá»áœááºá¯ááºááá¯á·ááẠáá¬áᬠááá¯á·ááá¯áẠáááºá áºáá±á¬á·ááœáẠ1 terabyte LMDB áá±áááᯠááááºáááá¯á¶ážá០áá¶á·ááá¯ážáá±ážááá¯ááºááŒá®áž á€á¡ááºá¹áá«áááºááŸáá·áºáááºáááºá áá¯á¶ážááá ááºážá á¬ážáá«á ááŒá áºááá¯ááºáá»áŸáẠá¡áá±á¬ááºážá¡áááºá áááºáááºážááᯠáááºááá¯ááºááá»áŸ ááá¯á¡á±á¬áẠáá¬ážááẠááŒáá¯ážá á¬ážááá·áºáááºá
4. áá±á¬á·áááºááá¯áž API áááááºááœáẠáá±áá¬á¡á á®á¡á ááºáá áºáá¯ááᯠáá®ááá¯ááºážááœá²ááŒááºážá
LMDB á០áá¶á·ááá¯ážáá±ážáá¬ážáá±á¬ á¡ááŒá±áᶠabstractions áá»á¬ážááᯠááŒáá·áºááŒááºážááŒáá·áº API ááᯠááœá²ááŒááºážá áááºááŒá¬ááŒáá·áºááŒáá«á áá¯á·á áááºáááºážáá»ááºááŸáá·áº áá±áá¬áá±á·á áºáá»á¬ážá áá±á¬á·áá»á¬ážááŸáá·áº áááºááá¯ážáá»á¬ážá
áá¯ááºá á¬áááºážáá»á¬ážá¡ááŒá±á¬ááºáž ááŸááºáá»ááº
LMDB á¡áá»á¬ážáá°ááŸá¬ API á¡ááœááºážááŸá áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡ááŸá¬ážáá¯ááºáá¯á¶á
á¶ááŒáá·áº áááºážááá¯á·áá¡áá¯ááºáááááºááᯠááŒááºáá±ážáááºá ááá¯á·áá±á¬áº áá±á¬ááºáááºááœá²á
á¬áááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááá»áá±áá»á¬á
á±áááºá¡ááœáẠáááºážáá
á
áºáá±ážááŸá¯ááᯠáá»ááºááŸááºáá¬ážáááºá áááºááœá±á·ááœááºá áá»áœááºá¯ááºááá¯á·ááẠrepository ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºáá¯ááºááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
LMDB ááᯠiOS ááá¯á·ááá¯áẠmacOS ááá±á¬áá»ááºááá¯á· áá»áááºáááºááẠá¡ááŒááºáá¯á¶ážáááºážáááºážá¡áá±ááŒáá·áº áá»áœááºá¯ááºá CocoaPod ááᯠáááºážááŸááºážáá«áááºá
á.áá á¡ááŒá±áᶠ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 ááẠááá·áºá¡ááœáẠááœááºá
áœá¬ááŸá
áºáááºáá«áá áááºážááẠááŸá±á·áááºááœá¬ážááá·áº áááºážáá¯á¶áááºážááœááᯠááŒáá·áºááẠá¡ááŒá±á¬ááºážááŒáá»ááºáá
áºáá¯ááŒá
áºááá¯ááºáááºá
áá¯ááááá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááŸáá·áºáááá¯ááºáá®áá±á¬ áá°áááºážáááºááá¯ážááẠthread áá¯á¶ááŒá¯á¶ááŸá¯ááŸáá
á±ááẠá
ááºááá¯ááºážááá¯ááºáá¬áá»á¬ážááᯠááááºážááŸááá±ážáá«áááºá áá¶ááá±á¬ááºážá
áœá¬ááŒáá·áºá á¡áááºážáá¯á¶áž iOS 10 ááœáẠthread local storage support ááœáẠááŒá¿áá¬áá»á¬ážááŸááááºá á€á¡ááŒá±á¬ááºážááŒá±á¬áá·áºá á¡áááºááá°áá¬ááœááºá repository ááᯠá¡áá¶ááŒáá·áº ááœáá·áºáá¬ážáááºá MDB_NOTLS
. ááá¯á·á¡ááŒáẠááá¯á¡ááºáááºá
áá±áá¬áá±á·á
áá±áá¬áá±á·á áºááẠá¡áááºááœááºááŒá±á¬áá²á·ááá·áº 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 ááᯠá¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá
á¡áá±á¬ááºážá¡áááº
ááœá±áá±ážááœá±áá°á
ááºááᯠá¡áá±ážá
áááºáá±á¬áºááŒáá¬ážáá«áááºá
- á¡ááŒá±áá¶áá¯ááºááá¹ááá¡á¬ážáá¯á¶ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯
á¡ááºáá Ạá¡áááá áá¬ážáá¯á¶ážáá»á¬áž- á¡áá¯ááŒá°á áœááºážá¡á¬ážá áá®ááœááºááŸá¯á á¡áá®ážáá»ááºááŸá¯ááŸáá·áº áá¯á¶ááŒááºá áááºáá»áááŸá¯á macOS ááŸáá·áº iOS ááœáẠáá¬ááŸááºáá¶ááŸá¯á¡á MDBX ááœáẠáá»áœááºááœááºážáá»ááºáá áºáᯠááŸááá±áááºááᯠáááááŒá¯áá«á áááºážááá¯á·á ááœáẠááá¯ááá¯áááºááŸá¯ááá¯ááºáá«áááºáREADME . - Multithreading á¡ááœááºáá»ááºážáááºáá¯á¶ááᯠ"á á¬áá±ážáá°/á á¬áááºáá°á¡áá»á¬ážá¡ááŒá¬áž" á¡á á®á¡á ááºááŒáá·áº áá±á¬áºááŒáá«áááºá á á¬áá±ážááá¬ááœá±á áá áºáá±á¬ááºááá¯áá áºáá±á¬áẠááááºááá¯á·áá¬ážáá±ááá·áº á á¬áááºáá°ááœá±ááá¯áá±á¬á· áááááºáááºáá«áá°ážá á á¬áááºáá°áá»á¬ážááẠá á¬áá±ážááá¬áá»á¬áž ááá¯á·ááá¯áẠá¡áá»ááºážáá»ááºáž áááááºáááºááŒáá«á
- á¡ááá¯ááºá¡áááºáž á¡áá±á¬ááºážá¡áááºáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯á
- 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 á áááºáááá¬ážááá°áá¬ááœáẠá€áá¯ááºáááºážá ááºááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á·á
ááá¬ážááá¬áž
ááá¯ááºááœá²áá
áºáááºáá«ááá·áº ááá¬ážáá
áºáá¯á ááœá²á·á
ááºážáá¯á¶ááᯠáááºááŒááºá
á±ááá·áº áá¯á¶á¡ááŒá±á¡áá±áá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ áá±ážáá¬ážáá±á¬áááºážááœáŸááºáá
áºáá¯á¡ááœááºážáááŸááá±á¬ á¡á
áááºá¡ááá¯ááºážá¡á¬ážáá¯á¶ážááᯠááœá±ážáá»ááºáááºááŒá
áºáááºá á€áá²á·ááá¯á·áá±á¬ áááá±á¬ááºáá±á¬áá±ážááŒááºážááŸá¯áá»á¬ážá¡ááœáẠáá±á¬ááºážáá±á¬áá±áá¬á¡ááœá²á·á¡á
ááºážáá¯á¶á
á¶áá
áºáá¯áááº
á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááẠá¡áá¯ááºá¡áá±á«áºá¡ááŒá±áá¶á bytes á array áá áºáá¯á¡áá±ááŒáá·áº áá±á¬á·áá»á¬ážáááá¯ááºá á¬ážááŒá¯áá¯á¶ááẠáááºááá¯á·áá¯á¶ááá¹áááºááŸááááºááá¯ááŒááá¬ážáááºá ááááŠážá áœá¬á áááºááááºážááœáŸááºá¡ááŸááºá¡áá¬áž (á¡áá®áá±á¬ááº) áá«ááá·áº ááá¯ááºáá»á¬ážááᯠáá¬ážááŸáááŒá®ážáá±á¬áẠá¡áá»áá¯ážá¡á á¬áž (á¡á áááºáž) ááŸáá·áº á¡ááẠ(á¡ááŒá¬) ááá¯á·á á¡ááŒá®ážááœáẠááŸáááŸáá·áºááŒá®ážáá¬ážááŒá áºáááºá áá¯á¶áá± 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 á
ááºáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠááááºážááŒáá·áºááááºážááŸááºáá»á¬ážááᯠáá±á¬áºáááºááŒáá·áº ááááºážáááºážáá¬ážáááºá
// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)
á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážáááºá ááááºážááŒáá·áºáá»á¬ážááᯠbyte ááŸáá¯ááºážááŸááºáááááá¬á¡ááœáẠááá·áºáá»á±á¬áºáá±á¬áá±á¬áºáááºááœáẠáá±á¬á·áá²ááœáẠááááºážáááºážáá¬ážááá«áááºá áááá¬ážá
á¯á០áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠááá¯á¡ááºáá±á¬ á¡ááœááºááŒá±á¬ááºážááŸá¯ááᯠáá±á¬ááºááœááºááá¯ááºááẠáá°áá®áá±ážáá«áááºá hton*
(á¡áá°ážáááŒááºá· htons
á¥ááá¬á¡á¬ážááŒáá·áº double-byte áá¶áá«ááºáá»á¬ážá¡ááœááºá
áááá¯ááááºážáááºážááœáẠá
á¬ááŒá±á¬ááºážáá»á¬ážááᯠááá¯ááºá
á¬ážááŒá¯ááá·áºáá±á¬áºáááºááẠáááºááááá·áºá¡ááá¯ááºáž áá
áºáá¯áá¯á¶ážááŒá
áºáááºá
áá¯áááá¡áá»ááºááá±á¬á· ááááá¬ážáááá·áºá¡áá»ááºáá«á 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 á ááá¯ááºáááºáá±á¬ááºáá¯á¶ááŸáá·áºáááºáááºáá±á¬ áááºáá¬á¡áá»ááºá¡áááºááᯠááááºážáááºážáá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááẠáá°áá®áá±á¬ á¡áá¬ááá¹áá¯ááŸááºáá¬ááºááᯠá áœáá·áºáá áºááŒááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áááºážááá¯á·á á¡ááŸááºá ááºá¡ááá¯áẠááá¯ááºá á¬ážááŒá¯ááŸá¯ááᯠáá¯ááºáá±ážááŒááºážáá¯ááºáááºážá á¡áá±ážáá±ážáá±á¬áºááŒáá»ááºááŸá¬ áááºážááœáŸááºáá áºáá¯á á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠá¡áááºážááá¯áẠá¡ááá·áºááá¯ááºááŒáá·áº á á¶ááá°áá¬áá°áá¬ážááá·áºá¡áá»ááºááŒá áºáááºá
áááºážááᯠ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 áá
áºáá»áá¯ážááᯠáááŸááá«áááºá áá»ááºážáááºááŸá¯á á¡ááŸááá¬ážáá»á¬ážááŸáá·áºá¡áá°á áááºážááŸáá·áºáááºá
ááºáá±áá±á¬ á¡ááºá¹áá«áááºáá»á¬ážá
áœá¬ááᯠááŸááºáá¬ážáá¬ážááẠááá¯á¡ááºáá«áááºá
- áááºáááºáᬠá¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááŒááºážá¡ááœááºá ááœá±áá±ážááœá±áá°ááááºáá»áááºá¡áááᬠáááºááá¯ážáááºáá±á¬ááºáá¯á¶ááá¯á· ááœáŸááºááŒáá»ááºááẠááŸááºáááºááŒá±á¬ááºáž á¡á¬ááá¶áá«áááºá á¡á á±á¬ááá¯ááºážááœááºáá±á¬áºááŒáá²á·ááá·áºá¡ááá¯ááºážá áá°ážáá°áá±ážáá¬ážááŒááºážáááá¬áááŒá±á¬áá·áº á¡áá¬ááá¹áá¯áááºááŸáááá·áº B-tree áá á¬áá»ááºááŸá¬áá»á¬ážááẠáááºážááá¯á·ááᯠá¡áááºážáá¯á¶áž ááœá±áá±ážááœá±áá°áá áºáá¯á០áááºááœáŸááºážáááœá±á· áááŒá±á¬ááºážáá²áá«á áá áºáá»áááºáááºážááŸá¬áááºá áááºážááá¯á·ááŸáá·áº áááºá ááºáá±ááá·áº áá±á¬ááºáá¯á¶áž ááœá±áá±ážááœá±áá° ááŒá®ážáááºááŸáá·áºá á á¬áá»ááºááŸá¬áá»á¬ážááᯠáá±áá¬á¡áá áºá¡ááœáẠááŒááºáá¯á¶ážááá¯ááºáááºá áááºážááá¯á·ááᯠáááºáá®ážáá¬ážáá±á¬ á¡áá±á¬ááºážá¡áááºáá¯ááºáááºážá០ááŸááºáááºááẠá¡áá¬ááá¹áá¯áá»á¬áž ááá¯á¡ááºáá«áá áááºážááá¯á·ááᯠáá°ážáá°áá¬ážááẠááá¯á¡ááºáá«áááºá
- áááºááŒá®ážáá±á¬ ááœá±áá±ážááœá±áá°á¡ááœááºá ááááºááœá²á·á ááºážáá¯á¶-áááºááá¯ážááá¯á· ááœáŸááºááŒááá·áºá¡áá»ááºááẠáááááœááºážáá¶ááŒááºážáá¯ááºáááºážá áẠ(áá±áá¬áá±ážáá¬ážááŒááºáž ááá¯á·ááá¯áẠáá»ááºááŒááºáž) áááá¯ááºáá®á¡áááᬠá¡áá»á¯á¶ážáááºáááºááŒá áºáááºá
- áá«áá±á¬áẠááœá²á·á
ááºážáá¯á¶
NodeValue
ááŒáá·áºá á¯á¶ááŸá¯áááŸááá±á¬áºáááºáž ááŒááºáá±á¬ááºáá¬ážááẠ(á¡ááá¯ááºážááœá² "ááŒááºáááŸáá¯ááºážááŸááºáá°á០áá±á¬á·áá»á¬ážááᯠááŸá¬áá°ááŒááºáž" ááá¯ááŒáá·áºáá«)á ááœáŸááºááŒáá»ááºááŸáá áºááá·áºá áááºááẠáááºážáá¡ááœááºáá»á¬ážááᯠá¡ááœááºááá° áááºáá±á¬ááºááá¯ááºáááºá á¡áááááá±á¬á· á¡á²áá«ááᯠááŸá±á¬áá·áºááŸááºááá¯á· ááá¯ááºáá°ážá - áááºááá·áºá¡ááŒá±á¡áá±áá»áá¯ážááœááºáááᯠáááºáá¶áááŸááá±á¬ááœáŸááºááŒáá»ááºááŒáá·áº ááœá²á·á
ááºážáááºáá±á¬ááºáá¯á¶ááᯠááœááºážáá¶ááŒááºáááºááá¯ááºáááºá ááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠáááºážáááºážááŒáá·áºáᬠááŒá¯áá¯ááºááá«áááºá
mdb_put
. ááá¯á·áá±á¬áºá á€ááœá²á·á ááºážáá¯á¶áááºááŸááᬠáááºááá¯áá®á§áááá¬ááᯠreadonly mode ááœáẠáá¯á¶áá±á¬áºáá¬ážáá±á¬ááŒá±á¬áá·áº áááºážááá¯ááŒá¯áá¯ááºááá¯ááá·áºááá¹áá¡á¬ážáá¯á¶ážááŒáá·áº áááºážááẠá¡áá¯ááºáááŒá áºáá«á - á¥ááá¬á¡á¬ážááŒáá·áºá áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á á¡áá»á¬ážáá¯á¶ážááá¯ááŸá±á¬ááºááŸá¯á¡ááœááºá¡á
á¬ážááᯠááá¯ážááŒáŸáá·áºáááºá¡ááœáẠáá¯ááºáááºážá
ááºáá
áºáá¯á ááááºá
á¬áá±áá¬ááá¯á· ááá¯ááºáá
áºáá¯ááᯠááŒááºáááºáá¯á¶áá±á¬áºáá«á
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 ááœáẠá¡áá¬ážáá°á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááŸáááá¯ááºáááºá
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 ááŒáá·áº áŠážá
áœá¬ á¡áááá·áºáá±ážáááºá ááá¯á·ááŒá±á¬áá·áº áááºážááá¬á¡áá ááá¯ááºááœá²áá
áºáá¯á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááá°ááŒááºážááá¬áááºááŸá¬ áá®ážá¡á¯ááºá
á¯áá¡áá±á«áºááá¯ááºážáá±á¬ááºááœáẠáá¬áá¬ááᯠáá±ážáá¬ážááá·áºááŸá±á·áááºáá
áºáá¯ááŒáá·áº áá¬áá¬ááᯠáá±áá¬áá»áᬠáá±á¬ááºááœáẠá¡á±á¬ááºáááºáááºááááááºááᯠáááºáá¬áááºáᬠááŒá¯áá¯ááºááŒááºážááŒá
áºáááºá
á ááºáááºáááŒááºááŸá¬ááœá±ááŒááºážááŒáá·áº á¡áááºááá¯ááºáž "ááá°ážáá±á«áº" ááᯠáááºááœá±á·ááá¯ááºáááºá ááá¯ááá¯á·áá¯ááºáá±á¬ááºáááºá áá±áá¬áá±á·á áºááŸá áá±á¬á·áá»á¬ážá á¬áááºážáá áºáá¯áá¯á¶ážáá¡á ááœáẠáá¬áá¬ááᯠáá»áá¬ážááŒá®ážáá±á¬áẠáááºááááºážááœáŸááºá¡ááŸááºá¡áá¬ážáá«áá±á¬ áá±á¬á·ááᯠáááºážá¡á±á¬ááºááœáẠáá±á«áºáá¬áááºá¡áá ááá¯ážááŒáŸáá·áºáá¬ážáááºá á€áá»ááºážáááºááŸá¯ááœáẠáááá¬áááºááŸá¬ážáá±á¬ á¡á¬ážáááºážáá»áẠá áá¯ááŸááááºá
- ááŸá¬ááœá±ááŸá¯ááá»ááºážááŒá±á¬áá·áºááŸá¯ááºááœá±ážááŸá¯ááẠáááºááááá·áºá¡ááá¯ááºážáááºá áá±áá¯áá»á¡á¬ážááŒáá·áº áá áºáááºáá»á¬ážááŸáá·áº á¡áá°ážáááŒáá·áº B-tree ááœááºá áááºážááᯠlogarithmic á¡áá»áááºá¡ááœááºáž áá¯ááºáá±á¬ááºááá¯ááºáááºá
- á¡áá»ááºážááŸá®ážáá«áá²á ááá¯áá»ááºáá²á· á á¬áá»ááºááŸá¬ááœá±ááẠá á¬áá»ááºááŸá¬á¡á¬ážáá¯á¶ážááᯠááá¯ááºááá± áááºáááŸááºáá¬ááºáá® ááŒáŸáá·áºáááºáá±ážáááºá á¡ááœááºá á»á±ážááŒá®ážáááºá
áá¶áá±á¬ááºážáá±á¬ááºáá
áœá¬á 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 ááŒáá·áº áá®ááá¯ááºážáá±ážááœá²ááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážááá¯ááºáᬠááá¹áá¡á¬ážáá¯á¶ážááᯠáá¯á¶ážáááºááá¯ááºáá²á·áááºá ááá¬ážáá áºáá¯ááẠá¡áá»áá¯ážá¡á á¬ážáá°áá±á¬ áá±á¬á·áááºááá¯ážá¡ááœá²áá»á¬áž áá«áááºáá±á¬ á¡áá»áá¯ážá¡á á¬ážááœá²áá¬ážáá±á¬ ááŸááºáááºážá¡á á¯áá áºáá¯ááŒá áºáááºáᯠáá»áœááºá¯ááºááá¯á·ááŒá±á¬ááá¯ááºáááºá á¡áááºá áááºááẠáá±á¬á·ááᯠáá±á¬áá·áºááŸááºá áá¯áá¶á¡ááŒá áºááŸáá·áº áááºážááááºá ááºáááºááá¯ážááᯠá¡ááœááºáá áºáá¯á¡ááŒá ẠááŒááá«áá áááºááẠáá±áá¬áá±á·á áºá áá¯ááºáá¯á¶áá¬ážáá»ááºáá áºáá¯ááᯠáááºáááŸááááºááŒá áºáááºá
â
ááá¯á·áá±á¬áº áááºááœá±á·ááááœáẠá€áá»áŸáá±á¬áẠááœá±ážáááºážáááºážááŒáá·áº ááŒááºáááºážááẠáááŒá áºááá¯ááºáá±á áá±áá¬áá±á·á áºáá áºáá¯ááœáẠáááŒá¬ááááá¯áááá¯á ááááŠážá áœá¬á ááá¬ážá¡áá»á¬ážá¡ááŒá¬ážááŸááááºá áá¯áááá¡áá»ááºááŸá¬áá°ááá®ážááŸáá·áºááá°áá±á¬á¡á á®á¡á á¥áºá¡á áááºážááá¯á·ááœááºááœá±ážáá»ááºááŸá¯áá»á¬ážááá¯áá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá«áááºá á€áá±á¬ááºáá¯á¶ážá¡ááá¯ááºážááᯠáááºážááá¯á·á áááºáá®ážááŸá¯ááŸáá·áº á¡ááŒááºá¡ááŸááºáá»áááºáááºááŸá¯ááá¯ááºáᬠááŒá¿áá¬áá»á¬ážá¡ááœáẠá¡á¬áá¯á¶á áá¯ááºáá¬ážáááºá
á¡ááœáŸááºážááá¬ážáá»á¬áž
cloud á¡ááºááºááœáẠ"ááŒáááºáž" ááá¹ááá áºáᯠááŸááááºá áááºážááẠáááºá áœá²á¡ááá¯ááºá á®áá¬ážáá±á¬ cloud áá áºáá¯áá¯á¶ážá០áá®áá®áá¬á¡ááŒá±á¬ááºážá¡áá¬ááᯠááŒááááºá ááá¯ááá¯á·áá±á¬ááœá±ážáá»ááºááŸá¯ááᯠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠáááºáááá¬ážáá±ážááœááºá áá±á¬á·á¡áá»áá¯ážá¡á á¬ážá¡áá áºááŒáá·áº áá±á¬ááºáááºáá áºáá¯ááᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá áááºážááá¯á·ááœáẠááá¯ááºááá¯áááºáá®ážááá·áºáá±á·á áœá²áá«ááŸáááá·áº á¡ááœááºáá áºáá¯áá«ááŸááááºááŒá áºááŒá®ážá áááºážááœáẠáááºááááºážá á®ááŒááºážá á¶ááŸá¯ááºážá¡ááŒá Ạáá¯ááºáá±á¬ááºáááºááŒá áºáááºá áá±á¬á·á¡áá áºáá»á¬ážááẠá¡áááºážáá¶ááá¬ážááŸá áá±á¬á·áá»á¬ážááŸáá·áº áá°áá®áá±á¬áá±áá¬ááᯠáááºááœáŸááºážáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááᯠá¡ááœáŸááºážáá®ážáá»á¬ážáá¯áá±á«áºáááºá áááºážááá¯á·ááᯠá¡á±á¬ááºáá«áá¯á¶ááœáẠáááá¹áá±á¬áºáá±á¬ááºááŒáá·áº áá®ážáá±á¬ááºážááá¯ážááŒáá¬ážáááºá
áá°áá®áá±á¬áá±áá¬áá±á·á áºá¡ááœááºáž ááá°áá®áá±á¬ááá¬ážáá»á¬ážááá±á¬á·áá»á¬ážááᯠááœá²áá¯ááºáááºá¡ááœááºá áááºážááá¯á·á¡á¬ážáá¯á¶ážááœáẠá¡ááá¯áááºážááá¬ááá¯ááºáá¬áááºááẠtableId ááᯠááá·áºááœááºážáá¬ážáááºá á á®á á¥áºááŒááºážá¡ááœáẠá¡ááŒáá·áºáá¯á¶ážáŠážá á¬ážáá±ážá¡ááŒá ẠááŒá¯áá¯ááºááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºá ááºážáá»ááºážáá»á¬ážááŸáá·áºá¡áá® áá±á¬á·áá»á¬ážááᯠááá¬ážáá»á¬ážááŒáá·áº áŠážá áœá¬á¡á¯ááºá á¯ááœá²á·áᬠááá¬ážáá»á¬ážá¡ááœááºážá ááŸáááŒá®ážááŒá áºáááºá
á¡ááœáŸááºážáá®ážááẠá¡ááááá±á¬á·áá²á·ááá¯á· áá°áá®áá±á¬áá±áá¬ááᯠáááºááœáŸááºážáááºá áááºááá±á¬á·ááááºááá¯ážáá¡á áááºá¡ááá¯ááºážáá áºáá¯ááŸáá·áº áá»áááºáááºááŒááºážááŒáá·áº á€ááá¯ááºááá¯ááºááŸá¯á ááá¯ážááŸááºážáá±á¬á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááẠáá áºááŒáááºáááºážááœáẠáá»á¬ážá áœá¬áá±á¬ááŸá¯áá±á¬áá·áºá០á¡ááá·áºáá»á±á¬áºáá¯á¶ážááŒá áºáááº-
- á¡á¬áá¬áááᯠááááºážááá¯ááºáá¬ážááá·áº ááŸá¯áá±á¬áá·áºááŸááŒáá·áºáá»áŸáẠáááºáá¬áá±áá¬ááẠá¡ááœááºááŒáœááºáááá¯ááºáááºá
- á áœááºážáá±á¬ááºáááºááŸá¯áá±á¬áá·áºááŸáá±á node áááºáá¬áá±áá¬ááᯠá¡ááºááááºáá¯ááºáá±á¬á¡áá«ááœááºá áááºááẠáá±á¬á·ááŸá áºáá¯ááᯠáááºáá±ážááááºááŒá áºáá«áááºá
- áá¯ááºáá¶á·ááá¯ážááŸá¯áááŸá¯áá±á¬áá·áºááŸááŒáá·áºáá»áŸááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á·áá áºáá¯á¡ááœáẠáá±áá¬ááᯠááœááºážáá¶áááºáá±á·ááœá¬ážáá«á ááá¯ááŸá±á¬ááºááŸá¯ááœáẠáá±áá¬ááá®ááœááºááŸá¯ ááááºááœá±á·áá±á¬ áá»áá¯á·ááœááºážáá»ááºáá áºáᯠáááŸááááºááŒá áºáááºá
áááºáááºá á€áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááᯠáááºááá¯á·áááºááŸá¬ážááááºááᯠáá»áœááºá¯ááºááá¯á·á ááºážá á¬ážáá«áááºá
ááá¬ážáá»á¬ážá¡ááŒá¬ážáááºáá¶áá±ážá¡ááœá²á·á¡á ááºáž
áá¯á¶á á¶ááẠá¡ááœáŸááºážááá¬ážáá áºáá¯ááᯠáááºááá áºáá¯ááŸáá·áº áá»áááºáááºáááºá¡ááœáẠáá±á¬ááºážááœááºááá·áºáá»á±á¬áºáááºá "áá±á¬á·áááºááá¯ážá¡ááá¯ááºáž". áááºážáá¡áááºáá±á¬áºááŒááá·áºá¡ááá¯ááºáž á¡ááœáŸááºážááŸááºáááºážááááºááá¯ážááẠáááºááá±á¬á·áááºááá¯ážááááá¹áá°ááŒá áºáááºá á€áááºážáááºážááẠáá°áááŸááºáááºážá áááºááá¯ážá¡ááá¯ááºážááᯠááááºážáááºážááŒááºážááŸáá·áº áááºá ááºáá±áá±á¬ á¡áááºáá±á¬áºááŒáá« á¡á¬ážáááºážáá»ááºá¡á¬ážáá¯á¶ážááᯠáááºááŸá¬ážáá±ážáá«áááºá áá áºáá¯áááºážáá±á¬á¡áááŒá±ážááœá±ááŸá¬ index key ááŸáááºááá¯ážááá¯ááá°áááºá áá áºáá¯á¡á á¬áž database ááá¯á· queries 2 áá¯ááŒá¯áá¯ááºáááºááá¯á¡ááºáá«áááºá ááá¬ážááœááºá¡á ááœááºáá±á«áºáá¬áá±á¬ database schema ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
ááá¬ážáá»á¬ážááŒá¬áž áááºáá¶áá±ážááᯠá á®á ááºááŒááºážá¡ááœáẠáá±á¬ááºáááºáá¯á¶á á¶áá áºáá¯ááŒá áºáááºá "áááá¯áá±á¬á·áá±á¬áá±á¬á·". áááºážáá¡ááŸá áºáá¬áááŸá¬ á¡áá»áá¯ážá¡á á¬ážááœá²áááºáááá¯á¡ááºáá² áááºá ááºáá±á¬á·ááá¯ááŒááºáááºáááºáá®ážáááºá¡ááœáẠáá±á¬á·á¡á¬áž áááºáá±á¬ááºážáá¯ááºááá¹áááá»á¬ážááá·áºáááºááŒá áºáá«áááºáááá¯á·áá±á¬áº Mail.ru Cloud á¡ááá®áá±ážááŸááºážááœááºáááºážáá¡áá¯á¶ážááŒá¯ááŸá¯á¡á á áºá¡ááŸááºá¥ááá¬áá»á¬ážááŸááá«áááºá áááºááŸááºáá¬ážáá±á¬ iOS áá°áá±á¬ááºáá»á¬ážá áááºá ááºááŸá¯á á áááºáá°ážáááºáááºáá±á¬á ááá¯á·áá±á¬áº ááá¯ááá¯áá¬ážáááºááá¯ááºáá±á¬ á¥ááá¬áá áºáá¯áá±ážáá«áááºá
Cloud ááá¯ááá¯ááºáž áá¯á¶ážá áœá²áá°áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áá° á¡ááŒá¬ážáá°áá»á¬ážááŸáá·áº áá»áŸáá±áá¬ážááá·áº ááá¯ááºáá»á¬ážááŸáá·áº ááá¯ááºááœá²áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒáááá·áº á á¬áá»ááºááŸá¬áá áºáᯠááŸááááºá ááá¯ááá¯á·áá±á¬ááá¯ááºáá»á¬ážá¡áá±á¬áºáá±ážáááºážáá«ážááŒá®áž áááºážááá¯á·ááŸáá·áºáááºá ááºáá±áá±á¬ áá°ááááŸááºááŒá¬ážáá±á¬áºááŒááŒááºážááá¯ááºáᬠáááá»áá±á¬á¡áá»ááºá¡áááºáá»á¬ážá áœá¬ááŸááá±á¬ááŒá±á¬áá·áº (áááºáá°á·ááá¯áááºáá±á¬ááºááœáá·áºá áááºááá·áºá¡ááœáá·áºá¡áá±ážáá»á¬ážááŸáá·áºá¡áá°)á áááºážááá¯áááºááá¯ážáá¡á áááºá¡ááá¯ááºážááŒáá·áºáááºáá¯ááºáááºááá¯ážááŒá áºá á±áááºááá¯ááºáá«á áááºáááá¬ážááœááºáá«áááºááŸá¯á ááá¯á·áá±á¬áºá áááºááẠááá¯áá²á·ááá¯á·áá±á¬ááá¯ááºáá»á¬ážááᯠá¡á±á¬á·ááºááá¯ááºážááŒáááá¯áá«áá áááºážááᯠáá áºáá±áá¬áá¬ááœáẠááááºážáááºážáá¬ážááẠááá¯á¡ááºáá±ážáááºá ááá¬áááŒá±ááŸááºážáá»ááºáá áºáá¯ááẠáááºážá¡ááœáẠáá®ážááŒá¬ážááá¬ážáá áºáᯠáááºáá®ážáááºááŒá áºáááºá á¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááœááºá áááºážááá±á¬á·ááᯠ"P" ááŒáá·áºááŸá±á·áááºáá¬ážááŒá®áž "propname" placeholder ááᯠááá¯ááá¯áááá»áá±á¬áááºááá¯áž "public info" ááŒáá·áº á¡á á¬ážááá¯ážááá¯ááºáá«áááºá
ááá¬ážá¡áá áºááᯠáááºáá®ážáá²á·ááŒááºážá¡ááœáẠáá°ážááŒá¬ážáá±á¬ áááºáá¬áá±áá¬á¡á¬ážáá¯á¶ážááᯠááŸááºáááºážááááºááá¯ážááá¯á· ááœáŸá±á·áá¬ážáááºá áá áºáá»áááºáááºážááŸá¬áááºá áááºáááá¬ážááœáẠááááºážáááºážáá¬ážááŒá®ážááŒá áºáá±á¬ ááá¯ááºáá»á¬ážááŸáá·áº ááá¯ááºááœá²áá»á¬ážá¡ááŒá±á¬ááºáž áá±áá¬ááᯠáááœá¬ážáá»ááºáá«á áááºážá¡á á¬ážá áááá¯á¡ááºáá±á¬áá±áá¬ááᯠ"node ID" ááŸáá·áº "timestamp" á¡ááœááºáá¯á¶á á¶ááŒáá·áº "P" áá±á¬á·ááá¯á· áá±á«ááºážááá·áºáááºá áááºážááá¯á·á¡á¬áž áá»á±ážáá°ážáááºá áœá¬ááŒáá·áºá áááºááẠá¡ááááá±á¬á·ááᯠáááºáááá¯ááºáááŒáá·áº á¡ááœáŸááºážáá®ážáá áºáá¯ááᯠáááºáá±á¬ááºááá¯ááºááŒá®ážá áááºážááŒáá·áº áá±á¬ááºáá¯á¶ážááœáẠnode á metadata ááᯠáááºáááá¯ááºáááºááŒá áºáááºá
áááá¯á¶áž
áá»áœááºá¯ááºááá¯á·ááẠLMDB á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááááºáá»á¬ážááᯠá¡ááŒá¯ááá±á¬ááŒáá·áº á¡áá²ááŒááºáá«áááºá áááºážááŒá®ážáá±á¬ááºá á¡ááá®áá±ážááŸááºážá¡á±ážáá²ááŒááºážá¡áá±á¡ááœáẠ30% áá»á±á¬á·áá»ááœá¬ážáááºá
áá¯ááºáá±á¬ááºáá²á·áá±á¬ ááááºáá»á¬ážááẠiOS á¡ááœá²á·á¡ááŒááºáááºááœáẠáá¯á¶á·ááŒááºááŸá¯áá
áºáᯠááœá±á·ááŸááá²á·áááºá áá±á¬áá±á¬áááºááœááºá Android á¡ááá®áá±ážááŸááºážááŸá á¡ááá "Files" ááá¹ááá»á¬ážáá²ááŸáá
áºáá¯ááẠLMDB ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž á¡ááŒá¬ážá¡ááá¯ááºážáá»á¬ážáááºáž áá¯ááºáá±á¬ááºáá±áá«áááºá áá±á¬á·áááºááá¯áž ááá¯ááŸá±á¬ááºááŸá¯ááᯠá¡áá±á¬ááºá¡ááẠáá±á¬áºááá·áº C áá¬áá¬á
áá¬ážááẠá¡ááºááºáá®áá±ážááŸááºážááᯠC++ áá¬áá¬á
áá¬ážááŒáá·áº ááŒááºáá»á±á¬áºááá·áº ááááºáá±á¬ááºážááᯠá¡á
ááá¯ááºážááœáẠáá±á«ááºážá
ááºááŒá¯áá¯ááºááá¯ááºááẠá¡áá±á¬ááºá¡áá°áá±á¬ááºážáá
áºáá¯ááŒá
áºáááºá Objective-C ááŸáá·áº Kotlin ááŸá ááááºáá±á¬ááºážáá¯ááºááŒáá·áº ááœááºáá±á«áºáá¬áá±á¬ C ++ á
á¬ááŒáá·áºááá¯ááºá áá»á±á¬ááœá±á·á
áœá¬áá»áááºáááºááŸá¯á¡ááœááºá áá¯ááºáá¯ááºáá¯ááºáá°á¡á¬áž á¡áá¯á¶ážááŒá¯áá²á·áááºá
source: www.habr.com