ืืกืชืื 2019, ืืืจืืข ืืืืืื ืืชืจืืฉ ืืฆืืืช Mail.ru Cloud iOS. ืืกื ืื ืชืื ืื ืืจืืฉื ืืืืกืื ืืชืืฉื ืฉื ืืฆื ืืืฉืืืื ืืคื ืืงืืืื ืืืื ืขืืืจ ืืขืืื ืื ืืื
ืชืืื
ืืืืืืฆืื ืืืืฉืื ืืืฆืื LMDB ืฉืืืฉื ืขืืืืื ืฉื LMDB
3.1.ืืืืืชื ืืก' 1. ืงืืฆืื ืืืืคื ืืืืจืื
3.2.ืืืืืชื ืืก' 2. B+-ืขืฅ
3.3.ืืืืืชื ืืก' 3. ืืขืชืง-ืขื-ืืชืืื ืขืืฆืื ืกืืืืช ื ืชืื ืื ืขื ืืื ื-API ืฉื ืืคืชื-ืขืจื
4.1.ืืคืฉืืืช ืืกืืกืืืช
4.2.ืืืืื ืืช ืฉืืืื
4.3.ืืืืื ืืช ืืืกืื ืืื ืืืืืืช
1. ืื ืขื ืืืืฉืื
ืฉื ื ืืืช ืืฉื ืช 2015, ืืจืื ื ืืืืื ืืืืื ืชืืืจืืช ืืืืฉืง ืฉื ืืืคืืืงืฆืื ืฉืื ื ืืคืืจ. ืขืฉืื ื ืืช ืื ืืกืืื ืืกืืืืช. ืงืืืื ื ืชืืื ืืช ืชืืืคืืช ืืืชืจ ืขื ืื ืฉืืคืขืืื ืืืคืืืงืฆืื ืืคืกืืงื ืืืืื ืืคืขืืืืช ืืืฉืชืืฉ: ืื ื ืืชื ืืืืืฅ ืขื ืืคืชืืจืื, ืจืฉืืืืช ืื ืืืืืืช ืืื'. ืขื ืืื ืืงืช ืืืืืืืช
ืชืืฆืืืช ืืืืืื ืืคืื ืขืืืจื ื ืืืงืืืช ืงืจื. ืืชืืจืจ ืฉืืฉ ืืจืื ืืืชืจ ืืขืืืช ืื ืืจืืืช ืืืงืคืืืช ืืื ืืืช ืืืจืช. ืื ืืคื ื ืฉืืืื ื ืืช ืืขืืืื ืืื, ืืืื ืืืงืืืจ ืืืื ื ืืขืืงืจื ืืืืืืช ืืื ืืื ืืชืจืกืงืืช, ืื ืืืืจ ืืืชืืงืืืช
ืืืืจ ืฉืื ื
ืืืื ืืฉืืงื ืื ืฉื ืืจืืื ืืืขืจืืช ืื ืื ืฉืืจืืืื ืืืืืืื ืืืคื ืืืืืช ืืืืืช ืืฉื ืืื ืฉืื. ืืืื ืืืืืืงืืื ืื ืืืืืื ืืืฆืืช ืืช ืืืืืืช ืื ืื. ืืื ืขืืฉืื ืืช ืื ืื ืืคืขืืื ืืคื ืืฉื, ืืื ืืืขื ืื ืืืื ืืืื ืืงืื...
โืืกืืก ืื ืชืื ืื ืืื ืืื ืืืจืืืื ืืืกืื ืืชืจืฉืื ืืืืฆื. ืืืฉืืื ืืขืืงืจืืช ืฉืื ืืื ืืืืฉื ืืช ืชืื ืืช ืืืืงืจื
ืืืืจื ืืืฉืืขืืชื ืืฉื ื ืฉืืฉืคืืข ืขื ืืืืจืช ืืกื ืื ืชืื ืื ืืื API ืืขื ื ืฉืื ื. ืืื ื ืืฆืจ ืืืฉืจืืช ืืืฉืช ืืกื ืืจืื ืฉืืืืฆื git. ืืืืื, ืืืืื ื ืืืื
ืื, ืื ืืชื ืืืืืื ืืช git, ืฉืืืื ืืืฆืืข ืคืงืืืช pull, ืืืงืื ืืืืื ืชืืงืื ืื ืขื ืชืืื ืช ืืฆื ืืงืืืืช, ืืฉืืื ืืช ืืืฆื ืืืื ืฉืื ืขื ืืฆื ืืฉืจืช ืืืื, ืื ืืืื ืื ืืืฉื ืื ืืืืืง ืืืฆื ืืกื ืืจืื ืืชืจืืฉ ืืขื ื ืืงืืืืช. ืงื ืื ืืฉ ืฉืืื ืืืืฉื ืืช ืื, ืืชื ืฆืจืื ืืืงืฆืืช ืฉื ื ืขืฆื DOM ืืืืืจืื ืขื ืืื-ืืืืข ืขื ืื ืืฉืจืชืื ืืืงืืฆืื ืืืงืืืืื. ืืกืชืืจ ืฉืื ืืฉืชืืฉ ืืืืกื 500 ืืืฃ ืงืืฆืื ืืขื ื, ืื ืืื ืืกื ืืจื ืืืชื ืืฉ ืฆืืจื ืืืฆืืจ ืืืืฉ ืืืืจืืก ืฉื ื ืขืฆืื ืขื ืืืืืื ืฆืืชืื. ืืื ืื ืฆืืืช ืืื ืืฆืจืฃ ืืืืื ืืจืฃ ืฉื ืืืืืืงืื ืืฉื ื. ืืืืจ ืื, ืชืืฆืืืช ืืคืจืืคืื ืืื ืฆืคืืืืช. ืืชืืจืจ ืฉืื ืืื ืืงืืช ืืืฉืืื ืืช ืืืืืจืืชื ืืืืืื, ืขืฆื ืืืื ืืืฆืืจื ืืืืฉืืื ืฉื ืืกืคืจ ืขืฆืื ืฉื ืืคืฆืื ืงืื ืื ืขืืื ืืืืจื ืื ืงืื ื.ืืืฆื ืืืืืจ ืืฉื ืืขืืืื ืฉืคืขืืืช ืืกื ืืจืื ืืืกืืกืืช ืืืืื ืืืกืคืจ ืจื. ืฉื ืกืงืจืืคืืื ืฉื ืืฉืชืืฉืื. ืืชืืฆืื ืืื, ืื ื ืืชืงื ืื ืืช ืืงืจืืืจืืื ืืืฉืื ืืฉื ื ืืืืืจืช ืืกื ื ืชืื ืื - ืืืืืืช ืืืืฉื ืคืขืืืืช CRUD ืืื ืืงืฆืื ืืื ืืืช ืฉื ืืืืืืงืืื.
ืืจืืฉืืช ืืืจืืช ืืกืืจืชืืืช ืืืชืจ ืืื ืืจืฉืืื ืฉืืื ืืื ืืืืงืื.
- ืืืืืืช ืืืืื.
- ืจืืืื ืขืืืืืื. ืืืืชื ืขื ืืื ืืจืฆืื ืืืฉืชืืฉ ืืืืชื ืืืคืข ืืกื ื ืชืื ืื ืืื ืืกื ืืจื ืืฆื ืื ืจืง ืืื ืฉืจืฉืืจืื, ืืื ืื ืืื ืืืคืืืงืฆืื ืืจืืฉืืช ืืืจืืืืช iOS.
- ืืืืืืช ืืืืฆื ืืฉืืืืช ืืืืืกื ืืช ืืืืืืืงืืื ืฉืืื ื ื ืืชื ืื ืืฉืื ืื
- ืืื ืืงืฆืืืช ืืื ืืืืช ืืชืื ืคืขืืืืช CRUD.
- ืชืืืื ืืขืกืงืืืช ืขืืืจ ื ืืกืื ืืกืืกืืื
ACID : ืืืืืืืช, ืขืงืืืืช, ืืืืื ืืืืื ืืช. - ืืืืจืืช ืขื ืืืงืจืื ืืคืืคืืืจืืื ืืืืชืจ.
ืขื ืกื ืืจืืฉืืช ืื, SQLite ืืืืชื ืื ืฉืืจื ืืืืจื ืืืื. ืืืื, ืืืกืืจืช ืืืงืจ ืืืืืคืืช, ื ืชืงืืชื ืืกืคืจ
2. ืืืฆืื LMDB
LMDB ืืื ืกืคืจืืื ืงืื ื ืืืื (ืจืง 10K ืฉืืจืืช) ืืืืืฉืืช ืืช ืืฉืืื ืืืกืืกืืช ืื ืืืื ืืืืชืจ ืฉื ืืกืื ื ืชืื ืื - ืืืกืื.
ืืชืจืฉืื ืฉืืืขืื ืืจืื ืฉืืฉืืืืช LMDB ืขื SQLite, ืฉืื ืืืืฉืืช ืจืืืช ืืืืืืช ืืืชืจ, ืืืจื ืืื ืืื ื ื ืืื ื ืืืชืจ ืืืฉืจ SQLite ืขื Core Data. ืื ืืืื ืืืื ืืืชืจ ืืฆืื ืืช ืืืชื ืื ืืขื ืืืกืื ืืืชืืจืื ืฉืืืื - BerkeleyDB, LevelDB, Sophia, RocksDB ืืื'. ืืฉื ื ืืคืืื ืคืืชืืืื ืฉืืื LMDB ืคืืขื ืืจืืื ืื ืืข ืืืกืื ืขืืืจ SQLite. ืื ืืกืื ืืจืืฉืื ืืื ืืื ื-2012
LMDB ืืฉืืฉ ืืขืืงืจ ืืื ืืข ืืืกืืกื ื ืชืื ืื ืฉื ืืืฉืืืื. ืืกืคืจืืื ืืืืืช ืืช ืืืจืื ืฉืื ืืืคืชืืื
LMDB ืืฉืืฉ ืืขืชืื ืงืจืืืืช ืืืืกืื ืืคื ืฉืืื. ืืืืืื, ืืคืืคื Mozilla Firefox
ืืื ืืข ืืืืืข ืืช ืืืชืื ืื ืืขืืื ืคืืชืื ืืืืืืื. ืขืงืืืช ืืฉืืืืฉ ืื ืืืืืื ืืืืืช
LMDB ื ืืืืช ืืืฆืืื ืขื ืืงืื ืืฉืืฉ ืื ืืฉื ืฉืืฉืืืจื BerkeleyDB ืืืืจ ืฉืืืืขื ืืฉืืืืชื ืฉื ืืืจืงื. ืืกืคืจืืื ืืืืื ืขื ืืืืืจืืช ืืืืืื ืืช ืฉืื, ืืคืืื ืืืฉืืืื ืืขืืืชืื. ืืืืืข, ืืื ืืจืืืืช ืฆืืจืืื ืืื ื, ืืื ื ืจืืฆื ืืืืืืฉ ืืช ืืคืฉืจื ืฉืชืฆืืจืื ืืืชืืืื ืืืชื ืืืืืจื ืืื LMDB ื-SQLite. ืืชืจืฉืื ืืขืื ืืืืื ืืืืจืืจ ืืืฆื ืืืฉืืช ืืืืจืืช ืืืืืจืช. ืจืืฉืืช, ืื ืื ื ืื ืืฉืืืื ืขืืืจ ืฉืืืืช ื ืืกืคืืช ืฉื ืืคืฉืื ืขื ืืื ืืืกืื ืืืืกืง. ืืจืืจ ืฉืืจืืืืงืืืจื ืืืื ืขืืืื ืื ืืืืื ืืืขืืืื, ืืื ืืืคืืขื ืืืืจื ืืงืื ืืืืฉืื, ืืื ืื ืืืื ืืจืื ืืืชืจ ืขืืื ืื. ืื ืื ืืืืื ืชืืื ืืช ืฉืืื ื ื ืืจืฉืืช ืขื ืืื ืืืฉืื ืกืคืฆืืคื, ืืืฉื, ืชืืืื ืืฉืืืืชืืช ืืฉืคืช SQL. ืฉื ืืช, ื ืืชื ืืืืฉื ืืฆืืจื ืืืคืืืืืืช ืืืคืื ืฉื ืคืขืืืืช ืืืฉืืืื ืืืงืฉืืช ืืืืกืื ืืืกืง. ืื SQLite
3. ืฉืืืฉื ืขืืืืื ืฉื ืื.ื.ื
ืืืืจ ืฉืืกืชืืื ื ืขื ื-LMDB ืืืขืืฃ ืืฆืืคืืจ, ืืืืข ืืืื ืืืขืืืง. ืฉืืืฉืช ืืกืขืืคืื ืืืืื ืืืงืืฉื ืื ืืชืื ืืขืืืืื ืืขืืงืจืืื ืขืืืื ื ืฉืขื ืช ืืจืืืืงืืืจืช ืืืืกืื:
- ืงืืฆืื ืืืืคื ืืืืจืื ืืื ืื ืื ืืขืืืื ืขื ืืืกืง ืืกื ืืจืื ืืื ื ื ืชืื ืื ืคื ืืืืื.
- B+-tree ืืืจืืื ืฉื ืืื ื ืื ืชืื ืื ืืืืืืกื ืื.
- ืืขืชืง-ืขื-ืืชืืื ืืืืฉื ืืกืคืง ืืืคืืื ื ืขืกืงืืืช ACID ื-multiversion.
3.1. ืืืืืชื ืืก' 1. ืงืืฆืื ืืืืคื ืืืืจืื
ืงืืฆืื ืืืืคื ืืืืจืื ืื ืืืื ื ืืจืืืืงืืื ื ืืฉืื ืขื ืืื ืื ืฉืื ืืคืืื ืืืคืืขืื ืืฉื ืืืืืจ. ืืขืืืช ืฉื ืฉืืืจื ืืืืืื ืืกื ืืจืื ืฉื ืืืฉื ืืืืืข ืืืืืกื ื ืืชืจืืช ืืืืืืื ืืืขืจืืช ืืืคืขืื. LMDB ืืื ื ืืืื ืืืืื ืื ืืชืื ืขืฆืื. ืืืื ืืืืื ืืืืขืช ืฉื ืืืืืจ, ืฉืื ืงืจืืืช ื ืชืื ืื ืืฉืืจืืช ืืงืืฆืื ืืืืคืื ืืืคืฉืจืช ืื ืืืชืื ืืจืื ืคืื ืืช ืืืืฉืื ืืื ืืข. ืืืื ืจืฉืืื ืจืืืงื ืืืืืืช ืืืื ืฉื ืืื ืืื.
- ืฉืืืจื ืขื ืขืงืืืืช ืื ืชืื ืื ืืืืกืื ืืืฉืจ ืขืืืืื ืืืชื ืืืกืคืจ ืชืืืืืื ืืืคืืช ืืืืจืืืช ืืขืจืืช ืืืคืขืื. ืืกืขืืฃ ืืื, ืืื ืืงื ืื ื ืืืื ื ืืคืืจืื ืืขื ืชืืื ืืช.
- ืืืขืืจ ืืืืื ืื ืืืื ืืืืืืื ืืช LMDB ืืืชืงืืจื ืืงืฉืืจื ืืืงืฆืืืช ืืื ืืืืช. ืงืจืืืช ื ืชืื ืื ืืคืืขื ืคืืจืืฉื ืืืืจืช ืืฆืืืข ืืืชืืืช ืื ืืื ื ืืืืืจืื ืืืืจืืืืื ืืชื ืื. ืื ื ืฉืืข ืืื ืืืข ืืืืื ื, ืืื ืืงืื ืืงืืจ ืืืืกืื ืื ืืงืจืืืืช ื-calloc ืืชืจืืืืช ืืคืื ืงืฆืืืช ืชืฆืืจืช ืืืืกืื.
- ืืืขืืจ ืืืืื ืื ืคืืจืืฉื ืื ืืืขืืจ ืื ืขืืืื ืืงืฉืืจืื ืืกื ืืจืื ืืืืฉื ืฉืืื. ืงืืจืืื, ืฉืืืื ืืืืืช ืืกืคืจ ืฉืจืืจืืชื ืฉื ืงืืจืืื ืื-ืืื ืืช, ืื ื ืชืงืืื ืืืฃ ืืืืงืก ืืืจืื ืื ืื ืชืื ืื. ืืฉื ืื, ืืืืืจืืช ืืงืจืืื ืืฉ ืืืจืืืืช ืืื ืืืจืืช ืืืืืืืืช ืืืืืกืกืช ืขื ืืกืคืจ ืืืขืืืื. ื-LMDB, ืจืง ืคืขืืืืช ืฉืื ืื ืืกืื ืืจื ืืช. ืืืื ืืืืืช ืจืง ืืืชื ืืื ืืื ืคืขื.
- ืืื ืืืื ืฉื ืืืืืงื ืฉื ืืืืื ืืกื ืืจืื ืืืื ืืช ืืกืื ืืืืจืื ืืืืชืจ ืฉื ืฉืืืืืช ืืงืฉืืจืืช ืืขืืืื ืืกืืืื ืืจืืื ืืืืื. ืืื ืฉื ื ืืืงืจื ืืกื ื ืชืื ืื ืืขื ืืื ืื ืืื ืก Usenix OSDI 2014:
"ืื ืืขืจืืืช ืืงืืฆืื ืืื ื ื ืืฆืจืืช ืฉืืืช: ืขื ืืืืจืืืืช ืฉื ืืฆืืจืช ืืืฉืืืื ืขืงืืืื ืืงืจืืก" ะธ"ืขืื ืื ืืืืจื ืืืืข ืืฉืืื ืืืืฃ ืืืจืืื" . ืืื ืชืืืื ืืืงื ืืืืข ืื ืขื ืืืืื ืืช ืืกืจืช ืืชืงืืื ืฉื LMDB ืืื ืขื ืืืืืขื ืืืืขื ืืื ืจืื ืฉื ืืืคืืื ื ืขืกืงืืืช ACID, ืฉืขืืืคื ืขื ืื ืฉื SQLite. - ืืืื ืืืืืื ืฉื LMDB ืืืคืฉืจ ืืืืฆืื ืืืืื ื ืฉื ืืงืื ืฉืื ืืืืืช ืืืืงื ืืืืืืื ืืืืืื L1 ืฉื ืืืขืื ืขื ืืืคืืื ื ืืืืืจืืช ืื ืืืขืื ืืื.
ืืจืืข ืืืื, ื-iOS, ืขื ืงืืฆืื ืืืืคืื ืืืืืจืื, ืืื ืื ื ืืื ืขื ื ืื ืืื ืฉืืืื ื ืจืืฆืื. ืืื ืืืืจ ืขื ืืืกืจืื ืืช ืืงืฉืืจืื ืืืืื ืืฆืืจื ืืืืขืช ืืืชืจ, ืืฉ ืฆืืจื ืืืืืจ ืืช ืืขืงืจืื ืืช ืืืืืืื ืฉื ืืืฉืื ืื ืื ืื ืื ืืืขืจืืืช ืืคืขืื.
ืืืืข ืืืื ืขื ืงืืฆืื ืืืืคื ืืืืจืื
ืขื ืื ืืคืืืงืฆืื ืฉืคืืขืืช, ืืขืจืืช ืืืคืขืื ืืฉืืืืช ืืฉืืช ืื ืงืจืืช ืชืืืื. ืืื ืชืืืื ืืืงืฆื ืืืืื ืจืฆืืฃ ืฉื ืืชืืืืช ืื ืืื ืืฆืื ืืช ืื ืื ืฉืฆืจืื ืืื ืืคืขืื. ืืืชืืืืช ืื ืืืืืช ืืืืชืจ ืืฉ ืงืืขืื ืขื ืงืื ืื ืชืื ืื ืืืฉืืืื ืืงืืืืื. ืืืืจ ืืื ืืืืข ืืืืง ืืืื ืืืื ืฉื ืืจืื ืืชืืืืช ืืื ืื, ืืืืืจ ืื ื ืืืื ืชืืช ืืฉื heap. ืืื ืืืื ืืช ืืืชืืืืช ืฉื ืืฉืืืืช ืืืืคืืขืืช ืืืืื ืืคืขืืช ืืชืืื ืืช. ืืืืง ืืขืืืื ื ืืฆื ืืืืจ ืืืืืจืื ืืืฉืืฉ ืืช ืืืกื ืืช ืืืคืืืงืฆืืืช. ืืื ืืื ืื ืืชืืืืฅ; ืืืืืื ืืืจืืช, ืืืืืื ืืฉ ืื ืืืคื ืืื ืื. ืืื ืืื ืืข ืืืืืกื ืืช ืืืขืจืืื ืืืืืฃ ืืืืคืจืืข ืื ืืื, ืื ืืืืงืืื ืืงืฆืืืช ืฉืื ืื ืฉื ืืจืื ืืืชืืืืช. ืืฉ ืืืจ ืืื ืฉื ื ืืืืงืื ืืืื ืืืื ืืืืง ืืขืืืื ืืืชืืชืื. ืืขืจืืช ืืืคืขืื ืืฉืชืืฉืช ืืืชืืืืช ืืืืง ืืืืฆืขื ืืื ืืื ืืฉืืื ืืืืื ืฉื ืืฉืืืืช ืืชืืืื. ืืคืจื, ืืื ืืืื ืืฉืืื ืงืืืฆื ืจืฆืืคื ืืกืืืืช ืฉื ืืชืืืืช ืืงืืืฅ ืืืืกืง. ืงืืืฅ ืืื ื ืงืจื Memory-mapped.โ
ืฉืื ืืืชืืืืช ืืืืงืฆื ืืชืืืื ืืื ืขืฆืื. ืชืืืืจืืืช, ืืกืคืจ ืืืชืืืืช ืืืืื ืจืง ืขื ืืื ืืืื ืืืฆืืืข, ืืฉืจ ื ืงืืข ืขื ืืื ืงืืืืืช ืืกืืืืืช ืฉื ืืืขืจืืช. ืื ืืืืืจืื ืืคืืื ืืื ืืืืคื ืืืื 1 ื-1, ืื ืืชืืืื ืืจืืฉืื ืืื ืืืื ืืช ืื ืืืืจืื ื-RAM, ืืื ืืื ืืืืืจ ืขื ืจืืืื ืืฉืืืืช.
ืขื ืืืช, ืื ืืกืืื ื ื ืื ื ืืืืขืื ืฉืืขืจืืืช ืืคืขืื ืืืืจื ืืืช ืืืืืืช ืืืฆืข ืื ืืื ืืช ืืื ืชืืืืืื ืฉืชืจืฆื. ืื ืืคืฉืจื ืืฉื ืืขืืืื ืฉืื ืจืง ืืงืฆืื ืืจืื ืืืืจืื ืืชืืืืืื ืขื ืื ืืืจ, ืืื ืืืขืฉื ืื ืืขืืืกืื ืืืืืจืื ืืคืืื ืืจืืฉื ืจืง ืืช ืืืืง ืืืืืงืฉ ืืื ืืขืืฉืื. ืืื, ืืืืืจืื ืืงืฉืืจ ืืชืืืื ื ืงืจื ืืืจืืืืื.
ืืขืจืืช ืืืคืขืื ืืืจืื ืช ืืืืจืื ืืืจืืืืื ืืคืืื ืืืคืื ืืืืื ืืกืืื. ืืจืืข ืฉืืฃ ืืกืืื ืฉื ืืืืจืื ืืืจืืืืื ืืืืงืฉ, ืืขืจืืช ืืืคืขืื ืืืขื ืช ืืืชื ืืืืืจืื ืืคืืื ืืืชืืืื ืืืชื ืืืืื ืืืืืืช. ืื ืืื ืืจืืฆืื ืคื ืืืื, ืืื ืืืืคืื ืฉื ืืขื ื ืงืืื ืืื ืืืขืชืง ืืืืกืง, ืืืืืืงืฉ ืชืืคืก ืืช ืืงืืื. ืืืื ืื, ืืืื ื ืืืืจ ืขืื ืืขื, ื ืงืจื ืืืืคื. ืืืืืจ ืฉืืืื ืืืืืฉ ืืช ืืชืืืื ืืืชืืืจ. ืขืืื ื ืืขื ืขืืื A ืขื ืืชืืืช 0 ืืืืฆื ืืืฃ ืืืืืจืื ืืจืืฉื ืขื ืืชืืืช 4. ืขืืืื ืื ืืื ืืืื ืืืืื ืืืืืช ืืืชืืชืืืืืช ืืชื ืืกืคืจ 0.โ
ืืกืืคืืจ ืืื ืืืืืืื ืขื ืงืืฆืื ืฉืืืคื ืืืืืจืื. ืืืืคื ืืืืื ื, ืื ืืืืืื ืืืืงืืื ืืืืคื ืจืฆืืฃ ืืื ืืืื ืืืจืื ืืืชืืืืช ืืืืืจืืืืื. ืขื ืืืช, ืื ื ืื ืกืื ืืืืืจืื ืืคืืื ืขืืื ืืืจ ืขืืื ืืจืง ืืคื ืืงืฉื. ืฉืื ืื ืฉื ืืคืื ืืืื ืืกืื ืืจื ืขื ืืงืืืฅ ืืืืกืง. ืืืจื ืื, ื ืืชื ืืืฆืข ืงืื/ืคืื ืฉื ืงืืฆืื ืคืฉืื ืขื ืืื ืขืืืื ืขื ืืชืื ืืืืืจืื - ืื ืืฉืื ืืืื ืืืขืืจื ืืืืืืืืช ืขื ืืื ืืืืช ืืขืจืืช ืืืคืขืื ืืงืืืฅ ืืืงืืจ.โ
โ
ืืชืืื ื ืืืื ืืืืืื ืืืฆื LMDB ืืกื ืืจื ืืช ืืฆืื ืืขืช ืขืืืื ืขื ืืกื ืื ืชืื ืื ืืชืืืืืื ืฉืื ืื. ืขื ืืื ืืืคืื ืืืืืจืื ืืืืจืืืืื ืฉื ืชืืืืืื ืฉืื ืื ืืืืชื ืงืืืฅ, ืื ื ืืืืืืื ืืืขืฉื ืืช ืืขืจืืช ืืืคืขืื ืืกื ืืจื ืืืืคื ืืจื ืืืืืื ืืืืงืื ืืกืืืืื ืฉื ืืจืืื ืืืชืืืืช ืฉืืื ืื ืขื ืื, ืืืื ืฉืืกืชืืืช LMDB.โ
โ
ื ืืืื ืก ืืฉืื ืืื ืฉ-LMDB, ืืืจืืจืช ืืืื, ืืฉื ื ืืช ืงืืืฅ ืื ืชืื ืื ืืืืฆืขืืช ืื ืื ืื ืงืจืืืช ืืืขืจืืช ืืืชืืื, ืืืฆืื ืืช ืืงืืืฅ ืขืฆืื ืืืฆื ืงืจืืื ืืืื. ืืืืฉื ืื ืฉืชื ืืฉืืืืช ืืฉืืืืช.
ืืชืืฆืื ืืจืืฉืื ื ืืฉืืชืคืช ืืื ืืขืจืืืช ืืืคืขืื. ืืืืืช ืฉืื ืืื ืืืืกืืฃ ืืื ื ืืคื ื ื ืืง ืื ืืืืื ืืืกื ืื ืชืื ืื ืขื ืืื ืงืื ืฉืืื. ืืคื ืฉืืชื ืืืืข, ืืืจืืืช ืืืคืขืื ืฉื ืชืืืื ืืืคืฉืืืช ืืืฉืช ืื ืชืื ืื ืืื ืืงืื ืืืจืื ืืืชืืืืช ืฉืื. ืืื ืขื ืืืช, ืืคื ืฉืจืง ืืืจื ื, ืืฆืืช ืงืืืฅ ืืืฆื ืงืจืืื-ืืชืืื ืคืืจืืฉื ืฉืื ืืืจืื ืืืืื ืื ืืฉื ืืช ืืืชื. ืื ืืื ืขืืฉื ืืืช ืืืขืืช, ืื ืกื, ืืืฉื, ืืืขืฉื ืืืืืืฃ ืืืื ื ืืขืจื ืืืื ืืงืก ืื ืงืืื, ืื ืืื ืืืืื ืืฉื ืืช ืืืขืืช ืืช ืืงืืืฅ ืืืืืคื ืืืชืืืช ืื, ืื ืฉืืืืื ืืคืืืขื ืืืกื ืื ืชืื ืื. ืื ืืงืืืฅ ืืืฆื ืืืฆื ืงืจืืื ืืืื, ืื ื ืืกืืื ืืฉื ืืช ืืช ืืจืื ืืืชืืืืช ืืืชืืื ืืืืื ืืกืืื ืืืจืื ืฉื ืืชืืื ืืช ืขื ืืืช SIGSEGV
, ืืืงืืืฅ ืืืฉืืจ ืฉืื.
ืืชืืฆืื ืืฉื ืืื ืืืจ ืกืคืฆืืคืืช ื-iOS. ืื ืืืืืจ ืืื ืื ืืงืืจืืช ืืืจืื ืืืืืจืื ืืช ืื ืืืคืืจืฉ, ืืื ืืืขืืื LMDB ืื ืืชืืื ืืืคืขืื ืขื ืืขืจืืช ืืคืขืื ื ืืืืช ืื. ืืกืขืืฃ ืืื ืืืงืืฉ ืืฉืืงืืื.
ืคืจืืื ืกืคืฆืืคืืื ืฉื ืงืืฆืื ืืืืคื ืืืืจืื ื-iOS
ืืื ืืืืื ื ืคืื ื-WWDC ื-2018
ืืืืจืื ื ืงื ืืื ืืืกืฃ ืฉื ืืคืื ืฉื ืืชื ืืคืจืืง ืืื ืืื ืืืืืืจืื ืืคืืื. ื ืืชื ืืืขืื ืืืืฉ ืืช ืื ืชืื ืื ืฉืื ืืืืืื ืืคื ืืฆืืจื ืืืืงืืจืืช ืืืงืืจืืื ืฉืื. ืงืืฆืื ืืืืคื ืืืืจืื ืืงืจืืื ืืืื ื ืื ืกืื ืืงืืืืจืื ืื. iOS ืื ืืืฉืฉืช ืืคืจืืง ืืช ืืืคืื ืืืืืคืื ืืงืืืฅ ืืืืืืจืื ืืื ืขืช, ืืืืืื ืฉืื ืืืืืืื ืืืืืช ืืกืื ืืจื ืื ืขื ืืงืืืฅ ืืืืกืง.
โ
ืื ืืืคืื ืฉืืฉืชื ื ืืืืขืื ืืกืืคื ืฉื ืืืจ ืืืืืจืื ืืืืืื, ืื ืืฉื ื ืืืื ืื ืืื ืืืืงืืื ืืืงืืจ. ืืคืจื, ืงืืฆืื ืืืืคื ืืืืจืื ืฉืฉืื ื ืขื ืืื ืืชืืื ืืืืืจืื ืืืืืจืืืืื ืืืฉืืื ืืืืื ืืกืืืื ืืฆืืจื ืื. ืคืชืืืช LMDB ืขื ืืื MDB_WRITEMAP
, ืืืืจ ืืืฆืืข ืฉืื ืืืื ืื, ืชืืื ืืืืช ืืืช ืืืืคื ืืืฉื.โ
ืืจืืข ืฉืืคืืืงืฆืื ืืชืืืื ืืชืคืืก ืืืชืจ ืืื ืืืืจืื ืคืืื, iOS ืืขืืืจ ืืืชื ืืืืืกืช ืืคืื ืืืืืืืช. ืืืืืจืื ืืืืื ืฉื ืืืฉ ืขื ืืื ืืคืื ืืืืืืืื ืืืืืกืื ืืืืื ืืช ืื ืฉืืืื ื ืืืืขืช ืืืืืจืื ืฉื ืืืคืืืงืฆืื. ืืจืืข ืฉืืื ืืืืข ืืขืจื ืกืฃ ืืกืืื, ืืืืื ืฉื ืืขืจืืช ืืจืืฆื OOM ืืืืข ืืืจื ืืชืืืื ืืืกืืื ืืืชื ืืืื. ืืืื ืืืืืจืืช ืฉื iOS ืืืฉืืืื ืืืขืจืืืช ืืคืขืื ืฉืืืื ืืืช. ืืขืืืช ืืืช, ืฆืืฆืื ืืืืขืช ืืจืื ืฉื ืืืืืจืื ืขื ืืื ืืืืคืช ืขืืืืื ืืืืืจืื ืคืืื ืืืืกืง ืืื ื ืืกืืคืง ื-iOS. ื ืืชื ืจืง ืื ืืฉ ืืช ืืกืืืืช. ืืืื ืืืืื ืฉื ืืขืืจื ืืื ืื ืกืืืืช ืฉื ืืคืื ืืืืกืง ืืืืืจื ืืืื ืืื ืื ืจืืื ืขืืืจ ืืืฉืืจืื ื ืืืืื, ืื ืฉ-iOS ืืืกื ืืช ืืืฉืื ืฉื ืฉืืชืื ืชืืื ืขื ืืื ื ื SSD, ืื ืฉืืืื ืืืขืฆืืื ืื ืืื ืืจืืฆืื ืืืืืฆืืขืื ืืืืืืื ืฉื ืืืขืจืืช, ืฉืื ืืื ื ืืฆื ืืืืืคืื ืื ืืืื. ืื ืื ืื, ืืขืืืื ื ืฉืืจืช ืขืืืื.
ืืืืฉืืช ืืืืืืช, ืฉืืืจ ืืืืืจื ืงืืื ืืื, ืื ืฉ-LMDB ืืืจืืจืช ืืืื ืืื ื ืืฉืชืืฉืช ืืื ืื ืื mmap ืืขืืืื ืงืืฆืื. ืืืฉืืขืืช ืืื ืฉืื ืชืื ืื ืืืืฆืืื ืืกืืืืื ืขื ืืื iOS ืืืืืจืื ื ืงื ืืืื ื ืชืืจืืื ืืืืืขืช ืืจืื ืฉื ืืืืืจืื. ืืชื ืืืื ืืืืช ืืืช ืืืืฆืขืืช ืืื Xcode ืืฉื VM Tracker. ืฆืืืื ืืืกื ืืืื ืืฆืื ืืช ืืฆื ืืืืืจืื ืืืืจืืืืื ืฉื iOS ืฉื ืืคืืืงืฆืืืช ืืขื ื ืืืืื ืืคืขืืื. ืืืชืืื, 2 ืืืคืขื LMDB ืืืชืืื ืื. ืืจืืฉืื ืืืจืฉื ืืืฆืื ืืช ืืงืืืฅ ืฉืื ืขื 1GiB ืฉื ืืืืจืื ืืืจืืืืื, ืืฉื ื - 512MiB. ืืืจืืช ืืขืืืื ืฉืฉื ื ืืืืืจืื ืชืืคืกืื ืืืืช ืืกืืืืช ืฉื ืืืืจืื ืชืืฉื, ืืฃ ืืื ืืื ืื ืชืืจื ืืืื ืืืืืื.
ืืขืืฉืื ืืืืข ืืืื ืืืืฉืืช ืจืขืืช. ืืืืืช ืืื ืื ืื ืืืืืคื ืืืขืจืืืช ืืคืขืื ืฉืืืื ืืืช ืฉื 64 ืกืืืืืช, ืื ืชืืืื ืืืื ืืชืคืืก ืฉืื ืืชืืืืช ืืืจืืืืื ืืื ืฉืืฉืื ืืคื ืื ืืืืกืง ืืงืฉืื ืืืืืคื ืืคืืื ืฆืืืืืช ืฉืื ืืืคืฉืจ. ืืืืคืช ืืืืคื ืืืืืกื ื-iOS ืืคืืืชื ืืืืคื ืงืืฆืื ื ืืช ืืืงืกืืืื ืืชืืืืจืื. ืืขืช ืื ืืชืืืืืื ืืืืื ืืืืืื ืืืฉืชืื ืืืืืจืื ืืจืืฉื (ืืงืจืื RAM), ืืื ืืื ืฉืืื ื ืืชืืืืื ืืืืืื ืืืืืืฅ ืืืกืชืืื. ืื ืืฆืืื ืืื ืืืืืจ ืืขืื
ืืืชืืกืก ืขื ืชืืฆืืืช ื ืืกืืืื ืืขื ื, ืืืขื ื ืืขืจืื ืืคืฉืจื ืืืืื ืขืืืจ ืืืืืจืื ืฉืืืงืฆื ืขื ืืื LMDB: 384 ืืื ืืืื ืืืืฉืืจื 32 ืกืืืืืช ื-768 ืขืืืจ ืืชืงื ื 64 ืกืืืืืช. ืืืืจ ืฉื ืคื ืื ืื ืืฆื, ืื ืคืขืืืืช ืืฉืื ืื ืืชืืืืืช ืืืกืชืืื ืืงืื MDB_MAP_FULL
. ืื ื ืจืืืื ืืขืืืืช ืืืื ืืืขืงื ืฉืื ื, ืืื ืื ืงืื ืืช ืืกืคืืง ืืื ืฉืืฉืื ืื ื ืืชื ืืืื ืื ืืืชื.
ืกืืื ืื ืืจืืจื ืืฆืจืืืช ืืืืจืื ืืืืืืช ืขื ืืื ืืืืกืื ืืืืื ืืืืืช ืขืกืงืืืช ืืจืืืืช ืืืื. ืืื ืืืืื ืืืฆื ืฉืชื ืืชืืคืขืืช ืืืื ืงืฉืืจืืช, ื ืืขืืจ ืืืชืืฉื ืืฉื ื ืขืืืื ืืชืืื ืื ืืชืจืื ืฉื LMDB.
3.2. ืืืืืชื ืืก' 2. B+-ืขืฅ
ืืื ืืืงืืช ืืืืืืช ืขื ืืื ืืืกืื ืขืจื ืืคืชื, ืืคืขืืืืช ืืืืืช ืืืืืืช ืืืืืช ื ืืืืืช ื-API ืฉืื:
- ืืื ืกืช ืืืื ื ืืืฉ.
- ืืคืฉ ืืืื ื ืขื ืืคืชื ื ืชืื.
- ืืกืจืช ืืืื ื.
- ืืืืจ ืขื ืืจืืืื ืืคืชืืืช ืืคื ืกืืจ ืืืื.
ืืื ื ืื ืชืื ืื ืืคืฉืื ืืืืชืจ ืฉืืืื ืืืืฉื ืืงืืืช ืืช ืื ืืจืืข ืืคืขืืืืช ืืื ืขืฅ ืืืคืืฉ ืืื ืืจื. ืื ืืื ืืืฆืืชืื ืฉืื ืืืืฆื ืืคืชื ืืืืืง ืืช ืื ืืืฉื ื ืฉื ืืคืชืืืช ืืฆืืฆื ืืฉื ื ืชืชื ืขืฆืื. ืืฉืืืื ืืืื ืืช ืืื ืฉืงืื ืื ืืืืืจื, ืืืืืื ืืืื ืืช ืืื ืฉืืืืืื ืืืชืจ. ืืฉืืช ืขืจืืช ืืคืชืืืช ืืกืืืจืช ืืืฉืืช ืืืืฆืขืืช ืืืช ืืืขืืจื ืืขืฆืื ืืงืืืกืืื
ืืขืฆืื ืืื ืืจืืื ืืฉ ืฉื ื ืคืืืื ืืกืืกืืื ืฉืืื ืขืื ืืื ืืืืืช ืืขืืืื ืืืื ื ื ืชืื ืื ืืืืกืก ืืืกืง. ืจืืฉืืช, ืืืืช ืืืืืื ืฉืืื ืืื ื ื ืืชื ืช ืืืืืื. ืงืืื ืกืืืื ื ืืืจ ืืืฉืืช ืขืฆืื ืืื ืืืืื ืฉื ืขื ืคืื ืฉืื ืื ืืืืืื ืืืืืช ืฉืื ืื ืืืื, ืื ืฉืืืืืจ ืืฉืืขืืชืืช ืืช ืืืืจืืืืช ืืืืืืจืืชืืืช ืฉื ืืืืคืืฉ ืืขืืืช ืืฆืคืื. ืฉื ืืช, ืฉืคืข ืืงืืฉืืจืื ืืฆืืืืื ืืื ืฆืืชืื ืืื ืข ืืขืฆืื ืืื ืืจืืื ืืงืืืืืช ืืืืืจืื, ืฆืืชืื ืงืจืืืื (ืืืืื ืช ืืงืฉืจืื ืืื ืืื) ืืืืืื ืืืืืช ืืืืงืืื ืืืคืื ืฉืื ืื ืืืืืืื ืืืืืจืื ืืืืจืืืืื. ืืชืืฆืื ืืื, ืืคืืื ืืขืืจ ืคืฉืื ืฉื ืืกืคืจ ืฆืืชืื ืกืืืืื ืืขืฅ ืขืฉืืื ืืืจืืฉ ืืืงืืจ ืืืกืคืจ ืืืื ืฉื ืืคืื. ืื ืืขืื ืื ืืฉืืืืจืื ืขื ืืืคืงืืืืืืช ืฉื ืขืฆืื ืืื ืืจืืื ืืืื ื ื ืชืื ืื ืืืืืจืื, ืฉืื ืกืืืื ืืชืืื ืฉื ืืคืื ืืืืืื ืืืขืื ืืื ื ืชืขื ืื ืืื. ืืืฉืจ ืืืืืจ ืืืืืืจ ืชืืืฃ ืฉื ืืคืื ืืงืฉืืจืื ืืฆืืชืื ืืืืืกืง, ืืืฆื ืืืคื ืืืืืืื
ืขืฆื B, ืืืืืชื ืืืืืืฆืื ืฉื ืขืฆืื ืืื ืืจืืื, ืคืืชืจืื ืืช ืืืขืืืช ืฉืืืื ืืคืกืงื ืืงืืืืช. ืจืืฉืืช, ืื ืืืืื ืื ืืขืฆืื. ืฉื ืืช, ืื ืืื ืืืฆืืชืื ืฉืืื ืืคืฆื ืืช ืงืืืฆืช ืืคืชืืืช ืืฆืืฆื ืื ื-2, ืืื ืืงืืืฆืืช ืืฉื ื ืืกืืืจืืช, ืืืืกืคืจ M ืืืื ืืืืืช ืืืื ืืืื, ืืกืืจ ืืืื ืฉื ืืื ืืืืช, ืื ืืคืืื ืืืคืื.
ืึผึฐืึธื:
- ืื ืฆืืืช ืืืื ืืกืคืจ ืจื ืฉื ืืคืชืืืช ืฉืืืจ ืืืืื ื ืืืขืฆืื ืงืฆืจืื ืืืื.
- ืืขืฅ ืจืืืฉ ืืช ืืืืคืืื ืฉื ืืืงืื ืืืืงืื ืืืืืจืื, ืืืืืื ืฉืืคืชืืืช ืงืจืืืื ืืขืจืื ืืืืงืืื ืืืืคื ืืืขื ืื ืืื ืื ืืืืชื ืฆืืชืื ืื ืฆืืชืื ืฉืื ืื.
- ืืกืคืจ ืฆืืชื ืืืขืืจ ืืขืช ืืจืืื ืืขืฅ ืืืืื ืคืขืืืช ืืืคืืฉ ืืฆืืืฆื.
- ืืกืคืจ ืฆืืชื ืืืขื ืื ืงืจืืื ืืืืื ืฉืืืืชืืช ืืืื ืืฆืืืฆื, ืืืืืื ืฉืื ืืื ืืื ืืืจ ืืืื ืืกืคืจ ืจื ืฉื ืืคืชืืืช ืืกืืืจืื.
LMDB ืืฉืชืืฉ ืืืืจืืืฆืื ืฉื ืขืฅ B ืืืืื ื ืขืฅ B+ ืืื ืืืืกื ื ืชืื ืื. ืืชืจืฉืื ืฉืืืขืื ืืฆืื ืืช ืฉืืืฉืช ืกืืื ืืฆืืชืื ืืงืืืืื ืื:
- ืืืืง ืืขืืืื ื ืืฆื ืืฉืืจืฉ. ืื ืืืืฉ ืื ืืืชืจ ืืืฉืจ ืืจืขืืื ืฉื ืืกื ื ืชืื ืื ืืชืื ืืืกื. ืืชืื ืืืคืข LMDB ืืื, ืืชื ืืืื ืืืฆืืจ ืืกืคืจ ืืกืื ื ืชืื ืื ืฉืืืืงืื ืืจืื ืืชืืืืช ืืืจืืืืื ืืืืคื. ืื ืืื ืืื ืืชืืื ืืืฉืืจืฉ ืฉืื.
- ืืจืื ืื ืืืื ืืืืชืจ ื ืืฆืืื ืืขืืื. ืื ืืจืง ืื ืืืืืื ืืช ืฆืืื ืืืคืชื-ืขืจื ืืืืืืกื ืื ืืืกื ืื ืชืื ืื. ืืื, ืื ืืืืืจืืช ืฉื ืขืฆื B+. ืื ืขืฅ B ืจืืื ืืืืกื ืืืงื ืขืจื ืืฆืืชืื ืืื ืืจืืืช, ืืื ืืืืจืืืฆืื B+ ื ืืฆืืช ืจืง ืื ืืืื ืืืืชืจ. ืืืืจ ืฉืชืืงื ื ืขืืืื ืื, ืขืื ื ืงืจื ืืชืช-ืืกืื ืฉื ืืขืฅ ืืืฉืืฉ ื-LMDB ืคืฉืื B-ืขืฅ.
- ืืื ืืฉืืจืฉ ืืืขืืื ืืฉ 0 ืจืืืช ืืื ืืืช ืื ืืืชืจ ืขื ืฆืืชื ื ืืืื (ืขื ืฃ). ืืืฉืืื ืฉืืื ืืื ืืืืง ืืช ืกื ืืืคืชืืืช ืืืืืื ืืื ืืขืืื.
ืืืืื ื ืคืืืืช, ืฆืืชืื ืื ืืืฉื ืืืืจืื ืืืืจื ืงืืืข ืืจืืฉ. ืืืืื ืฉืืื ืืื ืืคืื ืืืืืื ืฉื ืืคื ืืืืจืื ืืืขืจืืช ืืืคืขืื, ืฉืขืืื ืื ื ืืืขืื. ืืื ื ืืฆืืืช ืืืฆื ืืืื. ืืืืชืจืช ืืืืื ืืื ืืืืข, ืฉืืืจืืจ ืฉืืื ืืื ืืืฉื ื-checksum. ืืืืจ ืืื ืืืืข ืืืืข ืขื ืืืืกืืื ืฉืืื ื ืืฆืืื ืืชืืื ืขื ืื ืชืื ืื. ืื ืชืื ืื ืืืืืื ืืืืืช ืืคืชืืืช, ืื ืื ืื ื ืืืืจืื ืขื ืฆืืชื ื ืืืื, ืื ืฆืืื ืืคืชื-ืขืจื ืฉืืืื ืืืงืจื ืฉื ืขืืื.โ ืชืืื ืืงืจืื ืขืื ืขื ืืื ื ืืืคืื ืืขืืืื
ืืืืจ ืฉืขืกืงื ื ืืชืืื ืืคื ืืื ืฉื ืฆืืชื ืขืืืืื, ื ืฆืื ืขืื ืืืชืจ ืืช ืขืฅ B-LMDB ืืฆืืจื ืคืฉืืื ืืืืคืก ืืื.
ืืคืื ืขื ืฆืืชืื ืืืืงืืื ืืจืฆืฃ ืืืืกืง. ืขืืืืื ืืขืื ืืกืคืจ ืืืื ืืืชืจ ืืืืงืืื ืืงืจืืช ืกืืฃ ืืงืืืฅ. ืื ืฉื ืงืจื ืืื ืืฃ ืืืื ืืืืข ืขื ืืงืืืืืื ืฉืืืืฆืขืืชื ื ืืชื ืืืฆืื ืืช ืืฉืืจืฉืื ืฉื ืื ืืขืฆืื. ืืขืช ืคืชืืืช ืงืืืฅ, LMDB ืกืืจืงืช ืืช ืืงืืืฅ ืขืืื ืืืจ ืขืืื ืืงืฆื ืืืชืืื ืืืืคืืฉ ืืืจ ืืื ืขืืื ืืืงื ืืืจืื ืืืฆืืช ืืกืื ื ืชืื ืื ืงืืืืื.
ืืขืช, ืืืืจ ืฉืืฉ ืื ื ืืืฉื ืขื ืืืื ื ืืืืืื ื ืืืคืืื ืฉื ืืจืืื ืื ืชืื ืื, ืื ื ืืืืืื ืืขืืืจ ืืฉืงืื ืืช ืืขืืื ืืฉืืืฉื ืฉื LMDB. ืืขืืจืชื ืื ืฉืื ืืื ืืืืกืื ืืชืจืืฉืื ืืขืกืงืืืช ืืืื ืืชืง ืื ืืื, ืื ืฉืืขื ืืง ืืืกื ืื ืชืื ืื ืืืืืืชื ืืช ืืืืคืืื ืฉื ืจืืืื ืืจืกืืืช.
3.3. ืืืืืชื ืืก' 3. ืืขืชืง-ืขื-ืืชืืื
ืืืง ืืคืขืืืืช ืขืฅ B ืืืืืืช ืืืฆืืข ืกืืจื ืฉื ืฉืื ืืืื ืืฆืืชืื ืฉืื. ืืืืื ืืืช ืืื ืืืกืคืช ืืคืชื ืืืฉ ืืฆืืืช ืฉืืืจ ืืืืข ืืงืืืืืช ืืืงืกืืืืืช ืฉืื. ืืืงืจื ืื, ืืฉ ืฆืืจื, ืจืืฉืืช, ืืคืฆื ืืช ืืฆืืืช ืืฉื ืืื, ืืฉื ืืช, ืืืืกืืฃ ืงืืฉืืจ ืืฆืืืช ืืฆืืฆื ืืืืฉ ืืืืจื ืฉืื. ืืืื ืื ืขืืื ืืืืืช ืืกืืื ืืืื. ืื ืืกืืื ืืืฉืื (ืืชืจืกืงืืช, ืืคืกืงืช ืืฉืื ืืื') ืืชืจืืฉื ืจืง ืืืง ืืืฉืื ืืืื ืืืกืืจื, ืื ืืขืฅ ืืืฉืืจ ืืืฆื ืื ืขืงืื.
ืืื ืืคืชืจืื ืืช ืืืกืืจืชืืื ืืืคืืืช ืืกื ื ืชืื ืื ืกืืืื ื ืืชืงืืืช ืืื ืืืกืคืช ืืื ื ื ืชืื ืื ื ืืกืฃ ืืืืกืง ืืื ืขืฅ B - ืืืื ืืจื ืืงืฆืืืช, ืืืืืข ืื ืืฉื ืืืื ืืชืืื ืงืืืื (WAL). ืืื ืงืืืฅ ืฉืืกืืคื ืืคืขืืื ืืืืืขืืช ื ืืชืืช ืืงืคืื ืืช ืืคื ื ืฉืื ืื ื-B-tree ืขืฆืื. ืืคืืื, ืื ืืืืื ืคืืืขื ืื ืชืื ืื ืืืืื ืืืืื ืขืฆืื, ืืกื ืื ืชืื ืื ืืชืืืขืฅ ืืืืื ืืื ืืขืฉืืช ืกืืจ.
LMDB ืืืจื ืืฉืืื ืืืจืช ืืื ืื ืื ืกืืืื ืืช ืชืงืืืช, ืื ืงืจืืช ืืขืชืงื-ืขื-ืืชืืื. ืืืืืช ืฉืื ืืื ืฉืืืงืื ืืขืืื ื ืชืื ืื ืืขืืื ืงืืื, ืืื ืงืืื ืื ืืขืชืืง ืืืชื ืืืืืื ืืืืฆืข ืืช ืื ืืฉืื ืืืื ืืขืืชืง.
ืืืืจ ืืื, ืขื ืื ืช ืฉืื ืชืื ืื ืืืขืืืื ืื ืืืื ืืืื ืื, ืืฉ ืฆืืจื ืืฉื ืืช ืืช ืืงืืฉืืจ ืืฆืืืช ืฉืืคื ืืขืืื ื ืืฆืืืช ืืื ืฉืื. ืืืืืื ืฉืื ืื ืฆืจืื ืืืืืช ืฉืื ื ืืฉืืื ืื, ืื ืื ืืืขืชืง ืืจืืฉ. ืืชืืืื ืืืฉืื ืืืืคื ืจืงืืจืกืืื ืขื ืืฉืืจืฉ. ืืืืจ ืืืืจืื ืฉืืฉ ืืฉื ืืช ืืื ืื ืชืื ืื ืืืฃ ืืืื.โ
ืื ืืคืชืข ืืืืื ืืืื ืืขืืืื ืืชืืืื ืงืืจืก, ืื ืฉืืฃ ืืื ืืืฉ ืื ืืืืืฆืจ, ืื ืฉืืื ืื ืืืืชื ืืืืกืง ืืืืืืื, ืืกืืื ืืืืืงื ืฉืื ืืืื ืฉืืื. ืืื ืืื ืืฉื ื ืืืงืจืื ืืืื, ืื ืืืื ื ืืชื ืืืืืข ืืืคืื ืืืฉืื, ืื ืืฉื ืื ืื ืืืฉืคืขื. ืื ืืืื ืืช ืืฆืืจื ืฉื LMDB ืืืชืื ืืืื ืงืืืื ืืื ืืฉืืืจ ืขื ืขืงืืืืช ืื ืชืื ืื. ืื ืคืงืื, ืืื ื ืืืกืื ืื ืชืื ืื ืืืืกืง ืฉืชืืืจ ืืขืื ืืงืื ืื ืืื ืืช ืืช ืชืคืงืืื. ืืืขืืจ ืืืื ืขืกืงืืืช ืืคืืจืฉ ืืื ืืืช ืืชืืื ืืช ืฉื LMDB ืืืกืคืง ืืืืจืืช ืงืจืืืช ื ืชืื ืื ืืืืื
ืืขืืฆืื ืืืชืงืื, ืื ืงืจื append-only B-tree, ืืกืคืง ืืืืคื ืืืขื ืืืืื ืขืกืงืืืช ืื ืืืื ืจืืืื ืืจืกืืืช. ื-LMDB, ืื ืขืกืงื ืคืชืืื ืืฉืืืืช ืืฉืืจืฉ ืืขืฅ ืืจืืืื ืื ืืจืืข. ืขื ืืฉืืืช ืืขืกืงื, ืืคื ืืขืฅ ืืืฉืืืืื ืืืื ืืขืืื ืื ืืฉืื ื ืื ืืขืฉื ืืื ืฉืืืืฉ ืืืืจ ืขืืืจ ืืจืกืืืช ืืืฉืืช ืฉื ืื ืชืื ืื, ืื ืชืืืื ืืขืืื ืืื ืืื ืฉืชืจืฆื ืืืืืง ืขื ืกื ืื ืชืื ืื ืฉืืื ืจืืืื ืื ืืืืชื ืขืช ืืขืกืงื ื ืคืชืื, ืื ืื ืืืืกืื ืืืฉืื ืืืชืขืืื ืืืืคื ืคืขืื ืืฉืื ืื. ืืืื ืืืืืช ืฉื multiversion, ืื ืฉืืืคื ืืช LMDB ืืืงืืจ ื ืชืื ืื ืืืืืืื ืขืืืจ ืืืืื ื UICollectionView
. ืืืืจ ืคืชืืืช ืขืกืงื, ืืื ืฆืืจื ืืืืืื ืืช ืืืืขืช ืืืืืจืื ืฉื ืืืคืืืงืฆืื ืขื ืืื ืฉืืืืช ื ืชืื ืื ื ืืืืืื ืืืืคืืื ืืืื ื ืืืฉืื ืืืืืจืื, ืืืฉืฉ ืืืืฉืืจ ืืื ืืืื. ืชืืื ื ืื ืืืืืื ืืช LMDB ืืืืชื SQLite, ืฉืืื ื ืืืื ืืืชืืืจ ืืืืืื ืืืืื ืฉืืื. ืืืืจ ืคืชืืืช ืฉืชื ืขืกืงืืืช ืืืืจืื ื ืืืืงืช ืจืฉืืื ืืกืืืืช ืืชืื ืืืช ืืื, ืื ื ืืชื ืืืื ืขืื ืืงืื ืืช ืืืชื ืจืฉืืื ืืชืื ืืจืฉืืื ืืฉื ืืื ืฉื ืืชืจื.
ืืฆื ืืฉื ื ืฉื ืืืืืข ืืื ืืฆืจืืื ืืคืืื ืฆืืืืืช ืืืืืื ืืืชืจ ืฉื ืืืืจืื ืืืจืืืืื. ืืฉืงืฃ ืืจืื ืืืฆื ืืืจืื ืืื ื ืืกื ืื ืชืื ืื ืื ืืื ืืฉืื ื ืื-ืืื ืืช ืขื 3 ืืจื ืืงืฆืืืช ืงืจืืื ืคืชืืืืช ืืืืืืืช ืืืจืกืืืช ืฉืื ืืช ืฉื ืืกื ืื ืชืื ืื. ืืืืืื ืฉ-LMDB ืื ืืืื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืฆืืชืื ืื ืืืฉืื ืืฉืืจืฉืื ืืืฉืืืืื ืืขืกืงืืืช ื ืืืืืืช, ืืื ืืช ืืื ืืจืืจื ืืื ืืืงืฆืืช ืขืื ืฉืืจืฉ ืจืืืขื ืืืืืจืื ืืฉืื ืืฉืืคื ืืช ืืืคืื ืฉืฉืื ื ืชืืชืื.
ืืื ืื ืืืื ืฉืืืืฉื ืืืืืืจ ืืงืืข ืขื ืงืืฆืื ืืืืคื ืืืืจืื. ื ืจืื ืฉืืฆืจืืื ืื ืืกืคืช ืฉื ืืืืจืื ืืืจืืืืื ืื ืฆืจืืื ืืืืืื ืืืชื ื ืืจืื, ืฉืื ืืื ืื ืชืืจืืช ืืืืืขืช ืืืืืจืื ืฉื ืืืคืืืงืฆืื. ืขื ืืืช, ืืื ืขื ืืืช, ืฆืืื ืฉ-iOS ืงืืฆื ืืืื ืืืงืฆืืชื, ืืืื ื ื ืืืืืื, ืืื ืืฉืจืช ืื ืฉืืืื ืขืืืื, ืืกืคืง ืืืืจ LMDB ืฉื 1 ืืจื-ืืืื ืืื ืืืฉืื ืขื ืชืืื ื ืื ืืื. ืืืืืช ืืืคืฉืจ, ืืืื ืื ืกืืช ืืงืฆืจ ืืื ืืืคืฉืจ ืืช ืืฉื ืืืืื ืฉื ืืขืกืงืืืช.
4. ืขืืฆืื ืกืืืืช ื ืชืื ืื ืขื ืืื ื-API ืฉื ืืคืชื-ืขืจื
ืืืื ื ืชืืื ืืช ื ืืชืื ื-API ืฉืื ื ืืืกืชืืืืช ืขื ืืืคืฉืืืช ืืืกืืกืืืช ืฉืืกืคืง LMDB: ืกืืืื ืืืกืื ื ืชืื ืื, ืืคืชืืืช ืืขืจืืื, ืขืกืงืืืช ืืกืื ืื.
ืืขืจื ืืืื ืจืืฉืืื ืงืื
ืื ืืคืื ืงืฆืืืช ืืืืฉืง ื-API ืืฆืืืืจื ืฉื LMDB ืืืืืจืืช ืืช ืชืืฆืืช ืขืืืืชื ืืฆืืจื ืฉื ืงืื ืฉืืืื, ืื ืืื ืืจืืฉืืืื ืืืืื ืืืืืืช ืฉืื ืืืฉืื ืืืขืื ืงืืฆืืจ.โ ืืคืืขื, ืืคืืื ืืฉืชืืฉื ื ืืขืฆืื ื ืืื ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื ืืืืืจ
ืืืจื ืืืืืจื ืืืืชืจ ืืืืจ LMDB ืืคืจืืืงื ืขืืืจ iOS ืื macOS, ืื ื ืืฆืืข ืืช CocoaPod ืฉืื
4.1. ืืคืฉืืืช ืืกืืกืืืช
ืกืืืื
ืืื ื 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 ืฉืื ืื ื ืืช ืขืจืื ืืจืืจืช ืืืืื ืฉื ืฉื ื ืคืจืืืจืื ืืืื.
ืืจืืฉืื ืืื ืืืื ืืจืื ืืืชืืืืช ืืืืืจืืืืื ืฉืืืื ืืืืคื ืงืืืฅ ืืืืกืื. ืืืจืื ืืฆืขืจ, ืืคืืื ืืืืชื ืืืฉืืจ, ืืขืจื ืืกืคืฆืืคื ืืืื ืืืฉืชื ืืช ืืฉืืขืืชืืช ืืืคืขืื ืืืคืขืื. ืืื ืืงืืช ืืืฉืืื ืชืืื ื ืื ืฉื iOS, ื ืคื ืืืืกืื ืืืจืื ื ืืืจ ืืืืคื ืืื ืื. ืืื ืืขืจื ืืกืืื, ืืื ื ืืชื ืืืฆื ืขื ืืคืื ืงืฆืื mdb_env_open
ืื ืืืืืจ ืชืืฆืื ืฉืื ื ื ENOMEM
. ืืชืืืืจืื, ืืฉ ืื ืืจื ืืคืืื - ืชืืืื ืืงืฆื ืืื ืืข ืืื ืืืื ืฉื ืืืืจืื, ืืืืืจ ืืื, ืืืฉืจ ืืชืงืืืืช ืฉืืืืืช, MDB_MAP_FULL
, ืืืืืื ืืืชื. ืขื ืืืช, ืื ืืจืื ืืืชืจ ืงืืฆื ื. ืืกืืื ืืื ืฉืืืืื ืืืงืฆืืช ืืืืจืื ืืืืฉ (ืืคื ืืืืฉ) ืืืืฆืขืืช ืืคืื ืงืฆืื mdb_env_set_map_size
ืืืื ืืช ืื ืืืฉืืืืช (ืกืื ืื, ืขืกืงืืืช, ืืคืชืืืช ืืขืจืืื) ืฉืืชืงืืื ืืขืืจ ืืืื ืืข. ืืชืืฉืืืช ืืชืคื ืืช ืื ืืงืื ืชืืืื ืืกืืืื ืืฉืืขืืชื ืฉืื. ืขื ืืืช, ืื ืืืืจืื ืืืจืืืืื ืืืื ืืฉืื ืื, ืื ืื ืขืฉืืื ืืืืืช ืกืืื ืืืืื ืืงืจืื ืืช ืืืืื ืฉืืื ืจืืืง ืงืืืื
ืืคืจืืืจ ืืฉื ื, ืฉืขืจื ืืจืืจืช ืืืืื ืฉืื ืื ืืชืืื ืื ื, ืืกืืืจ ืืช ืืืื ืืงื ืฉื ืืืืืช ืืืืืืช ืืืจืื. ืืจืืข ืืืื, ืืคืืืช ื-iOS 10 ืืฉ ืืขืืืช ืขื ืชืืืื ืืืืกืื ืืงืืื. ืืกืืื ืื, ืืืืืื ืืืขืื, ืืืืืจ ื ืคืชื ืขื ืืืื 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 ืืื ืืฉืืช ืืืกืื, ืื ืืฉืืช ืืกื ื ืชืื ืื ืกืคืฆืืคืืช. ืืืฉื ืื ืืืคืฉืจ ืื ืืืฆืข ืคืขืืืืช ืืืืืืืช ืขื ืืฉืืืืช ืืืืืงืืืช ืืืกืื ื ืชืื ืื ืฉืื ืื. ืืชืืืืจืื, ืื ืคืืชื ืืช ืืืคืฉืจืืช ืฉื ืืืืืื ืฉื ืืืืืืช ืืฆืืจื ืฉื ืืกืื ื ืชืื ืื ืฉืื ืื, ืืื ืืฉืื ืืกืืื ืืืจืชื ืื ืชืื ืืืจ, ืืืชืืืจ ืืคืืจืื ืืืืฉื.
ืืคืชืืืช ืืขืจืืื
ืืื ื MDB_val
ืืืืื ืืช ืืจืขืืื ืฉื ืืคืชื ืืขืจื ืืืื. ืืืืืจ ืืื ืืืฉื ืืืื ืืกืื ืืืงื ืฉืืื. ืขืืืจื, ืืฉืื ืืืจ ืืื ืจืง ืืขืจื ืฉื ืืชืื ืืืืื ื ืชืื. ืืืื ืืืคืชื ืืืจืื ืืื 512 ืืชืื.
typedef struct MDB_val {โ
size_t mv_size;โ
void *mv_data;โ
} MDB_val;โโ
ืืืืฆืขืืช ืืฉืืืื, ืืื ืืช ืืืืื ืช ืืช ืืืคืชืืืช ืืกืืจ ืขืืื. ืื ืื ืชืืืืฃ ืืืชื ืืขืฆืื, ืืืขืฉื ืฉืืืืฉ ืืจืืจืช ืืืืื, ืืืืืื ืืืชื ืืืื-byte ืืคื ืกืืจ ืืงืกืืงืืืจืคื.โ
ืขืกืงืืช
ืืื ื ืืขืกืงื ืืชืืืจ ืืคืืจืื ื
- ืชืืื ืืื ืืืืคืืื ืื ืืืกืืกืืื
ACID : ืืืืืืืช, ืขืงืืืืช, ืืืืื ืืืืื ืืช. ืื ื ืื ืืืื ืฉืื ืืฆืืื ืฉืืฉ ืืื ืืืืื ืช ืขืืืืืช ื-macOS ื-iOS ืฉืชืืงื ื-MDBX. ืืชื ืืืื ืืงืจืื ืขืื ืืืREADME . - ืืืืฉื ืืจืืืื ืฉืจืฉืืจืื ืืชืืืจืช ืขื ืืื ืขืจืืช "ืกืืคืจ ืืืื / ืืกืคืจ ืงืืจืืื". ืกืืคืจืื ืืืกืืื ืื ืืช ืื, ืืื ืื ืืืกืืื ืงืืจืืื. ืืงืืจืืื ืืื ื ืืืกืืื ืกืืคืจืื ืื ืืื ืืช ืืฉื ื.
- ืชืืืื ืืขืกืงืืืช ืืงืื ื ืืช.
- ืชืืืื ืืจืืืื ืืจืกืืืช.
Multiversion ื-LMDB ืื ืื ืืื ืฉืื ื ืจืืฆื ืืืืืื ืืืชื ืืคืขืืื. ืืืงืื ืืืื ื ืืชื ืืจืืืช ืฉืื ืขืกืงื ืขืืืืช ืืืืืง ืขื ืืืจืกื ืฉื ืืกื ืื ืชืื ืื ืฉืืืืชื ืขืืื ืืช ืืืื ืคืชืืืชื, ืืฉืืื ืืืืืืช ืืืืืืื ืืื ืืฉืื ืืืื ืืืืื. ืืชืืื ืืืืกืื ืืืืกืคืช ืจืฉืืืช ืืืืงื ืืืื ืืื ื ืืืืฆืืื ืฉืื ืืืจ ืืขื ืืื, ืืืื ืืืงืกืื ืืืื ื ืืชืจืื ืืชืืช ืืกืคืืืืจ.
ืืืกืคืช ืขืจื ืืืื
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 ืืืจืืืช ืื ืงืืจื.
Multiversion ืืืืื ืืืืืช ื ืืืืืช ืืืื ืืืืื ืฉื ืืคืชื iOS. ืืืืฆืขืืช ืืืคืืื ืื, ืชืืื ืืืชืืื ืืงืืืช ืืืืืคื ืืืขื ืืช ืงืฆื ืืขืืืื ืฉื ืืงืืจ ืื ืชืื ืื ืขืืืจ ืืคืกื ืืกื, ืืืชืืกืก ืขื ืฉืืงืืื ืืืืืช ืืฉืชืืฉ. ืืืืืื, ื ืืงื ืชืืื ื ืฉื ืืคืืืงืฆืืืช Mail.ru Cloud ืืืื ืืขืื ื ืืืืืืืืช ืฉื ืชืืื ืืืืจืืืช ืืืืื ืฉื ืืืขืจืืช. ืขื ืืืืืจ ืืื, ืืืงืื ืืืื ืืืืกืืฃ ืืกืคืจ ืชืืื ืืช ืืฉื ืืื ืืฉืจืช. ืื ืชืขืืื ืืืจื ืื ืืืจืื UICollectionView
ืขื ืชืืื ืืืื ืืขื ื ืฉื ืืืฉืชืืฉ, ืืชื ืืืื ืืฉืืื ื-60 ืคืจืืืืื ืืฉื ืืื ืืืืืื ืืืงื ืืืืื ืชืืืื ืื. ืืื ืืื ืืข ืขืืืื ื ืืกื ืชืืืคืื, ืืชื ืฆืจืื ืืืืฉืื ืืืืืื ืืช ืืงืฆื ืฉืื ืื ืชืื ืื ืืฉืชื ืื ืืืกืืก UICollectionViewDataSource
.
ืื ืืกื ืื ืชืื ืื ืืื ื ืชืืื ืืจืืืื ืืจืกืืืช ืืืืคืฉืจ ืื ืืขืืื ืจืง ืขื ืืืฆื ืื ืืืื, ืื ืืื ืืืฆืืจ ืชืืื ืช ืืฆื ืืฆืืื ืืืื ืฉื ืื ืชืื ืื, ืขืืื ืืืขืชืืง ืืืชื ืืืื ื ื ืชืื ืื ืืืืืจืื ืืืฉืื ืื ืืืืื ืืื ืืช. ืื ืืืช ืืืืืฉืืช ืืืื ืืื ืืงืจื ืืืื. ืืืงืจื ืฉื ืืืกืื ืืืืืจืื, ืื ื ืืงืืืื ืขืืืืืช ืื ืืืืืจืื, ืื ืืจืืืช ืืืืกืื ืืืืืืงืืื ืื ืืืื, ืืื ืืืื, ืืงืฉืืจืืช ืืืจื ืกืคืืจืืฆืืืช ORM ืืืืชืจืืช. ืืืฉืจ ืืฉืืืื ืืืื ื, ืืื ืชืขื ืื ืืงืจ ืขืื ืืืชืจ, ืืืืื ื ืจืง ืืืงืจืื ืื ืืจืืืืืืืืื.
ืคืชืจืื ืืืืืืืืจืกืื ืฉื LMDB ืคืืชืจ ืืช ืืืขืื ืฉื ืฉืืืจื ืขื ืืงืืจ ื ืชืื ืื ืืฆืื ืืฆืืจื ืืืื ืืืื ืืืช. ืืกืคืืง ืจืง ืืคืชืื ืขืกืงื ืืืจื - ืขื ืฉื ืฉืืื ืืืชื, ืขืจืืช ืื ืชืื ืื ืืืืืืช ืืชืืงื ืช. ืืืืืืื ืืืืืจืืช ืืขืืืื ืฉืื ื ืืฆื ืืขืช ืืืืืืื ืืืื ืฉืืืช ืืืฆืืช, ืืื ืชืงืืจื ืฉื ืืฉืืืื ืืฉืืขืืชืืื.
ืกืื ืื
ืกืื ืื ืืกืคืงืื ืื ืื ืื ืืืืืจืฆืื ืืกืืืจืช ืขื ืฆืืื ืืคืชื-ืขืจื ืืืืฆืขืืช ืืฆืืืช ืขืฅ B. ืืืขืืืื, ืื ืืคืฉืจ ืืืื ืืืฆืืจ ืืืื ืืขืื ืฉื ืืืืืืืช ืืืกื ืื ืชืื ืื, ืืืื ืื ื ืคืื ืื ืืขืช.
4.2. ืืืืื ืืช ืฉืืืื
ืืืืคืืื ืฉื ืกืืจ ืืคืชื ืืืคืฉืจ ืื ืืื ืืช ืืคืฉืื ืืจืื ืืืืื ืืืื ืืืื ืขื ืืื ืืคืฉืืืช ืืกืืกืืืช. ืืื ื ืฉืงืื ืชืืืื ืื ืืืืฆืขืืช ืืืืืื ืฉื ืืืืื ืืจืืฉืืช ืฉื ืืงืื ืขื ื, ืืฉืืืจ ืืืืข ืขื ืื ืืงืืฆืื ืืืชืืงืืืช ืฉื ืืืฉืชืืฉ.
ืกืืืืช ืืืื
ืืื ืืชืจืืืฉืื ืื ืคืืฆืื ืฉืขืืืจื ืืฉ ืืืชืืื ืืื ื ืืืื ืขื ืขืฅ ืชืืงืืืช ืืื ืืืืืจื ืฉื ืื ืืืืื ืืื ืื ืืฆืืื ืืชืื ืกืคืจืืื ื ืชืื ื. ืืืื ืืจืืื ื ืชืื ืื ืืื ืืฉืืืืชืืช ืืขืืืืช ืืกืื ืื ืืื
ืืชืืื ื ืืืื ืืจืื ืืืฆื, ืืืชืืกืก ืขื ืืืฉืืื ืฉืขื ืืคืจืง, ืืืฆืื ืฉื ืืคืชืืืช ืืฆืืจื ืฉื ืืขืจื ืืชืื ืขืฉืื ืืืืจืืืช. ืืืชืื ืขื ืืืืื ืฉื ืกืคืจืืืช ืืื (ืืืื) ืืืืงืืื ืชืืืื, ืืืืจ ืืื ืขื ืืกืื (ืืจืืง) ืืืื ื ืขื ืืฉื (ืืืื). ืืืืืชื ืืืืื ืื ืืคื ืืจืืจืช ืืืืื ืฉื ืืฉืืืืช LMDB ืืกืืจ ืืงืกืืงืืืจืคื, ืื ืืกืืืจืื ื- ืืืคื ื ืืจืฉ. ืืขืืจ ืืคืชืืืช ืืจืฆืฃ ืขื ืืืชื ืงืืืืืช ืืืืื ื ืืชื ืช ืื ื ืืช ืืขืจืืื ืืืฉืืืืื ืืื ืืกืืจ ืฉืื ืื ืืืืจืื ืืืืืช ืืืฆืืื ืืืืฉืง ืืืฉืชืืฉ (ืืฆื ืืืื), ืืื ืฆืืจื ืืขืืืื ื ืืกืฃ ื ืืกืฃ.
ืกืืืืจ ืืคืชืืืช ืืขืจืืื
ืืขืืื ืืืืฆืื ืฉืืืืช ืจืืืช ืืืกืืจืช ืืคืฆืื. ืืืืืื ืฉืื ืืืืชื ืื ื ืืจืืฉื ืืืจืช ืืืื ืืืืจืืช, ืืืจื ื ืืขืฆืื ื ืืช ืืืืืจ ืืืืชืจ ืืืคืฉืจื - dump ืฉื ืืืืืจืื ืฉื ืืืฉ ืขื ืืื ืืืคืข ืฉื ืืื ื ืฉืคืช C. ืื, ื ืืชื ืืขืฆื ืืช ืืืคืชื ืฉื ืจืืื ืกืคืจืืื ืขื ืืืื ื ืืื NodeKey
.
typedef struct NodeKey {โ
EntityId parentId;โ
uint8_t type;โ
uint8_t nameBuffer[256];โ
} NodeKey;
ืืฉืืืจ NodeKey
ืืืืกืื ืืืจืืฉ ืืืืืืืงื MDB_val
ืืงืื ืืช ืืฆืืืข ืื ืชืื ืื ืืืชืืืช ืฉื ืชืืืืช ืืืื ื, ืืืฉืื ืืช ืืืืื ืขื ืืคืื ืงืฆืื sizeof
.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = sizeof(NodeKey),
.mv_data = (void *)key
};
}
ืืคืจืง ืืจืืฉืื ืขื ืงืจืืืจืืื ืื ืืืืืจืช ืืกื ื ืชืื ืื, ืืืืจืชื ืืช ืืืขืืจ ืืงืฆืืืช ืืื ืืืืช ืืชืื ืคืขืืืืช CRUD ืืืืจื ืืืืจื ืืฉืื. ืงืื ืคืื ืงืฆืื serialize
ืืจืื ืืืฆื ืืืงืจื ืฉื LMDB ื ืืชื ืืืืื ืข ืืื ืืืืืืื ืืขืช โโืืื ืกืช ืจืฉืืืืช ืืืฉืืช ืืืกื ืื ืชืื ืื. ืืขืจื ืืืชืื ืื ืื ืก ืืืฉืจืช ืืืคื ืชืืืื ืืืื ื ืืืกื ืืช, ืืืืืจ ืืื ืื ืืืฉืืืื ืืืืคื ืืจืืืืืืื ืืืืกืื. ืืืชืืฉื ืืื ืฉืืื ืื ืืงืฆืืืช ืืื ืืืืช ืืชืื LMDB, ืืชื ืืืื ืืงืื ืืฆื ืคื ืืกืื ืืคื ืชืงื ื iOS - ืืฉืชืืฉ ืจืง ืืืืืจืื ืืืกื ืืช ืืื ืืขืืื ืขื ื ืชืื ืื ืืืืจื ืื ืื ืชืื ืืืจืฉืช ืืืืกืง!
ืืืื ืช ืืคืชืืืช ืขื ืืฉืืืื ืืื ืืจืืช
ืงืฉืจ ืกืืจ ืืืคืชื ืืืืืจ ืขื ืืื ืคืื ืงืฆืื ืืืืืืช ืื ืงืจืืช ืืฉืืืืช. ืืืืืื ืฉืืื ืืข ืืื ื ืืืืข ืืืจ ืขื ืืกืื ืืืงื ืฉื ืืืชืื ืฉืื ืืืืืื, ืืืฉืืืื ืืืืืืจืช ืืืจืืจืช ืืืื ืืื ืืจืืจื ืืื ืืกืืจ ืืช ืืืคืชืืืช ืืกืืจ ืืงืกืืงืืืจืคื, ืชืื ืฉืืืืฉ ืืืฉืืืื ืืชืื-ืืชืื. ืืฉืืืืฉ ืื ืืืจืืื ืืื ืื ืืืื ืืืืืื ืขื ืืจืื ืืืจื. ืขื ืืืช, ืืืงืจืื ืคืฉืืืื ืื ื ืืืฆื ืฉืืื ืื ืืงืืืืช. ืืืืืคื ืืชืืืจืช ืืืื, ืืื ืืื ืืฆืืื ืืื ืืืจืคืืช ืืคืืืจืืช ืืืืจื ืืฉืืื ืืื.
ืืืืจ ืืจืืฉืื ืฉืืฉ ืืืืืจ ืืื ืืืฆืื ืืืืืจืื ืฉื ืกืืื ื ืชืื ืื ืคืจืืืืืืืืื. ืืคืืื, ืืื ืืืฉืืจื ืืคื, ืืฉืชื ืื ืฉืืืื ืืืืืกื ืื ืืคืืจืื
// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)
ืืื ืืคืชืืจ ืืขืื ืื, ืืฉ ืืืืกื ืืช ืืืกืคืจืื ืืฉืืืื ืืืคืชื ืืคืืจืื ืืืชืืื ืืืฉืืื ืืชืื-ืืชืื. ืคืื ืงืฆืืืช ืืืืฉืคืื ืืขืืจื ืื ืืืฆืข ืืช ืืฉืื ืื ืื ืืจืฉ hton*
(ืืืืคื ืืืืื htons
ืขืืืจ ืืกืคืจื ืืืื ืืคืื ืืืืืืื).
ืืคืืจืื ืืืืฆืื ืืืจืืืืช ืืชืื ืืช ืืื, ืืืืืข, ืฉืื
ืืืืจ ืืฉื ื ืฉืฆืจืื ืืืืืจ ืืื packed
.
ืืืื ืช ืืคืชืืืช ืขื ืืฉืืื ืืืฆืื ื
ืืืืืงืืช ืืืฉืืืื ืืขืืงืจืืช ืขืฉืืื ืืืืืช ืืืจืืืช ืืื ืขืืืจ ืืฉืืื ืืื ืืจื. ืืืช ืืกืืืืช ืืจืืืช ืืื ื ืืืืืชื ืฉื ืชืืืืื ืืื ืืื ืืชืื ืืื ืื. ืืืืื ืืช ืืชืจืืฉืืชื ืืืืฆืขืืช ืืืืื ืฉื ืืคืชื ืืจืืื ืกืคืจืืื ืฉืืืจ ืืืืจ ืื ื.
typedef struct NodeKey {โ
EntityId parentId;โ
uint8_t type;โ
uint8_t nameBuffer[256];โ
} NodeKey;
ืืืจืืช ืืคืฉืืืช ืฉืื, ืืจืื ืืืืืื ืฉื ืืืงืจืื ืืื ืฆืืจื ืืืชืจ ืืื ืืืืจืื. ืืืืืจ ืขืืืจ ืืฉื ืชืืคืก 256 ืืชืื, ืื ืื ืืืืืฆืข ืฉืืืช ืงืืฆืื ืืชืืงืืืช ืขืืืื ืจืง ืืขืชืื ืจืืืงืืช ืขื 20-30 ืชืืืื.
ืืืช ืืืื ืืงืืช ืืกืื ืืจืืืืช ืืืืคืืืืืืฆืื ืฉื ืืืื ืืจืฉืืื ืืื "ืืืชืื" ืืืชื ืืืืื ืืืืืชื. ืืืืืช ืฉืื ืืื ืฉืืชืืื ืฉื ืื ืืฉืืืช ืืืืจื ืืฉืชื ื ืืืืืกื ืืืืืจ ืืงืฆื ืืืื ื, ืืืืืจืืื ืฉืืื ืืืืืกื ืื ืืืฉืชื ืื ื ืคืจืืื.โ ืืคื ืืืฉื ืื, ืืืคืชื 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 ืืืคืฉืจ ืืื ืืกื ื ืชืื ืื ืืงืื ืคืื ืงืฆืืืช ืืฉืืืืช ืืคืชื ืืฉืื. ืื ื ืขืฉื ืืืืฆืขืืช ืืคืื ืงืฆืื mdb_set_compare
ืืืืื ืืคื ื ืืคืชืืื. ืืกืืืืช ืืจืืจืืช, ืื ื ืืชื ืืฉื ืืช ืืืชื ืืืืจื ืื ืืื ืืกืืก ืื ืชืื ืื. ืืืฉืืื ืืงืื ืฉื ื ืืคืชืืืช ืืคืืจืื ืืื ืืจื ืืงืื, ืืืคืื ืืื ืืืืืจ ืืช ืชืืฆืืช ืืืฉืืืื: ืงืื ื-(-1), ืืืื ื-(1) ืื ืฉืืื ื-(0). ืคืกืืืืืงืื ืขืืืจ 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 // ...
}โ
ืื ืขืื ืื ืืืคืชืืืช ืืืกื ืื ืชืื ืื ืื ืืืืชื ืกืื, ืืืืช ืืืฆืื ืืืืืื ืฉืืื ืืื ืชื ืื ืืกืื ืืื ื ืืคืชื ืืืคืืืงืฆืื ืืื ืืืงืืช. ืืฉ ืืื ื ืืืื ืก ืืื, ืืื ืืื ืืืืื ืืืื ืืกืขืืฃ ืืืฉื ื "ืงืจืืืช ืจืฉืืืืช".
ืกืืืืจ ืขืจืืื
LMDB ืขืืื ืืฆืืจื ืืื ืื ืกืืืืช ืืืืืื ืขื ืืืคืชืืืช ืฉื ืจืฉืืืืช ืืืืืกื ืืช. ืืืฉืืืื ืืื ืืื ืืชืจืืฉืช ืืืกืืจืช ืื ืคืขืืื ืืืฉืืืืช, ืืืืฆืืขื ืืคืชืจืื ืืืื ืชืืืืื ืืืืืจืืช ืืืฉืืื. ืืขืืื ืืืืืืื, ืืจืืจืช ืืืืื ืฉื ืืืฉืืืื ืืืื ืืจืืช ืืืืจื ืืืกืคืืง ืืื ืืืฉืืืช ืืคืชืืืช, ืืื ืื ืืืืช ืฆืจืื ืืืฉืชืืฉ ืืืคืชืืืช ืืฉืื, ืื ืืืืื ืืืืืื ืืกืืจืช ืืคืชืืืช ืื ืฆืจืื ืืืืืช ืืืืจ ืืื ืืืคืฉืจ.
ืืกืืก ืื ืชืื ืื ืืื ื ืืชืขื ืืื ืืืืืื ืืืืง ืืขืจื ืฉื ืืจืฉืืื (ืขืจื). ืืืืจื ืฉืื ืืืืฆืื ืืชืื ืืืืืืืงื ืืชืจืืฉืช ืจืง ืืืฉืจ ืืื ืืืจ ื ืืจืฉ ืขื ืืื ืงืื ืืืคืืืงืฆืื, ืืืฉื, ืืืฆืื ืืืชื ืขื ืืืกื. ืืืืืื ืฉืื ืงืืจื ืืขืชืื ืจืืืงืืช ืืืกืืช, ืืจืืฉืืช ืืืืืจืืช ืขืืืจ ืืืื ืื ืืื ื ืื ืื ืงืจืืืืืช, ืืืืืฉืื ืฉืื ืื ื ืืจืื ืืืชืจ ืืืคืฉืืื ืืืชืืงื ืื ืืืืช. ืืืืืื, ืืื ืืืขืืืช ืืื ื ืชืื ืื ืืกืืืจื ืขื ืงืืฆืื ืฉืืจื ืืืจืื, ืื ื ืืฉืชืืฉืื NSKeyedArchiver
.
NSData *data = serialize(object);โ
MDB_val value = {โ
.mv_size = data.length,โ
.mv_data = (void *)data.bytesโ
};
ืขื ืืืช, ืืฉ ืืงืจืื ืฉืืื ืืืืฆืืขืื ืขืืืื ืืฉืืืื. ืืืืืื, ืืืฉืจ ืฉืืืจืื ืืื-ืืืืข ืขื ืืื ื ืืงืืฆืื ืฉื ืขื ื ืืฉืชืืฉ, ืื ื ืืฉืชืืฉืื ืืืืชื ืืืืจืื dump ืฉื ืืืืืืงืืื. ืืืืช ืืืืชืจืช ืฉื ืืืฉืืื ืฉื ืืฆืืจืช ืืืฆืื ืกืืืืจื ืฉืืื ืืื ืืขืืืื ืฉืืจืืืืื ืฉื ืกืคืจืืื ืืขืืฆืืื ืขื ืืื ืืืจืจืืื ืฉื ืืืืงืืช.
ืืื ืืืืฉื ืืืชื ืืฉืคื C, ืฉืืืช ืกืคืฆืืคืืื ืฉื ืืืืจืฉืื ืืืืงืืื ืืืื ืื ื ืคืจืืื, ืืืงืฉืจ ืฉืืื ืขื ืืืกืืก ืืื ืืฆืืื ืืืืฆืขืืช ืฉืื ืฉื ืืืืื ืกืืืื. ืืชืืื ืืคืืขื ืฉื ืืืืืื ืืฆืืื ืืืืฆืขืืช ืกืื ืืชืืื ื ืืืื ืืช.
typedef struct NodeValue {โ
EntityId localId;โ
EntityType type;โ
union {โ
FileInfo file;โ
DirectoryInfo directory;โ
} info;โ
uint8_t nameLength;โ
uint8_t nameBuffer[256];โ
} NodeValue;โ
ืืืกืคื ืืขืืืื ืฉื ืจืฉืืืืช
ื ืืชื ืืืืกืืฃ ืืช ืืืคืชื ืืืขืจื ืืืกืืืจ ืืื ืืช. ืืฉื ืื, ืืฉืชืืฉ ืืคืื ืงืฆืื 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;โ
}
ืืจืฉืืื ืืืืฆืืช ืืจืื ืืืฆื ืกืืจื ืืืืฆืขืืช dump ืืื ื ืืืคืฉืจืช ืื ืืืืคืืจ ืืืงืฆืืืช ืืื ืืืืช ืื ืจืง ืืขืช ืืชืืื, ืืื ืืขืช ืงืจืืืช ื ืชืื ืื. ื ืืืจ ืืืคืื ืงืฆืื mdb_get
ืืืฆืืืข ืืกืชืื ืืืืืง ืขื ืืชืืืช ืืืืืจืื ืืืืืจืืืืื ืฉืื ืืกื ืื ืชืื ืื ืืืืกื ืืช ืืืฆืื ืืืืืืื ืฉื ืืืืืืืงื. ืืืขืฉื, ืื ื ืืงืืืื ืกืื ืฉื ORM ืืืกืคืง ืืืืจืืช ืงืจืืืช ื ืชืื ืื ืืืืื ืืืื ืืืขื ืืื ืชืฉืืื. ืืืจืืช ืื ืืืืคื ืฉื ืืืืฉื, ืืฉ ืฆืืจื ืืืืืจ ืืื ืชืืื ืืช ืืงืฉืืจืืช ืืืื.
- ืขืืืจ ืขืกืงื ืืงืจืืื ืืืื, ืืืืื ืฉืืืฆืืืข ืืืื ื ืืขืจื ืืืฉืืจ ืชืงืฃ ืจืง ืขื ืืกืืืจืช ืืขืกืงื. ืืคื ืฉืฆืืื ืงืืื ืืื, ืืคื ืขืฅ B ืขืืืื ื ืืฆื ืืืืืืงื, ืืืืืช ืืขืงืจืื ืืขืชืง-ืขื-ืืชืืื, ื ืฉืืจืื ืืื ืฉืื ืื ืื ืขืื ืื ืืืคื ืื ืขื ืืื ืขืกืงื ืืืช ืืคืืืช. ืืื ืขื ืืืช, ืืจืืข ืฉืืขืกืงื ืืืืจืื ื ืืืฉืืืืช ืืืืื ืืกืชืืืืช, ื ืืชื ืืขืฉืืช ืฉืืืืฉ ืืืืจ ืืืคืื ืื ืชืื ืื ืืืฉืื. ืื ืืฉ ืฆืืจื ืฉืืืืืืงืืื ืืฉืจืื ืืช ืืขืกืงื ืฉืืฆืจื ืืืชื, ืขืืืื ืืฉ ืืืขืชืืง ืืืชื.
- ืขืืืจ ืขืกืงืช ืืชืืื ืืืืจืช, ืืืฆืืืข ืืืื ื ืืขืจืืื ืืืชืงืื ืืืื ืชืงืฃ ืจืง ืขื ืืืืื ืืฉืื ืื ืืจืืฉืื (ืืชืืื ืื ืืืืงืช ื ืชืื ืื).
- ืืืจืืช ืืืื ื
NodeValue
ืื ืืื, ืืื ืืชืื (ืจืื ืกืขืืฃ ืงืื "ืืืื ืช ืืคืชืืืช ืืืืฆืขืืช ืืฉืืืืช ืืืฆืื ืืช"), ืืชื ืืืื ืืืฉืช ืืืืื ืืฉืืืช ืฉืื ืืจื ืืืฆืืืข. ืืขืืงืจ ืื ืืืืื ืืื! - ืืฉืื ืคื ืื ืืืืคื ืืื ืืฉื ืืช ืืช ืืืื ื ืืืืฆืขืืช ืืืฆืืืข ืฉืืชืงืื. ืื ืืฉืื ืืืื ืืืืืื ืืืชืืฆืข ืจืง ืืืืฆืขืืช ืืฉืืื
mdb_put
. ืขื ืืืช, ืื ืืฉื ื ืืื ืงืฉื ืชืจืฆื ืืขืฉืืช ืืืช, ืื ืื ืืืื ืืคืฉืจื, ืืืืืื ืฉืืืืจ ืืืืืจืื ืฉืื ื ืืฆื ืืืื ื ืืื ืืืืคื ืืืฆื ืืงืจืืื ืืืื. - ืืืคืื ืืืืฉ ืฉื ืงืืืฅ ืืืจืื ืืืชืืืืช ืฉื ืืชืืืื ืืฆืืจื, ืืืฉื, ืืืืืช ืืืื ืืืืกืื ืืืจืื ืืืืฆืขืืช ืืคืื ืงืฆืื
mdb_env_set_map_size
ืืืื ืืืืืืื ืืช ืื ืืขืกืงืืืช ืืืืฉืืืืช ืืงืฉืืจืืช ืืืืคื ืืืื ืืืฆืืืขืื ืขื ืืืืืืงืืื ืืกืืืืื ืืคืจื.
ืืืกืืฃ, ืชืืื ื ื ืืกืคืช ืืื ืื ืื ืขืจืืืืืช ืฉืืฉืืคืช ืืืืชื ืืื ื ืืชืืืื ืืขืื ืคืกืงื. ืืคืจืง ืขื ืขืฅ B ื ืชืชื ืืืืืจืื ืฉื ืืื ืืคืื ืืกืืืจืื ืืืืืจืื. ืืืื ื ืืืข ืฉืืืชืืืช ืฉื ืชืืืืช ืืืืืจ ืขื ื ืชืื ืื ืืกืืืจื ืืืืื ืืืืืช ืฉืจืืจืืชืืช ืืืืืืื. ืืืื ืื, ืืืฆืืืข ืืืืื ืืชืงืื ืืืื ื MDB_val
ืืืฆืืืฆื ืืืฆืืืข ืขื ืืื ื, ืืชืืจืจ ืฉืืื ืื ืืืืฉืจ ืืืงืจื ืืืืื. ืืื ืขื ืืืช, ืืืจืืืืงืืืจืืช ืฉื ืืื ืฉืืืื (ืืืงืจื ืฉื iOS ืื armv7) ืืืจืฉืืช ืฉืืืชืืืช ืฉื ืื ื ืชืื ืื ืชืืื ืืคืืื ืฉื ืืืื ืืืืช ืืืืื ื ืื, ืืืืืื ืืืจืืช, ืืืื ืืกืืืืืช ืฉื ืืืขืจืืช ( ืขืืืจ armv7 ืื 32 ืกืืืืืช). ืืืืืื ืืืจืืช, ืืืฆืข ืืื *(int *foo)0x800002
ืขืืืื ืฉืืื ืขืจื ืืืจืืื ืืืืื ืืืืฆืื ืืืืจื ืขื ืคืกืง ืืื EXC_ARM_DA_ALIGN
. ืืฉื ื ืฉืชื ืืจืืื ืืืืื ืข ืืืืจื ืขืฆืื ืฉืืื.
ืืจืืฉืื ืืกืชืื ืืืขืชืงื ืจืืฉืื ืืช ืฉื ื ืชืื ืื ืืืื ื ืืืืฉืจ ืืจืืจ. ืืืืืื, ื-comparator ืืืชืื ืืืฉืืช ืื ืืืื ืืืื ืืืืื ืืืืคื ืืื.
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 ืืกืคืง ืืคืฉืื ืฉื โโืกืื. ืืื ื ืืื ืืืฆื ืืขืืื ืขื ืื ืืืืฆืขืืช ืืืืืื ืฉื ืืืื ืขื ืืื ื ืชืื ืื ืืขื ื ืืืฉืชืืฉ ืฉืืืจ ืืืืจ ืื ื.
ืืืืง ืืืฆืืช ืจืฉืืืช ืงืืฆืื ืืกืคืจืื, ืืฉ ืฆืืจื ืืืฆืื ืืช ืื ืืืคืชืืืช ืืืืื ืืฉืืืืื ืืงืืฆืื ืืืชืืงืืืช ืืฆืืฆืืืืช ืฉืื. ืืชืชื ืืกืขืืคืื ืืงืืืืื ืืืื ื ืืช ืืืคืชืืืช NodeKey
ืื ืฉืื ืืกืืืจืื ืืขืืงืจ ืืคื ืืืืื ืฉื ืกืคืจืืืช ืืื. ืืคืืื, ืืืืื ื ืืื ืืช, ืืฉืืืช ืืืืืจ ืืชืืื ืฉื ืชืืงืื ืืกืชืืืช ืืืฆืืช ืืกืื ืขื ืืืืื ืืขืืืื ืฉื ืงืืืฆืช ืืืคืชืืืช ืขื ืงืืืืืช ื ืชืื ื ืืืืืจ ืืื ืืืืจืฆืื ืืืืื ืืชืืชืื.
ื ืืชื ืืืฆืื ืืช ืืืืื ืืขืืืื ืืฉืืจืืช ืขื ืืื ืืืคืืฉ ืจืฆืืฃ. ืืฉื ืื, ืืกืื ืืืืงื ืืชืืืืช ืื ืจืฉืืืช ืืืคืชืืืช ืืืกื ืื ืชืื ืื ืืืขืื ืขืื ืืืชืจ ืขื ืฉืืคืชื ืขื ืืืืื ืฉื ืกืคืจืืืช ืืื ืืืคืืข ืืชืืชืื. ืืืืฉื ืื ืืฉ 2 ืืกืจืื ืืช ืืจืืจืื:
- ืืืจืืืืช ืืืคืืฉ ืืื ืืืจื, ืื ืื, ืืืืืข, ืืขืฆืื ืืืื ืืืขืฅ B ืืคืจื ื ืืชื ืืืฆืข ืืืชื ืืืื ืืืืจืืชืื.
- ืืฉืืื, ืื ืืขืืืืื ืืงืืืืื ืืื ืฉืืืคืฉืื ืืืกืจืื ืืืงืืืฅ ืืืืืจืื ืืจืืฉื, ืฉืืื ืืงืจ ืืืืชืจ.
ืืืจืื ืืืื, ื-API ืฉื LMDB ืืกืคืง ืืจื ืืขืืื ืืืงื ืืช ืืกืื ืืืชืืื. ืืฉื ืื, ืขืืื ืืืฆืืจ ืืคืชื ืฉืืขืจื ืฉืื ืืืืื ืงืื ืื ืฉืืื ืืืคืชื ืฉื ืืฆื ืืืืื ืืขืืืื ืฉื ืืืจืืื. ืืืืืื, ืืืืก ืืจืฉืืื ืืืืืจ ืืืขืื, ื ืืื ืืืฆืืจ ืืคืชื ืฉืื ืืฉืื 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, ืื ืื ื ืืงืืืื ืื ืจืง ืืช ืืืคืชื, ืืื ืื ืืช ืืขืจื. ืื, ืขื ืื ืช ืืืื ืืช ืชื ืื ืืืืืื, ืขืืื ืืืืืง, ืืื ืืืชืจ, ืืช ืืฉืืืช ืืืืง ืืขืจื ืฉื ืืจืฉืืื, ืื ืื ื ืืืฉืื ืืืื ืืื ืืืืืช ื ืืกืคืืช.
4.3. ืืืืื ืืช ืืืกืื ืืื ืืืืืืช
ืขื ืขืืฉืื, ืืฆืืื ื ืืฉืงืื ืืช ืื ืืืืืืื ืฉื ืขืืฆืื ืืขืืืื ืขื ืืกื ื ืชืื ืื ืฉื ืืืื ืืืช. ืื ื ืืืืืื ืืืืจ ืฉืืืื ืืื ืงืืืฆื ืฉื ืจืฉืืืืช ืืืืื ืืช ืืืืจืืืืช ืืืืชื ืกืื ืฉื ืืืืืช ืืคืชื-ืขืจื. ืื ืชืฆืื ืืคืชื ืืืืื ืืืช ืืขืจื ืืืฉืืื ืืืงืืืืืช, ืชืงืื ืชืจืฉืื ืืืืชื ืฉื ืืกื ืื ืชืื ืื.
โ
ืขื ืืืช, ืืืืื ืืืืืชืืื ืืขืืชืื ื ืืืจืืช ืืคืฉืจ ืืืกืชืืจ ืขื ืื ืื ืืขื ืฉืคืืืืช ืืืื. ืืขืชืื ืงืจืืืืช ืืืกื ื ืชืื ืื ื ืืจืฉ, ืจืืฉืืช, ืืืกืคืจ ืืืืืืช, ืืฉื ืืช, ืืืฆืข ืืื ืืืืจืืช ืืกืืจ ืฉืื ื ืืืืคืชื ืืจืืฉื. ืืืง ืืืจืื ืื ืืืงืืฉ ืื ืืฉืืื ืฉื ืืฆืืจืชื ืืืงืฉืจ ืืื ืืื.
ืืืืืืช ืืื ืืงืก
ืืืคืืืงืฆืืืช ืืขื ื ืืฉ ืงืืข "ืืืจืื". ืืื ืืฆืื ืชืืื ืืืื ืืื ืืขื ื, ืืืืื ืืคื ืชืืจืื. ืืื ืืืืฉื ืืฆืืจื ืืืคืืืืืืช ืืืืจื ืืื, ืืื ืืืืื ืืจืืฉืืช ืืชื ืฆืจืื ืืืฆืืจ ืขืื ืืื ืขื ืกืื ืืืฉ ืฉื ืืคืชืืืช. ืื ืืืืื ืฉืื ืขื ืชืืจืื ืืฆืืจืช ืืงืืืฅ, ืฉืืฉืืฉ ืืงืจืืืจืืื ืืืืื ืืขืืงืจื. ืืืืืื ืฉืืืคืชืืืช ืืืืฉืื ืืชืืืืกืื ืืืืชื ื ืชืื ืื ืืื ืืืคืชืืืช ืืืืื ืืจืืฉืืช, ืื ื ืงืจืืื ืืคืชืืืช ืืื ืืงืก. ืืชืืื ื ืืืื ืื ืืืืืฉืื ืืืชืื.
ืขื ืื ืช ืืืคืจืื ืืื ืืืคืชืืืช ืฉื ืืืืืืช ืฉืื ืืช ืืชืื ืืืชื ืืกื ื ืชืื ืื, ื ืืกืฃ ืืืืื ืฉืื ืืื ื ื ืืกืฃ tableId. ืขื ืืื ืืคืืืชื ืืขืืืคืืช ืืืืืื ืืืืชืจ ืืืืื, ื ืฉืื ืงืืืืฅ ืืคืชืืืช ืชืืืื ืืคื ืืืืืืช, ืืืชืื ืืืืืืช - ืืคื ืืืืืื ืฉืื ื.
ืืคืชื ืืืื ืืงืก ืืชืืืืก ืืืืชื ื ืชืื ืื ืืื ืืืคืชื ืืจืืฉื. ืืืฉืื ืคืฉืื ืฉื ืืืคืืื ืื ืืืืฆืขืืช ืฉืืื ืืืื ืขืืชืง ืฉื ืืืง ืืขืจื ืฉื ืืืคืชื ืืจืืฉื ืืื ื ืืืคืืืืื ืืืื ื ืงืืืืช ืืื:
- ืืืืื ืช ืืงืื ืฉืชืคืืก, ืืืื ื ืชืื ืื ืืืืืื ืืืืืช ืขืฉืืจืื ืืืื.
- ืื ืงืืืช ืืื ืฉื ืืืฆืืขืื, ืฉืื ืืขืช โโืขืืืื ืืืื ื ืชืื ืื ืฉื ืฆืืืช, ืชืฆืืจื ืืฉืืชื ืืืชื ืืืืฆืขืืช ืฉื ื ืืงืฉืื.
- ืื ืงืืืช ืืื ืฉื ืชืืืืช ืงืื, ืื ื ืฉืื ืืขืืื ืืช ืื ืชืื ืื ืขืืืจ ืืื ืืืคืชืืืช, ื ืงืื ืืื ืืืงืืง ืฉื ืืืกืจ ืขืงืืืืช ืืืืกืื.
ืืืืจ ืืื, ื ืฉืงืื ืืืฆื ืืืื ืืช ืืืกืจืื ืืช ืืืื.
ืืจืืื ืงืฉืจืื ืืื ืืืืืืช
ืืชืื ืืช ืืชืืืื ืืืื ืืงืืฉืืจ ืืืืช ืืืื ืืงืก ืขื ืืืืื ืืจืืฉืืช "ืืคืชื ืืขืจื". ืืคื ืฉืฉืื ืืจืื, ืืืง ืืขืจื ืฉื ืจืฉืืืช ืืืื ืืงืก ืืื ืขืืชืง ืฉื ืขืจื ืืืคืชื ืืจืืฉื. ืืืฉื ืื ืืืืืช ืืช ืื ืืืกืจืื ืืช ืื "ื ืืงืฉืืจืื ืืืืกืื ืขืืชืง ืฉื ืืืง ืืขืจื ืฉื ืืจืฉืืื ืืจืืฉืืช. ืืขืืืช ืืืืืื ืืื ืฉืืื ืืงืื ืขืจื ืืคื ืืคืชื ืืื ืืงืก, ืขืืื ืืืฆืข 2 ืฉืืืืชืืช ืืืกื ืื ืชืื ืื ืืืงืื ืืืช. ืกืืืืืช, ืกืืืืช ืืกื ืื ืชืื ืื ืืืชืงืืืช ื ืจืืืช ืื.
ืืคืืก ื ืืกืฃ ืืืจืืื ืืืกืื ืืื ืืืืืืช ืืื "ืืคืชื ืืืืชืจ". ืืืืืช ืฉืื ืืื ืืืกืคืช ืชืืื ืืช ื ืืกืคืืช ืืืคืชื, ืืืจืืฉืืช ืื ืืืืื, ืืื ืืืฆืืจื ืืืืฉ ืฉื ืืืคืชื ืืืฉืืื. ืืืคืืืงืฆืืืช Mail.ru Cloud ืืฉ ืืืืืืืช ืืืืชืืืช ืืฉืืืืฉ ืื, ืขื ืืืช, ืขื ืื ืช ืืื ืืข ืฆืืืื ืขืืืงื ืืชืื ืืืงืฉืจ ืฉื ืืกืืจืืช iOS ืกืคืฆืืคืืืช, ืืชื ืืืืื ืคืืงืืืืืช, ืืื ืืจืืจื ืืืชืจ
ืืืงืืืืช ื ืืืืื ืืขื ื ืืฉ ืขืืื ืืืฆืื ืืช ืื ืืงืืฆืื ืืืชืืงืืืช ืฉืืืฉืชืืฉ ืฉืืชืฃ ืขื ืื ืฉืื ืืืจืื. ืืืืืื ืฉืืฉ ืืขื ืืืกืืช ืงืืฆืื ืืืื, ืืืฉ ืืจืื ืกืืืื ืฉืื ืื ืฉื ืืืืข ืกืคืฆืืคื ืขื ืคืจืกืื ืืงืฉืืจ ืืืืื (ืืื ื ืืชื ืช ืืืฉื, ืืืืื ืืืืืืช ืืื'), ืื ืืืื ืื ืจืฆืืื ืื ืืืืืื ืขื ืืืืง ืืขืจืื ืฉื ืืงืืืฅ. ืจืฉืื ืืืชื ืืืืื ืืจืืฉืืช. ืขื ืืืช, ืื ืืชื ืจืืฆื ืืืฆืื ืงืืฆืื ืืืื ืืืฆื ืื ืืงืืื, ืืชื ืขืืืื ืฆืจืื ืืืืกื ืืืชื ืืืงืื ืืืฉืื. ืคืชืจืื ืืืขื ืืื ืืืฆืืจ ืขืืืจื ืฉืืืื ื ืคืจื. ืืชืจืฉืื ืฉืืืื, ืืืคืชื ืฉืื ืืื "P", ืื ืืชื ืืืืืืฃ ืืช ืืฆืืื ืืืืงืื "propname" ืืขืจื ืืกืคืฆืืคื ืืืชืจ "ืืืืข ืฆืืืืจื".โ
ืื ืืืื-ื ืชืื ืื ืืืืืืืืื, ืืฆืืจื ืืืืกืื ืืื ื ืืฆืจื ืืืืื ืืืืฉื, ืืืืงืืื ืืืืง ืืขืจื ืฉื ืืจืฉืืื. ืืื ืขื ืืืช, ืืื ื ืจืืฆื ืืฉืืคื ืืช ืื ืชืื ืื ืขื ืงืืฆืื ืืชืืงืืืช ืฉืืืจ ืืืืืกื ืื ืืืืื ืืจืืฉืืช. ืืืงืื ืืืช, ื ืชืื ืื ืืืืชืจืื ืืชืืืกืคืื ืืืคืชื "P" ืืฆืืจื ืฉื ืืฉืืืช "ืืืื ืฆืืืช" ื"ืืืชืืช ืืื". ืืืืืช ืืื, ืืชื ืืืื ืืื ืืช ืืคืชื ืืื ืืงืก, ืฉืืื ื ืืชื ืืืื ืืงืื ืืคืชื ืจืืฉื, ืฉืืื ื, ืืืกืืฃ, ืืชื ืืืื ืืงืื ืืื ื ืชืื ืื ืฉื ืฆืืืช.
ืืกืงื ื
ืื ื ืืขืจืืืื ืืช ืชืืฆืืืช ืืืืฉืื ืฉื LMDB ืืืืคื ืืืืื. ืืืืจืื ืืจื ืืกืคืจ ืืงืคืืช ืืืคืืืงืฆืืืช ื-30%.
ืชืืฆืืืช ืืขืืืื ืฉื ืขืฉื ืืืืื ืืขืืจ ืืฆืืืช iOS. ื ืืื ืืขืืฉืื, ืืื ืืงืืขื ื"ืงืืฆืื" ืืจืืฉืืื ืืืคืืืงืฆืืืช ืื ืืจืืืื ืขืืจ ืื ืืื ืืฉืืืืฉ ื-LMDB, ืืืืงืื ื ืืกืคืื ืืืจื. ืฉืคืช ื-C, ืฉืื ืืืืฉื ืืืืจ ื-key-value, ืืืืชื ืขืืจื ืืืื ืืืฆืืจืช ืืกืืจืช ืืืฉืืืื ืกืืืื ืืืฆืช ืคืืืคืืจืืืช ื-C++. ื ืขืฉื ืฉืืืืฉ ืืืืืื ืงืื ืืื ืืืืจ ืืฆืืจื ืืืงื ืืช ืกืคืจืืืช C++ ืฉืืชืงืืื ืขื ืงืื ืคืืืคืืจืื ื-Objective-C ืื-Kotlin
ืืงืืจ: www.habr.com