αα
αααΌαααααΉαααΎαααα»αααααΆα 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 ααΎαααΆααααααα αΆααΎααααΈααΆαααααααΆααΎααΉαααΆααααα»ααααΆαααα
ααα»α
αααααΆαααααααααα·ααΈααααααΎαααΆαααΆαααΊααααΆαα ααΎαβααααΎβαααβαααβα ααα»ααα ααΎαααΆαααα½αααΆαααα’αΌαααα’ααααΉαααΆααααΆααα»α αααααααααααααααα·ααΈαααααααΎαααααΉααααααααΆαααααα’αααααααΎα αααΌαα»ααα·αα’αΆα
α
α»α
ααΆααα αααααΈαα·ααααΌαααα α’αααΈααααΆαα·α
ααααΆαααΆααααα
ααααααααααΆαααΆαααααααΆαααααΆαααΆααΆαααΌαααΉααααααΆαααααααΆααααΎαα ααΆααΆαααααααααΆαααΆααΆααααα αΆααΆα
αααΎααααααααααααΆαααααΈααΆααααααααΆαα’αααΈααααααααα ααααα·αααΎαα»ααααααΉαααΈααΆααα·αααα ααΌα
ααΆαααα
αα
αααααααααΆαααααα»αααΆαααΊαα·αααΆαααΆαααα αααααΆαααααααααΆααααΈααΆααααααα’αΆαααααα
αααααΆαααΆαααα
ααααΌαα½ααα’αααααΆαααααααααααααααααΆ multithreading ααααΆαααΆααααΉαααΆαααΈααΈαααααααΆα ααααα»ααααΌαα αααα»αααΆα αΌαα α·αααααααααΆαααααααααααααααΈαα α αΎαβααβααααΎβαααβαααβαα·αβαααβαααβααααβα αΎαβαα βααΈβαααβαα ααα»ααααβααααΎαβααβαααααβααΈαααααα
ααΌαααααΆααα·ααααααααΊααΆααΆαα»ααααααααααΆαααα½ααα
αααα»αααααΆααααΆααααααΆααααα αΆαα ααΆααα·α
αα
α
ααααααααααΆααΊααΎααααΈα’αα»αααα macropattern
αααααΆααααΆααααΈααΈααααααα₯αααα·ααααΎαααααΎαααααΌαααααΆααα·ααααααααΊ Cloud API ααααααΎαα ααΆααααΌαααΆααααα»ααααα·αααααα·ααΈααΆαααααααααΎααααΆααααααααααααΌαααΆαα’αα»αααααα git α ααΌα
ααΆααααα ααΎαααΆαααααααα
ααΌα αααα ααααα·αααΎα’ααααααααααΎα git ααααα αααααααα·ααααα·ααΆααααααααΆααΆα αααα½αα±ααααΆαα’αα»αααααααααα ααΉαααΌαααααΌαααααΆα ααααααααααααΆαααΆαααααααααααααΆααΆαα½αααΉαααααΆαααΆααααΆαααΈααααααααα αααα’αααααΉαααΆααααα·αααααΉαααααΌαα’αααΈαααααααααΆαααααΎααααΆαααααααΎαα‘αΎααα αααα»ααααα α’αα·αα·ααα ααΆααΆααααα½ααααα»αααΆαααΆαααΆ ααΎααααΈα’αα»ααααααΆ α’αααααααΌααααα αααααααΆα DOM ααΈααα αααα»αααα·ααΆαα½αααΉαααααααΆαααααΆα’αααΈαααΆαααΈααα αα·αα―αααΆαααΌαααααΆαααΆααα’ααα ααΆααααααΆααααα·αααΎα’αααααααΎαααααΆαα»αα―αααΆαα ααα½α 500 ααΆαααα αααα»αααααααααΆααααααΎααααΈααααΎααααΆαααααααΆα αΆαααΆα αααααΌααααααΎαα‘αΎααα·ααα·αααααααΆαααΎαααΎααΈααααααΆαααααΆαα 1 ααΆαα ααα»ααααααααΆααααΈαα½ααααΊααΆααΆααααααΌααααα»ααααααΆαααααΆα ααααααααα»α αα αααα»ααααααΊααα ααααααααααααααααααΌαααΆαααααΉααα»αα ααΆααΆαααααααααΆαααΆ αααααΈααΆαα·αααΆααα·αααΌαααΈαααα½ααααααααΆαααΆααααα αΌαααααΆααααα ααααΈαα·αα·ααΈααααΆααααααΎα αα·αααααααΆαααααα»ααΌα αααΆαααααααααΆαααα½αα ααα½αααααααΌαα αααΆαα’αααα½αααΆααααα’αΆαα ααααααααΈαα’αααααααΎααααΆααα ααΆααααααααΎααα½ααα»ααααααααα·αα·α ααααααααΆααααΈααΈααααα»αααΆαααααΎαααΎαααΌαααααΆααα·αααααα - αααααααΆααααα»αααΆαα’αα»ααααααααα·ααααα·ααΆα CRUD αααααααΆαααΆααααα ααααΆαααααααααααα»α
αααααΌαααΆαααααααααααΆααααααααααααααΈααΆα α αΎααααααΈααΆααααΌααααααα½αααααΆαααΌα ααΆααααααα
- αα»ααααα·ααΆααααααααα‘αΆαα
- ααααΎαααΆαα αααΎαα ααααααααααααααααΆααααΆααΎααααΈααααΎα§ααΆα αααααΌαααααΆααα·ααααααααΌα ααααΆααΎααααΈααααΎααααΆαααααααααΆαααΆααα·αααααΉααααααΆααααααααα‘αΆαααα»αααααααααα»αααααααααΆαααααΆααααααα·ααΈααααΆαααα·αααααααααααα iOS αααααα
- αααααααΆααααα»αααΆαααααΆαα±ααα’αααααΆααααααΆααααααΆαα»αααΆααααα»ααααα·αα’αΆα ααααΆααααααΌαααΆα ..
- αα·αααΆαααΆααααα ααααΆααααααα αααα»αααααα·ααααα·ααΆα CRUD ααα
- ααΆαααΆααααααααα·ααααα·ααΆααααααΆαααααααααααααααα·ααΌαααααΆα
ααΉαα’αΆαααΈα α α’αΆααΌαα·α ααΆααααΈαααααΆαα ααΆαα―αα αα·αααΆαααΏααΆααα - ααααΏαααΎααααΈααααα·αααααα»αα
ααΆαα½αααΉααααα»ααααααααΌαααΆαααα SQLite ααΊααΆαααααΎαααααα’α ααααααΆαααΆααααα ααΆαααααααααΆααα·ααααΆα’αααΈαααααΎα αααα»αααΆααα½αααααα
αα½αα
2. ααΆααααααααΈααΆαα LMDB
LMDB ααΊααΆαααααΆαααααΌα αα½α (ααααΉααα 10K αα½α) αααα’αα»αααααααααΆααααΌαααααΆααα·ααααααααΆααααα»α - ααΆααααα»αα
ααααΆααααΆαααΆαααΎαααα αΆαααΆααΆααααααααα LMDB ααΆαα½α SQLite αααα’αα»ααααααααα·ααααααααααα ααΆααΌαα
αα·αααααΉαααααΌαααΆα SQLite αααααΆααα·ααααααααααΌαααα ααΆααΉαααΆαααΆααα»αααα·αααααΆααααα»αααΆαααααααααααΆαααΈααααα»αααΌα
ααααΆαα
ααΉαααααΌααααα½αααααααααααΎααααΆ - BerkeleyDB, LevelDB, Sophia, RocksDB ααΆααΎαα ααΆαααΌααααΈααααΆαα’αα·ααααααααα LMDB ααΎααα½ααΆαααΆαααΆαα»αααΆαααΈααααα»ααααααΆαα SQLite α ααΆααα·αααααααααααααΆααΎαααααΌαααΊαα
ααααΆα 2012
LMDB ααααΌαααΆαααααΎααΆα
ααααααΆαααΆαααΈααααααΆααααΌαααααΆααα·αααααααααααα·ααΈα αααααΆαααααααΆααααΌαααΆαααααααΆα
ααααα’αααα’αα·αααααα
LMDB ααΆααΉαααΆααααααΌαααΆαααααααΎααΆαααααααααα»αα α§ααΆα ααααααααα·ααΈαα»ααα Mozilla Firefox
αααΆαααΈααααααααΆαααααΎα±ααααΆαααΆααααααΆαααααααααα½ααα
αααα»ααα·ααααααΆαα’αα·ααααααααΌααααααα ααΆαααααΆαααααΎααααΆααααααααΆα’αΆα
ααΆα
LMDB αααα»αααααα»ααααααααααααααΎααααΈαααααααα½ααα
αααα»αααααα’αΆαα·ααααα
αααα»αααΈααααΆααα·ααααααα
αΆαα
ααααα BerkeleyDB αααααΆααααΈααΆαααα·ααα
αααααααΆαααααααααααααα Oracle α αααααΆαααααααΌαααΆααααααα‘αΆαααααααΆααααααΏα αα·αααΆαααΏααΆααααααααΆ ααΌααααΈααααΎαααααααααα
ααΉααα·ααααα½αααΆαααΆαααααααΆαααααα ααΌα
αααα’αααααΆαααΉαα αΎαααΆαα·αααΆαα’αΆα αΆαααααααααααααα₯ααα·αααααααα αΎααααα»αα
αααααααααααααααΎααΆααααααΌααααα’αααααΉαααααΌαααααααα»ααα
αααααααΎαααΎααααΆα LMDB αα·α SQLite α ααααΆααααΆαααΆαααΎαααα αΆααααΆαα
αααΆααααΈαααααααααΆααααααΎαααααΏαααααΌαααΆααααααα
α ααΈαα½α ααΎααα·ααααααααΆαααααααΆαααααααΆαααααααααα abstraction αα
αααααααΆαααΎαααααααααααα»αααΆαααα ααΆα
αααΆααααΆααααΆααααΆααααααααααα’αα
αααα·αα’αΆα
ααααΎααΆααααααααΆααα½αααΆ α αΎααα½αααΆααΉαααα
α‘αΎααααα»αααΌααααααα·ααΈαααααααα·ααα½α
ααα»αααααα½αααΆααΉαααΆααααα
αααΆααα αα½αααΆααΉααα·αααΆααααααααα·αααααααα·αααααΌαααΆαααΆαααΆαααααααααα·ααΈααΆααααΆαααα α§ααΆα ααα ααΆαααΆαααααααααΆαααααα½ααα
αααα»αααΆααΆ SQL α ααΈααΈα ααΆβα’αΆα
βααααΎβαα
βααΆαβαααα»αβααΆαβα’αα»ααααβααΆαβααααΎβαααααΈβααβααααα·ααααα·ααΆαβαααααα·ααΈβα±ααβααΆαβααα’βαααααΎαβααΆαβααααΎβαα
βααααααβαααα»αβααΆαα ααααα·αααΎ SQLite
3. αααααααααααΆααααΈαααα LMDB
αααααΆααααα‘ααααΎα LMDB ααΈαα·αααααΆαααααααααααΈ ααΆαααααααααααααΌαα αΌαααΆαααααααα α αααααααΆααααΈαααααΆααααΉαααααΌαααΆαα§αααα·ααααααΆααα·ααΆααααααααααααααααΆααααααααααΆαααααααααααα»ααα αααα
- α―αααΆααααααΆαααΌααααααΈα’αααα αα αΆαααΆααααααΆααααααΆααααααΎααΆαααΆαα½αααΆα αα·αααααΎααααΆααααααα ααΆαααααααααα·ααααααααΆααααα»αα
- B+-tree ααΆα’αααααΆααααα ααΆαααααααααααα·αααααααααααΆααααααΆαα»αα
- Copy-on-write ααΆαα·ααΈααΆααααααα½αααΎααααΈαααααααΌααααααααααααααα·ααααα·ααααα·ααΆα ACID αα·ααα α»ααααα
α£.α‘. ααααΈααΆα‘ααααα 3.1 α α―αααΆαβαααβααΆαβααΌαβαααααΈβα’αααβα αα αΆα
α―αααΆααααααΆαααΌααααααΈα’αααα αα αΆαααΊααΆααΆαα»ααααΆααααααααααααααΆαααα½α ααααα½ααααααααΆαααααα αΆααα αααα»ααααααααααααααΆααα αααα αΆααααααΆαααααααΆαα αα·αααΆαααααΎααααΆαααααααααΆαα αΌαααααΎααααααΆααααααΆααααααΆαα»αααααΌαααΆααα»αα ααααΆαααααα»αα ααααααααααααααααα·ααααα·ααΆαα LMDB αα·αααΆαααααΆαααααααΆααααΆαα½ααα αααα»ααααα½αααΆααα αααααΆααΆααααααα α α·αααααααααα·ααΆααααα’ααααα·αααα α αΆααααΆααααΈααΆαα’αΆααα·αααααααααααααΆααααΈα―αααΆααααααΆαααΌαααΆαα’αα»ααααΆαα±ααα’αααααΆαααααα»αααΆα αααΎααααα»αααΆαα’αα»αααααααΆαααΈαα ααΆαααααααααααΊαα ααααΆαααΈαααααΈαααααααααα½ααααα½αα ααα½αα
- ααΆααααααΆααΆααααΈαααααΆααααααΆαααα·αααααααα αααα»αααΆααααα»ααα αααααααΎααΆαααΆαα½αααΆααΈααααΎαααΆαααΆα αααΎαααααΆαααΆααΆαααα½ααα»αααααΌαααααααααααααααα·ααααα·ααΆαα αα ααααααααααΆααααααααΆααααααααΌαααΆααα·ααΆααααΆαααα’α·ααα·αααΆαα½αααΌαααΆαα
- α’ααααααΆαααααααΆαααααααΆαααα»αααααΆαα LMDB ααΆαααααα»αααΈααΆαα αααΆαααΎααααααΆααααααΉαααΆααααα ααααΆαααααα ααΆαα’αΆααα·αααααααααα»αααΆαα’αα»ααααααΆααααααΆαααααααααα·α αα α’αΆααααααΆαααααΉαααααΌααα αααα»αααα·αα·αααα·α α αΎαααααΆαα’αααΈαααααα ααΆααααΆαααα ααΌα ααΆααααα·ααα·ααααΆααΆααααα ααα»αααααα αααα»αααΌαααααααααα»α ααΆαα α ααΌααααααααΆααα’αααα ααΆαα calloc ααααΌαααΆααααααΌααααα»ααα αααα»ααα»αααΆαααααααα ααΆαααααααααααα»αα
- α’ααααααΆαααααααΆαααααααΆααααααΆααααααΆα’ααααααΆαααααΆαα αΆαααααααααΆααααααΉαααΆαααααΎααααΆαααααααααΆαα αΌαααααΎαααααα½αααα α’αααα’αΆα αααα’αΆα ααΆαα ααα½αα’αααα’αΆαααΆαα α·ααααααα»αααααααα½α αα·αααααΌααα½α mutex αααα½ααα ααΎααααΌααααααα½ααααα ααΆαααα·αααααααααααα αααααΆαααααα ααααΏαα’αΆαααΆααα·ααΆαααΆαααΈααα’αααααααα’ αααααα’ααααΎα ααα½ααααΈααΈααΌα αα αααα»α LMDB ααΆαααααΆαααααααααααα·ααααα·ααΆαααα»ααααααααααααΌαααΆαααααΎααααΆαααααα α’αΆα βααΆαβα’αααβαα·ααααβααβααααΆααβααα»αααααβαααα»αβαααβαα½αα
- α’ααααααΆααααααΆαααααααΆαα αα·ααααααα·ααααΆααααΎααααΆααααααα»αααααΆααααααααααααα α»αααααααα»αααααΆααααα»ααααααΆααααααΉαααΆαααααΎααΆααα
αααα»αααα·ααΆααΆααα α»ααααα ααΆαααΆααα·ααααΆααΌαααααΆααα·αααααααα½αα±ααα
αΆααα’αΆααααααα
ααα½αααΈααα
α―ααααα·ααΈα Usenix OSDI 2014α
"ααααααααα―αααΆαααΆααα’αααα·αααααΌαααΆααααααΎαααααΎαααααΆααα αα ααΎααΆααααα»αααααΆαααααΆααααααΎααααααα·ααΈαααααΆααααΆαα" ΠΈ"ααΆαααααΎααΆαα»αααααααΌαααααΆααα·αααααααααααΆααααΆααααααΆααα·αααααΆααα αααα" . ααΈαα½ααα α’αααα’αΆα αααααΌαααααααΆαα’αααΈααΆαααΏααΆααααααα·αααααΆααααΆαααΈαα»ααααααα LMDB αα·αααΆαα’αα»ααααααααΎαααααααΆαααα α»ααααααααααααααααα·ααααα·ααααα·ααΆα ACID αααααα’ααΆα SQLite α - ααΆααα·α αα½α αααα»ααα LMDB α’αα»ααααΆαα±ααααααΆααααΆαααΈαααααΌαααααααΆααΆαααΈααΆαααα ααΆαααααα»ααααα»αααααΆαααααααΆαα L1 αααα½αααααΆαααΆαα½αααΉαααααααααααΏααααααααααΆααα
ααΆα’αα»αααα αααα»αααααααααααααα·ααααα·ααΆα iOS ααΆαα½αααΉαα―αααΆααααααΆαααΌααααααΈα’αααα αα αΆα α’αααΈαααΆααα’ααααΊαα·αααΆααααααααααααΌα αααααΎαα ααααΆααααααα ααΎααααΈαα·ααΆαα’αααΈααΆαααααααΆααααααΆααααααΉααα½αααααΆααααααΉααααα½αααΆα αΆαααΆα αααααΌαα αα αΆααααααΆαααααΌαα ααααΆαα’αα»ααααααααααΆαααααα αααα»αααααααααααααα·ααααα·ααΆαα
ααααααΆαααΌαα α’αααΈα―αααΆααααααΆαααΌααααααΈα’αααα αα αΆα
ααΆαα½αααΉαααΆαααααααα·ααΈαααααααΎαααΆα ααααααααααααα·ααααα·ααΆαααΆαααααΆααα’αααααΆααα½αα α ααΆααααΎαααΆαα ααααΎαααΆαααΈαα½ααααααΌαααΆααααα ααα’αΆαααααααΆαααΆααααααΆαααααΆααΆααα’αααΈααααααααΆααααααΆααααΌαααΆαααΎααααΈααααΎαααΆαα αα α’αΆααααααΆαααΆααααα»α ααΆαααααααααααΆαααΌα αα·ααα·αααααα αα·αααααΆααααααΆαααΌαααΉαα αααααΆααβααβααΆαβααΆαβααΎαβα‘αΎαβααβααα αβα’αΆααααααΆαβααΆααααα αααβααΎαβααααΆααβαααΆαβα αααΆααβαααααβαααααβα ααα ααΆααΆαα’αΆααααααΆαααααα’αααααΆααααααα α‘αΎαααα‘α»ααααααααα·ααααα·ααΆααααααααα·ααΈα αα αααααααΆαααΎααΊααΆαααααα’αααα αα αΆααααααααΎαααααααααααα·ααΈα ααΆααΌαααΆαα α¬α α»ααα·α αα αααααΆ αααααΆααα·αααα ααα αααααααΆααααΆαααααααΆαα·ααΆααααααααααα ααΎααααΈααΆαααΆαααα αα·αα ααΆααΈααΆααα»α αα·αααααααααααααααΆαα αα·ααα αα αα½αααΆααΆαααΈααΆαααα α α»ααααααααααΆααααα α’αΆααααααΆαα ααΆααΆααααααααΆααααααααΆαααααααΆααααΈααα αααααααΆαααΎ αα·αααΆααααααα ααααααααααααα·ααααα·ααΆαααααΎα’αΆααααααΆααα αααα»αααααααααααΆαααα ααΎααααΈααααΆααα’αααααΆαααααααααΆαα½αααααΎαααΆαα ααΆαα·ααα ααΆα’αΆα ααααΆαααααα»αα’αΆααααααΆαααααααΆααααΆαααα½αααΆαα½αααΉαα―αααΆααα ααΎααΆαα α―αααΆαααααααααααΌαααΆαααα α ααΆ memory-mapped.
ααα αα’αΆααααααΆααααααΆααααα αααααααΆααααααΎαααΆαααΊααααΆααα ααΆαααααΉααααΈ α ααα½αα’αΆαααααααΆαααααΌαααΆααααααααααΉαααα αααααααα·α ααα»ααααα αααααααΌαααΆααααααααααααααααΆααααΈαααααααααααα ααααα·αααΎα’αααα αα αΆαααΌαααααααααΌαααΆαααΌαααΆα 1-to-1 αααααααΎαααΆαααααΌααααα»αααΉαααΆαα RAM ααΆααααΌα α αΎαααΆααΉααα·αααΆαααΆααα·ααΆαα’αααΈαα·α αα ααΆαα αααΎααααααα
αααααΆαααΆαααΆααααα ααΆααααα·αααααααααααΎα ααΎαααΉαααΆααααααααααααα·ααααα·ααΆαααααΎααααα»ααααααααΆαααααΆα’αΆα ααααΎαααΆαααααΎαααΆαααΆα αααΎαααΆααααα ααααΆαα αααααΊα’αΆα ααααΎαα ααΆααααααΆαααααΆααα·ααααααΆαα½αααααααΆαααααααα ααα’αααα αα αΆαααΆα αααΎααααααΆααααααΎαααΆααα ααΎαααααΆα ααα»ααααααΆααα·ααα½αααΆαααα»ααα αααα»αα’αααα αα αΆαααΌαααααααααΆααααααααααααααΆααααααΌαααΆααα ααΈααα αα·αα₯α‘αΌααααααα»αααααα ααΌα ααααα’αααα αα αΆααααααααΆααααΆαα½αααααΎαααΆαααααΌαααΆαααα α ααΆαα·αααα·αα
ααααααααααααα·ααααα·ααΆααααα αα’αααα αα αΆααα·αααα·α αα·αααΌααααααα ααΆαααααααααα αααΆααααΆαααα½αα αααΆαααΆαααααααΆααααΆααααααα·αα·αααα·αααΆααααααΌαααΆα ααααααααααααα·ααααα·ααΆαααΉααααα»αααΆαα αααα»αα’αααα αα αΆαααΌααααα α αΎαααααΌαααααα½αααΆαααα»αααΆααΆααα·ααααα½αα ααααα·αααΎαα·αααΆααααααααα₯ααα·ααααααα αααααααααα½ααααα»αα ααααααααααααααΆααααα»αααΈαα»αααααΌαααΆαα αααααα ααΈα α αΎαααααααααααααΌαααΆααααα½αα ααΈαα·αα·ααΈααααααααΎαααΉααααααααα αααα»αααααααααααΈααααΌαααΆαααα α ααΆ swapping ααΌαααΆαααααααααα αΆαααΈααααΎαααΆααααααΆααα·αααααΆα αα ααΎααΆ ααααα A αααααΆαα’αΆααααααΆα 0 ααααΌαααΆααααα»α αα·αααΆαααα ααΎααααααααααΌααΈαααααΆαα’αΆααααααΆα 4α ααΆααα·ααααααααΌαααΆααααα»ααααα αΆαααα αααα»αααΆααΆαααΆαααααΎααααααα αααα»ααααα‘αΆααα 0α
ααΏαβααΊβααΌα
ααααΆβααΉαβα―αααΆαβαααβααΆαβααααΌααααβαα
βα’αααα
αα
αΆαα ααΆααααα‘αΌααΈαα αα½αααααααΌαααΆαααααααααααΆαααα αα·αααΆαααΈααΆαααα
ααΆαααααα»ααααα»αα
αααααα’αΆααααααΆααα·αααα·αα ααααααΆαααΆααααα αα½ααααααα
αΌααααααααα·ααΌαααααααΆαααααα α αΎαααΆαααααΎααααα»αααααα ααΆααααααααααααααααααααααΌαααΆαααααΎααααΆαααααααΆαα½αα―αααΆααα
ααΎααΆαα ααΆααα·ααΈααα α’αααα’αΆα
α’αα»ααααα―αααΆα I/O αααααααΆααααααααΎααΆαααΆαα½ααααααα»αα’αααα
αα
αΆα - ααΆαααααΆααααααΌαααΆααα’ααααΉαααααΌαααΆαααααααααααααααααααααα·αααααΊαααααααααααααααα·ααααα·ααΆααα
α―αααΆααααααα
'' '"
ααΌαααΆαααΆαααααααααα αΆαααΈααααααα 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 αααααααααα·ααΈ Cloud ααα‘α»ααααααααα·ααααα·ααΆαα αα αααα αΆααααααΎα ααααΈ LMDB α ααα½α 2 ααααΌαααΆαα αΆααααααΎααα αααα»αααΆα ααΈαα½αααααΌαααΆαα’αα»ααααΆαα±αααααα αΆαα―αααΆαααααααΆαααα ααΎ 1GiB ααααα·αα·αααα·α ααΈααΈα - 512MiB α αααααΈααΆααΆααα·ααααααΆααΆααααα»αααΆααααΈαααΆααααΆααα ααα½αααΆααααΆααααα’αααα αα αΆαα’αααααααα ααααααααα½αααααΆααααΈααα·ααα½αα ααααααα ααααααααααααα
α αΎαα₯α‘αΌααααααΆααΆαααααααΆαααααΆααααααΉαα’αΆαααααα ααΌαα’ααα»αα
ααααααααααΆα swap αα
αααα»αααααααααααααα·ααααα·ααΆααααααα» 64 αααΈα ααααΎαααΆαααΈαα½ααα’αΆα
ααΆααααΆααααααααα’αΆααααααΆααα·αααα·αααΆαα
αααΎα ααΌα
αααααα αααΆαααΉαα₯ααα·ααααααααααΆααααΆαααααΆααααααΌααααααΆαα»ααααααααΆα’αα»ααααΆαα ααΆααααα½α swap ααΆαα½αααΆααααα αΆαααα
αααα»α iOS ααΆααααααααααΆαααααΆααααΌαααααΉααααΈααα α₯α‘αΌααααααααΎαααΆαααααα
ααΆααα’ααααααΌαααααααΉαα’αααα
αα
αΆααα (α’αΆα RAM) α αΎαα’αααΈαααΆααα’ααααααα·αααααααΌααααααααα±αααααα
ααα αααβααΆβααΆαβαααααΆααβααΌα
βααΆαβααΎαβα‘αΎαβααΆαβααΎ
αααααα’ααααΎααααααααααΆααα·ααααααα
αααα»α Cloud ααΎαααΆααααααααααααααααααααα½αααΌα
ααΆαααααααααααΆααα’αααα
αα
αΆααααααΆααααα
ααααα LMDB: 384 ααααΆαααααααΆααα§ααααα 32 αααΈα αα·α 768 αααααΆααα§ααααα 64 αααΈαα αααααΆααααΈααα·ααΆααααααααΌαααΆαααααΎα’ααα αΎα ααααα·ααααα·ααΆαααααααααΆαα½αα
αΆααααααΎααααα
ααααααααααΌα MDB_MAP_FULL
. ααΎαααααααααΎαααα α»ααααααααα
αααα»αααΆααααα½ααα·αα·αααααααααΎα ααα»ααααααΆααΆααα·α
αα½α
ααααα
ααααΆααααΆαααα αα½αααα’αΆα
ααααΌαααΆααααα·αααα
α·ααααα»αααΆααα
α ααα»αααα·αα αααΆααααΆαααααααΆααααΆαααααΎααααΆααα’αααα αα αΆαα αααΎαααααααααΆααααα»αα’αΆα ααΆααααα·ααααα·ααΆαααΌαα’αααααα ααΎααααΈαααααΈαααααααααΆαα»ααΌαααΆααααΈααααααααΌαααΆαααααΆααααααΆ ααΎαααΉαααααΌαααΆααα½αααααα·α αΆαααΆααΎαααααααααααΈαααααα ααααα LMDB α
α£.α’. ααααΈααΆα‘αα #3.2. α + - ααΎαααΎ
ααΎααααΈααααΆααααΆαααΆααΆααα ααΎααααΌαααααΆααααα»αααααααα ααααα·ααααα·ααΆαααΆααααααααααΌαααααΆαααααααΆααα αααα»α API ααααααΆα
- ααΆααααα αΌαααΆαα»ααααΈα
- αααααααααΆαα»αααααΆααααααααΆααααααα±ααα
- ααΆαααααΆαα»αα½αα
- ααααΎαααααααααΎα ααααααααααααααΆααα α»α ααΆαααααΆααααααα½αααααααΌαααΆαααααααα
αα ααΆαααααααααα·ααααααααΆαααααααα»ααααα’αΆα α’αα»ααααααΆααααΆαααΆααααα½αααΌαααααα·ααααα·ααΆαααΆαααα½αααΊααΆαααααΆαααααααααααααααααααααΈαα ααααΆααααΈαα½ααααααααΆααααΆαα±ααααΌαααααααααα αααααα»αααααΆααααΌαααααΌαααααα ααΆαααααΆαααααΈαα ααΆααααααααΆααααααααααΌα ααΆααα α αΎαααΆαααααΆαααΆααααααααααααΆαα ααΆαααα½αααΆαααΌααααααααΆααααααΆαα·αααΊαααααα ααΆαααΆααααααΆαααααααΆααααΎαααΎαα»ααΆααα½αα
ααΎαααΎαααααΈαααΆααα»ααα·ααααα·ααΆααΌαααααΆαααΈααααααΆααΆαααα½ααααα·αα±ααααΆαααααα·αααααΆαααΆαα
ααΆαααααααααα·ααααααααα’ααααΎααΆαα ααΈαα½αααααα·ααααα»αααααΆααααααα½αααααΊαα·αα’αΆα
ααΆααα»αααΆαα»αααΆαα ααΆαα αΆαα·ααααααααΉααααααΆαααααα»αααΆαααα½αααΆαααΎαααΎ ααααααααααααααααΎααααααααααΆα’αΆα
αα»αααααΆαααΆαααααΆαα αααααααΎα²ααααΆααααα»αααααΆααααααα½ααααααααΆαααααΆααααααααααΆααααα’αΆααααααα
α ααΎαααααααααα
ααΉαα’αααΈαααααααΉααα»αα ααΈααΈα ααΆααααααΌαααααααααααααΆαααααααααΆαααααΆααααα αΌαααΎαααΎαααααΈαααααΌαααααΆααα
αααα»αααα·α ααααΆαααα·α (ααΆααααααΉαααΆααααααΆαααααΆααα½αααΆ) α’αΆα
ααΆαααΈααΆαααα
ααΎααααααααααααααΆααΆαααααα»ααα
αααα»αααα·αα·αααα·αα ααΆαααααα ααΌααααΈααααΆαααααααΆααααααΆααααααααααΆαααα·αααΆαααΆα
αααΎααα
αααα»ααααααΆααα½αα’αΆα
αααααΌαα±ααα
αΌαααΎαα
ααα½αααααααααα’αΆα
ααααααααααΆαα αααααΊααΆαααα αΆααΌααααΈαααα
ααααααααΎααα·ααΆαα’αααΈααααα·αααααΆαααααΎαααΎαααααΈαααΆαα
ααΆαααααααααα·αααααααααα»αα’αααα
αα
αΆαααααα α
αΆααααΆααααΈααΆαααααα·ααααααα₯αααααααα
αααα»αααααΆαααααααΆαααααααα½αααααΆααα·ααααααΆααΆαααΈαααΆαααααααααα αα
ααααααααΆαααααααΆααΉαααΆαααα
ααααααααααααααΆααααΆαα½αααααΆααααΈααΆα ααααΆαααΆαααΉαααααΆααα
ααΆααΆαααααα»α
B-trees αααααΆααΆααα·ααααααααααΎαααΎαααααΈα αααααααΆααααα αΆαααααΆαααααααααα»ααααΆαααααα»αα ααΈαα½ααα½αααααΆααα»αααααΆαααααααα½αα―αα ααΈααΈα ααααΆααααΈαα½αααααααα½αααααααααααα»αααΌααααα·ααα ααΆ 2 ααα»αααααα ααΆαααα»ααα M α αΎαααα M α’αΆα ααΆαααα αααααΆαα ααΆαααααΆααααααΆαααα α¬ααΆααααΆααα
αααα ααα»αααα
- ααααΆααααΈαα½ααααΆαααΌααααααααΆααααααΆαα·ααα½α α αΎααα½αα ααα½ααα α αΎαααΎαααΎααααΈααΆααα
- αααααΆαααα½αααΆααααααααααααααα·ααααΈααΆααααααΈααΆαααα αααα»αααα· α αΆααααΆααααΈααααΆααα α»α αααααΆαααααααα·αααΊαααα·ααα ααΆααααααΆαααααααααΆαα·αα ααΎααααΆααααΌα ααααΆ α¬αα·αααΆαα
- α ααα½αααααΆααααααααΆαααααα α»αααΎαααΎααα‘α»ααααααααα·ααααα·ααΆααααααααααααΌαααΆαααΆαααααααα
- α ααα½αααααααΆααααααα αααααΆαα’αΆααααα»αα’αα‘α»αααααααα½ααα½αααααΌαααΆαααΆααααααα αααααΆααα½αααΆααΈαα½ααααΆαααΌααααααααΆααααααΆαα·ααα½αα ααα½ααααα½α α αΎαα
LMDB ααααΎαααααααα½ααα B-tree αααα α ααΆ B+ tree ααΎααααΈαααααΆαα»ααα·ααααααα ααααΆααααΆαααΆαααΎαααα αΆαααΈααααΆααααΈαααααααααααΆααα αααα»αααΆα
- αα αααααααΆαααΎααΊααΆα«αα ααΆαα·αααΆαα’αααΈααΎαααΈαααα·αααααΌαααααΆααα·αααααααα αααα»αααααΆαααααααα αα αααα»αα§ααΆα ααα LMDB αα½α α’αααα’αΆα αααααΎαααΌαααααΆααα·ααααααααΆα αααΎααααα αααααααααα αα’αΆααααααΆααα·αααα·ααααααΆαααΌααααααΈα αα½αααΆααΈαα½ααα αΆααααααΎαααΈα«αααααααΆα
- αα ααααα·αααΆααααα»αααΊααααΉαα αα½αααΆ αα·αααΆααααα½αααΆααα»ααααααααααΆαααΌαααααααααααααααΆαα»ααααα»αααΌαααααΆααα·ααααααα αα·ααΆαα’ααα αΉααααααΊααΆαααααααα·ααααααα B+-trees α ααααα·αααΎαααααΆα B ααααααΆαααααΆαα»ααααααααααααα αααα»αααααΆαααααααααααα·α αααααΆααααααααα½α B+ ααΊααααΉααααα½αααΆααααα»αααα»αααααα αααααΆααα½ααα»αααΆααα·αααα ααΎαααΉαα α αααααααααααααααΆααααααααΎαααα»α LMDB ααΆααΆαααααΆα Bα
- αα α αααααα«α αα·αααααΉαααΆαααααα·ααα αα ααααα 0 α¬α αααΎαααΆαααα ααΆαα½αααΉαααααΆαααα»ααα (ααΆααΆ)α ααΆααα·α αα αααααα½αααααΊααααΌααααα ααααΌααααααααΆααααααααααΆαααααΉαα
ααΆαααΌααα·ααααΆ ααααΆααααΊααΆαααα»αααααΆαα
αα
αΆααααααααααααααΆαααααααα»αααΆαα»αα ααα ααααααα½αααααΊααΆααα αα
αααΎααααααααααα·αα
αααα»αααααααααααααα·ααααα·ααΆααααααΎαααΆααα·ααΆααααΆααΆαααΎα αα
ααΆααααααααααααΆααααααΌαααΆααααα αΆαααΆααααααα ααααααΆααΆαααααααΆαααααΆ ββαααααΆααααααααααα»ααααααΆα§ααΆα αααααΊ ααΌααααααΆααααααα αααααΆααααΆαααααααΆαα’αααΈα’α»α αααα·αααααααα·ααΆαααααΆααα·αααααααααα·ααα
α αα·ααααααα’αΆα
ααΆααααΆααα
α»α
ααΆααααΈα ααααα·αααΎααΎααααα»ααα·ααΆαα’αααΈααααΆαααα»ααα α¬ααΌαααααααααΆααααΌααα
αααα»αααααΈααααααΉαα α’αααα’αΆα
α’αΆαααααααα’αααΈαα
ααΆααααααααααααααααα
αααα»αααΆαααΆαα
αααααΆααααααααΆαααΆαα½αααΆαα·ααΆααΆααααα»αααααααΆααααααα ααΎαααΉαααααΆαα±αα LMDB B-tree ααααααααααααα»αααααααααΆαααααααα»αααααααααΆααααααα
ααααααααααΆαααααΆααααΆαααΈααΆαααα ααΆαααααΆααααααααα ααΎααΆαα ααααααααααΆαααααααααααΆαααΆαααΈααΆαααα ααΆαα α»αα―αααΆαα αααααααααΆαααααα α ααΆααΆαααααααΆαα’αααΈα’α»α αααα·ααααα«αααααΎαααΎααΆααα’ααα’αΆα ααααΌαααΆαααααΎαα αα αααααΎαα―αααΆα LMDB ααααααααααα―αααΆαααααααααααΈα α»ααααααΎα ααΎααααΈααααααααααααααααΆααααΉαααααΌα α αΎαααΆααααααΆααααΎαααΌαααααΆααα·αααααααααααΆαααααΆααα
α₯α‘αΌαααααααααΆααααα·αα’αααΈαα ααΆααααααααα‘αΌααΈαα αα·αααΌαααααααα’αααααΆααα·αααααα ααΎαα’αΆα αααααα αα·α αΆαααΆαααααααααααΈααΈαα LMDB α ααΆααΊαααααΆααααα½αααααααΆ αααααΆαααααααααΆααααα»αααΆααα’ααααΎαα‘αΎααααα»αααααα·ααααα·ααΆα αα·ααα ααΆα ααααα‘ααααΈααααΆαα αα·ααα αα ααααααααα±ααααΌαααααΆααα·ααααααααΆααααΌαααΌααααααααααααααα·αααα α»ααααα
α£.α£. ααααΈααΆα‘αα #3.3. α ααααααΎααΆαααααα
ααααα·ααααα·ααΆα B-tree αα½αα ααα½αααΆαααααααααΉαααΆαααααΎααΆαααααΆααααααΌαααΆαααααααααΆαααα ααΎααααΆααααααααΆα α§ααΆα ααααα½αααΊααΆαααααααααΌαααααααΈαα ααααΆαααααααΆαααααααααααΆαα’αα·ααααΆααααααΆαα½α α αΎαα αααα»αααααΈααα ααΆα αΆαααΆα ααααα»αααΆααααααααααΆααααΆααΈα α αΎαααΈααΈαααΊααααΌαααααααααααα ααααΆααααΌααααααΎαααααΈαα αααα»αααααααααΆα ααΈαα·αα·ααΈαααααΊααΆααααααααααΆααααααΆααααΆααα ααααα·αααΎαααααΆααα ααα»αααα½αα ααα½α (ααΆαααΆαα ααΆαααΆα αα ααααα’αααα·αααΈα
αααααααααΆαααααααααααΈαα½ααααααΆααααΆαααααΎα±ααααΌαααααΆααα·ααααααααΆαααΆαα’αααααααααΊααΆααααααααα ααΆαααααααααα·αααααααα ααΎααΈααααααααα ααΆααααΉα B-tree - αααααα ααα»ααααα·ααααα·ααΆα αααααααΌαααΆαααααααΆααααΆααΆαααααα ααα»αααααααΆαα»α (WAL) α ααΆααΊααΆα―αααΆααα α α»ααααα ααααααααα·ααααα·ααΆααααααΆαααααααααΌαααΆαααααααααΆαααΉααααΉααα»αααααααααα B-tree ααααααα½αα―αα ααΌα αααα ααααα·αααΎαα·ααααααααααΌαααΆαααααΎαααΆααΆαα’αααΎαα»αααα½αααα‘α»ααααααααΎααααα·αα·α ααααααααααα½αα―α αααααΌαααααΆααα·ααααααααΉααα·ααΆααααΆααΎαααααα ααα»ααΎααααΈααΆαααααα½αααΆααΆαααααΆαααααααα
LMDB ααΆαααααΎαααΎααα·ααΈααΆααααααααααααααΆααΆααααααΆαα’ααα±αααα α»ααααααααα½α αααα α ααΆααΆαα ααααααΎααΆααααααα ααααΉαααΆαααααααΆααΊααΆ αααα½αα±ααααΆαααααΎαα αα α»ααααααααΆααα·αααααααα ααΎααααααααααΆαααααΆαα ααΆα ααααααΆααΆαααααα»α αα·αααααΎααΆαααααααααΆααα’αααα αααα»αα αααΆααα ααααα
αααααΆαααα ααΎααααΈα±αααα·αααααααααααΆαα’αΆαααααααΆα ααΆα αΆαααΆα αααααΌαααααΆααααααΌααααααααΆαααα ααααΆαααααααΆαααααΆαααΆαα αα α»αααααααα αααα»αααααΆααααααααααΆα αααααΆαβααΆβααβααααΌαβααααααβαααααΆααβααΆβααα ααΆβααβααααΌαβααΆαβα ααααβαα»αβααΆαα»αβαααα ααααΎαααΆαααααααΎαα‘αΎαααααααα αΌααααα«αα ααΏαα α»αααααααααααααΌαααααΆααααααΌαααΊαα·αααααααα ααΎαααααααααΆ.
ααααα·αααΎααααΆαααααααααΎαααΆαααΆααααα‘α»ααααααααΎαα αα α»ααααααααΆα ααααααααααααΆααααΈααΉααα·αααααΌαααΆααααααΎααα α¬ααΆααΉααα·αααααΌαααΆαααααααα αααα»αααΆαααΆαααααα»αααααα α αΎαααΆααα·αα·αααααααααΆααΉααα·αααααΉαααααΌαα αααα»αααααΈααΆααααΈαααα αααααααααΈααΉααα·αα’αΆα αα αααααΆα ααα»αααααααααα αΆααααΉααα·ααααααααααΆααααα ααααα»αααααΆαααααααΌαααΆααααααΆαα LMDB αααα»αααΆαααααααααααα ααα»ααΆαα»α ααΎααααΈαααααΆααΆααααΈαααααΆααααααΆαααα·ααααααα ααΆαααΆααα·α αα ααΆααααααααααααΆααααα»ααα·αααααααα ααΎααΆααααααΆααα·αααααΆααΆαααΎαααα»ααααααααΆαααααΆααΉαααααΎαααΆααα»αααΆαααααααΆα α’ααααααΆααααααααα ααα»ααααα·ααααα·ααΆαα αααΆααααΆααααΊααΆαααααααα·ααααα½ααα LMDB ααααααααααΌαααααΏαα’αΆααα·αααααααααααα
ααΆααα
ααΆαααααα αααα α
ααΆ append-only B-tree αααααααΌαααΆαα―ααααααα·ααααα·ααΆα αα·ααα α»αααααααααααααΆαα·α αα
αααα»α LMDB ααααα·ααααα·ααΆαααΎαααΈαα½ααααααΌαααΆαααααΆααααΆαα½αα«ααααααΆααααααΆααααααααα
αα
α»ααααααα αα αΌαααΆααααααααα·ααααα·ααΆαααααΌαααΆααααα
αα ααααααααααααΆααααααααΆααααΆαα½αααΆααΉααα·αααααΌαααΆαααααΆααααααΌα α¬ααααΎα‘αΎααα·ααααααΆααααααααααΈαααα·αααααααααααα ααΌα
ααααα’αααα’αΆα
ααααΎααΆαα±ααααΆαααΌαααΆααααα’αααα
ααααΆαααΆαα½αααΉααααα»ααα·αααααααααααΆααααααααα
ααααααα ααααα·ααααα·ααΆαααααΌαααΆαααΎα αααααΈααΆααα ααααα»ααα
ααααααααααΎαα
αα
α»ααααααααΆααααΆαααααααα
αααααααααααα αααααΊααΆααααΉαααΆαααααΆααααααααα
αααΎα αααααααΎα²αα LMDB ααΆααααααα·ααααααααααα’αααααΆααααα»αααααΆααΈαααα‘αΆααααααααΎαα UICollectionView
. αααααΆαααΎαααααα·ααααα·ααΆα αα·αα
αΆαααΆα
ααααααΎαααα αα’αααα
αα
αΆααααααααααα·ααΈααααααααΆαααααααΆαααααα
αΌααα·αααααααα
αα
α»αααααααα
αααα»ααα
ααΆαααααααααααα»αα’αααα
αα
αΆααα½αα
ααα½α αααααααααΆα
αα·ααα»αα’αααΈααΆααα’ααα αααααααα·αααααααααα
αα LMDB ααΈ SQLite ααΌα
ααααΆ ααααα·αα’αΆα
ααΆαα’ααα½αααΈααΆαα―ααααα»αααααααα αααααΆαααΎαααααα·ααααα·ααΆαααΈααα
αααα»ααααααααα α αΎαααΆααα»ααααααααααΆααΆααααΆαααα½ααα
αααα»ααα½ααααα»αα
αααααα½ααα ααΆααΉααα·αα’αΆα
ααα½αααΆααααααααααΆααΌα
ααααΆαα
αααα»αααΈααΈαααααα
ααααααααα
ααααααααα‘ααααααΆααααΊααΆααΆαααααΎααααΆαααααααΆαα»αααααααααα’αααα αα αΆααα·αααα·αα ααααΆααααα αΆαααΆααΎαα ααΆααααααααααΌαααααΆααα·ααααααααΉαααΎααα ααΌα ααααα ααααα·αααΎααΆααααΌαααΆααααααααααα»ααααααααΆαααααΆααΆαα½αααΉαααααα·ααααα·ααΆαα’αΆαα ααα½α 3 αααααΎαααΎααααααααααααααΆααααΌαααααΆααα·ααααααα αααααΆα LMDB αα·αα’αΆα ααααΎα‘αΎααα·αααΌαααααΆαααααα’αΆα αα αααααΆαααΈα«ααααααΆααααααΉαααααα·ααααα·ααΆααα αα α»αααααα α αΆααα·αααΆααααααΎαα’αααΈαααα ααΈαααα ααα«αααΈαα½ααααααααααα αααα»αααα· α αΎααααααααααααΌαααααααααααΆααααααααα αααααααΆα
αα ααΈαααααΆααΉαααΆααααααααααααα»αααΆαααααΉαα‘αΎααα·αααΌαααααααα ααΎα―αααΆααααααΆαααΌααααααΈα’αααα αα αΆαα ααΆα αΆααααΈααΌα ααΆααΆαααααΎααααΆααααααααααααα·αα·αααα·ααα·ααα½ααααα½αααΆααααααΎαα αααΎαααααα αααααααΆαα·αααΆααα½αα αααααααααΆαα αα αΆααααααααααα·ααΈαααααα ααααααΆαααΆααααα αααα»ααααααΆαα½αααααΆααα ααΆααααΌαααΆαααααααααααΆααααΆααααααααααααα·ααααα·ααΆα iOS ααΆαααΆαααΉαααααααα»αααΆααααα ααααΆ α αΎαααΎααα·αα’αΆα ααΌα ααΆαα ααΎαααΆαααΈααα α¬αα»αααααΌαααααΎαα» αααααααααα LMDB αα 1 αααααΆαα α αΎααα·ααα·αααΈαααααααα·ααααααααΆαααααααα ααΎα’αΆα ααααΎααΆα α’ααααα½αααααααΆααΆαααααΎα±ααααααα·ααααα·ααΆαααααααααααΈααΆααααα’αΆα ααααΎαα ααΆαα
4. ααΆααα ααΆαααααααΆααααα·αααααααα ααΎααααΌααα key-value API
α αΌαα αΆααααααΎαααΆααα·ααΆα API ααααααΎααααααΎαααΆαααααααααΆααΌαααααΆαααααααααααα LMDB: ααα·ααααΆα αα·αααΌαααααΆααα·αααααα ααΌααα αα·αααααα ααααα·ααααα·ααΆα αα·αααααααααααα·α α
αααααα αααΆαα’αααΈαααααΈααΌα
αα»αααΆαααΆααα’αααα
αααα»α LMDB API ααΆααΆααααααα‘ααααααααααααΆαααΆααααααα½ααααααα»αααααααααΆααΌαααα α»α ααα»αααααα
αααα»ααααααΈααΆαααααααααΆααααΆααα’αα ααΆααααααααααΆααααααααΆααααΌαααΆααα»αα
αααααααΆααααΆααααααααααααΆαααααΈα
ααΆαα·ααΈααΏααααα»αααΎααααΈααααΆαα 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
, αααααΎαααΆα ααααααΆαααΆαααααααΆααΆααααααΆα
αααΎαααΆαα α ααα»ααααΊααΆααΈαα·αα·ααΈαααααΆααααΆααααα
ααα’αααα
αα
αΆαα‘αΎααα·α (remap) αααααααΎαα»αααΆα 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;ββ
αααααααΎα§ααααααααααααα α αΆαααααααααααΆααα α»α ααΆαααααΆααα‘αΎαα ααααα·αααΎα’ααααα·ααααα½αααΆαααααααΆαααααα½αααααα’ααααα αααααααΆαααΎαααΉαααααΌαααΆαααααΎ ααααααααααα½αααΆααΆααααααααΆαααααΆααααααααβ
ααααα·ααααα·ααΆα
αα
ααΆααααααααααααα·ααααα·ααΆαααααΌαααΆααα·αααααΆαααα’α·ααα
αααα»α
- ααΆαααααααααααααααααα·ααΌαααααΆαααΆααα’ααα
ααΉαα’αΆαααΈα α α’αΆααΌαα·α ααΆααααΈαααααΆαα ααΆαα―αα αα·αααΆαααΏααΆααα αααα»ααα·αα’αΆα αα½αααΆαααααα»ααααα αααΆαααΆααΆαααα α»αααΆααααααΉαααΆαααααα ααΎ 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 fps αα·αααΆααααΌαααααααΌααααα»αα’αα‘α»ααααααααΎαααΆααααα ααΎααααΈαααααααΆααααΆαα’αΆαααααα’ααααααααΉαααΆαα α’αααααααΌααααααα’ααααΆααααΆαααααΆααααααΌααα·αααααααα
αααα»αααΌαααααΆα UICollectionViewDataSource
.
ααααα·αααΎααΌαααααΆααα·αααααααα·αααΆααααααΆααααααααα αααΎα α αΎαα’αα»ααααΆαα±ααα’αααααααΎααΆαααααΆαα½αααααΆαααΆααα αα α»ααααααααα»ααααα αααααΎααααΈαααααΎαααΌααααααααΆααααααααΆααααααααΆαααα·αααααα α’αααααααΌαα ααααααΆαα αα ααΆαααααααααα·αααααααααα»αα’αααα αα αΆααα½αα ααα½α α¬αα ααΆααΆαααααααα’αΆααααα αα·ααΈααΆαααααααΆαα½αααΆαααααααΆααααααααααααΆααα αα αααα»αααααΈααααΆααααα»ααααα»αα’αααα αα αΆα ααΎαααα½αααΆαααΆαα αααΆαααΆαααα αααα»αα’αααα αα αΆα ααααααααΆαααααΈααΆααααααΆαα»αααααα»αααααΆαααΆαααα αα·αααΆαααααααααΆ αααααΆααααααΉαααΆαααααααα ORM ααααααααααΌαααΆαααα αααα αααααΆααααΆααΆαααααααα’αΆαααα αααααΊααΆααΆαααΈαααΆααααααΆααααααααααααΆαααα αααααααΎα±αααααααΆααααααα»αααααΈααααα·αααααΆααα
αααααααααΆααα α»αααααααα½ααααα LMDB αααααααΆααααα αΆααααΆααααααΆααααααα·αααααααααααΆααααααααΆααα αααα»ααα·ααΈααααΎαααΆααααα»αα ααΆαααααααααΆααα αΎααααα»αααΆαααΎαααααα·ααααα·ααΆα αα·α voila - αα αΌααααααΎααααα ααααΆ αααα»ααα·ααααααααααΌαααΆαααΆααΆααΆααΉαααααΌαααΆααα½ααα»αα αααααα·ααααΆαααααΆααααααΏαα’αΆαααααααααααΆα₯α‘αΌααααααΊαααα·ααα αααα»ααααααααααΆαααααααα αΆαααΆαααααα»α ααααα·αααΆαααααΆαααααΆαααααΎααα»ααααααα
ααααααααααα·α
ααααααααααα·α αααααααααααΆααααααΆααααΆαααααΎα‘αΎααα·αααΆαααααΆααααΎααΌααααααααααΉαααΆααααααΆαααααααΆαααααααΆα B α ααΎααααΆααα½αααΆαα ααΆααΉααα·αα’αΆα αα αα½α αααααα»αααΆαααααΎααααΌααΆααΆαααααααααααααα·αααααΆααα αααα»αααΌαααααΆααα·αααααα αααα₯α‘αΌααααααΎαααΆααα ααα
α€.α’. ααααΌααΆααΆα
αααααααααααααα·ααααΆααααααΆαα·ααααααΉαα’αα»ααααΆαα±ααα’ααααααααΎαα’ααΌααΈααααα·ααααααααΌα ααΆααΆααΆααα ααΎααααΌααα abstractions ααΌαααααΆαα α αΌαααΎααα·α αΆαααΆααααΎαααΆαααααααααααΎα§ααΆα αααααααΆααΆαα αααααααααααΆαααΈααααααααα ααααααα»αααααααΆαα’αααΈα―αααΆα αα·αααααααα’αααααααΎααααΆααααΆααα’ααα
αααααααΆαααααΆααΆα
ααααΆααΈαααΌααΌαα
αα½α ααααα
ααΆααααααααΆααΆαααΆαα½ααααααΆααααα½αααααααΌαααΆαααααααα½αααΊααΆαααααΎαααΎαααΆαα»ααΆααα’αααααααΆααα
αααα»ααααααααΆααααααα±ααα ααααΌα’αααααΆααα·ααααααααααα’αααααΆαααααα½αααααααααααααα·αααααΆααααααααααααααΊ
ααΌαααΆαααΆαααααααααα αΆαααΈαααα αααααα’ααααΎαα·α αα ααΆααα αα ααααΆαααααααΆααα α»α αααα»αααααααααα’αΆααααα’αΆα ααΎααα ααΌα α ααβαααβααΆαβα’αααβαααααβα’ααααααααΆαβααβααβαα (αααα α) ααααΌαβααΆαβααΆααβααΆβαα»α αααααΆααβααβααΆαα½αβαααααα (αααα) αα·αβαα βααααα»αβααΆαα½αβααααα (ααα)αβ αααβααααΌαβααΆαβααααααβααΆαβααααΆαααΎαβα’αααβαααααααα LMDB ααΆαβααααΆαα lexicographical αα½αβααΆβααααΌαβααΆαβααααααβαααα»α αααααααααααΌαααΆαα ααΆαααααααΆααααααΆααα α»α ααΆαααααααααΆααααΆαα½αααΉααα»αααααααααααα αααΌα ααααΆαααααα±ααααΎαααΌαααααααααααΆααααααααααααα½αααααΆαααααΆααααααα½ααααα½αααααααΌαααΆααααα αΆααα αααα»αα ααα»α αααααΆααα’αααααααΎ (αα ααΆαααααΆα) ααααα·αα αΆαααΆα αααααΌαααΆαααααΎαααΆααααααααααααα
αααααααααΆααα α»α αα·αααααα
αα·ααΈααΆαααααααΆα
αααΎααααααΆααααΆαααΆαααααααααααα»ααααΌαααΆααααααΎαα‘αΎααα
ααΎαα·αααααα αααααΆαααΎααα·αααΆααααααΌαααΆααααααααααααα
ααΈααααΏα ααΎαααΆαααααΎαααΎαααΏααααα»ααααα’αΆα
ααααΎαα
ααΆααααααΆαααααα½αααΎα - ααααααα
ααααα’αααα
αα
αΆααααααΆααααΆαααααα§ααΆα ααααααα
ααΆααααααααααΆααΆ 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
};
}
αα
αααα»αααααΌαααΈ 1 ααααΈααΈαααααααα·αα·α
ααααααααΆαααααΎαααΎαααΌαααααΆααα·αααααα αααα»αααΆαααΎαα‘αΎαα’αααΈααΆαααααα½αα’αααααααΆααααΆααααα
ααααΆααααααα
αααα»αααααα·ααααα·ααΆα CRUD ααΆαααααΆααααΎαααΎαααααααΆααα αααααΌααα»αααΆα serialize
αααα αΆαααΈαααααααα»αααααΈ LMDB αα½αααα’αΆα
ααααΌαααΆααααααΆαααΆαααααα»ααα
ααααααα
αΌααααααααααΆααααΈαα
αααα»αααΌαααααΆααα·ααααααα α’αΆαααααααααα
αΌαααααΈαααΆαααΈαααααααΌαααααΌαααΆαααααααααα
ααΆαα
ααΆααααααααααα α αΎααααααΆαααααα½αααΆααααΌαααΆααααα
αααα
αααα»αααα ααααα»αα ααααα·α
αΆαααΆααΆαα·αααΆαααΆααααα
ααααΆααααααα
αααα»α LMDB αα α’αααα’αΆα
ααα½αααΆαααααΆαααΆαααα’ααα
αΆααααα½αααααααααααΆαααααααααααααα·ααααα·ααΆα iOS - ααααΎααα’αααα
αα
αΆααααααΎααααΈααααΎααΆαααΆαα½ααα·ααααααααΆαααααααααααΌαααΆααααΌαααΈαααααΆααα
ααΈα!
αααααΆαα·αααααΆααα α»α αααααααΎα§ααααααααααααααααααααααααααΈα
ααααΆααααααααααΆαααααααΉαααααΌαααΆααααααΆααααααα»αααΆααα·ααααα½αα α ααΆ α§αααααααααααααα αααααΆααααΆαααΈααα·αααΉαα’αααΈα’αααΈα’ααααααααααααααα½αααΆααΆα α’αααααααααααααααΆαααΎαααααΆααααααΎαα’αααΈαααα ααΈαααα αααααΆαααααΆααααααααααααΆααα ααααΆαααααααααααααα ααΆαααααΎααΆααΎααααΈαααα ααα ααΆααααααααααΊαααααααα ααΉααααααααααααααΎααΌαα α ααααααΆαααΆααααααααα»αααααΈααΆαααααααα»ααααααΆαα·ααΈααΆααααααααα’αΆα ααα½αααααΆαα αααααΎαβαααβααααΌαβααΆαβαα·αααααΆβααΆαααααα ααα»ααααβαααα»αβααΉαβαααβαααααΆααβααΌαβαα»ααα½α βααΈαβααΈβαααβααΆααααΆαβααΆαβααααΌαβαααα
ααΏαααααΌααααααααΌαα
αα
αΆαααΊααΆαααααΆαα’αααα
αα
αΆααααααααααα·αααααααααα ααΌα
αααααα
ααΎα§ααααα Apple ααΆααα’αα α’αααα
ααα½ααααααααΌαααΆααααααΆαα»αααΆαααααα
// 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
};
}
ααΆααααααααααΆα refactoring ααΎαααα½αααΆαααΆααααααααααααΆαααα
αααα»αα
ααααααααααΆααααΆαααααααα αααβααΆβαααΆαβααΆβαααβααΆαβααβαα·αααβαα
αα
ααβααα nameLength
α§ααααααααααααααααααααααααααΈαααααΆαααΎααα·ααααααααααααΆααααΆααααααααααααααΉααααααα ααααα·αααΎααΎααα·ααααα½αααΆααααααα½αααΎααα ααααααααααααααααααΉαααΆαααααΆα’αΆαα·ααΆαααααααααα»αααΆαααααααααΆαααααααααα½αα―αα
LMDB α’αα»ααααΆαα±ααααΌαααααΆααα·ααααααααΈαα½ααααΆααα»αααΆααααααααααααααΉαααααΆαααααα½αα αααααααΌαααΆαααααΎαααααααΎαα»αααΆα mdb_set_compare
αααΆαααΉαααΉααα»ααααααΎαα αααααΆααα ααα»ααααΆααααααα ααΆαα·αα’αΆα
ααααΆααααααΌαααΆαααααα½αααΈαα·αααααΌαααααΆααα·ααααααα α’αααααααααααααα½αααΆαααΌαααααΈααααα»ααααααααααααααααααααΈαααΆααΆααααα
αΌα α αΎααα
ααααααααΆαααα αΆαααααααααααααααα αα·α
ααΆα (-1) ααααΆα (1) α¬ααααΎααΉα (0)α Pseudocode αααααΆαα 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 ααααΎααΆααααΆαααααΆααααΆαα½αααΉααααααααααααααΆαααααΆααααααΆαα»αα ααΆααααααααααααααα½αααααΆαα½αααααΆαα αα·ααα ααααΎαα‘αΎααα αααα»ααααααααααααααααα·ααααα·ααΆααααααΆαα’αα»ααααααΆαα½α α αΎαααααΎαααΆααααααααααααΆαααΆααααΌαα’αΆαααααααΎααααΏαααααα’αααααααααααα αα αααα»ααα·ααααααα’αα½α α§ααααααααααααααααααααααααααΈαααααΆαααΎααα½ααααααααααααΆααααΎααααΈαααααααααα ααα»ααααααααα·αααΎα’αααααααΌαααααΎααααΆαααααα½αααααα’ααα αααααΈαα·αα·ααΈαααααΆαα deserializing keys αα αααα»αααΆαα½αααααΏαααΆααααα’αΆα ααααΎαα ααΆαα
ααΌαααααΆααα·αααααααα·αα
αΆααα’αΆααααααααΆαα·αααα
αααααααααααααααααααααααααΆ (ααααα) ααα ααΆααααααααααααααΆααΈααααΆααααα
ααααα»ααΎαα‘αΎααααα
ααααααααΆααααΌαααΆαααΆαααΆααα½α
α αΎααααααΌααααααα·ααΈ α§ααΆα ααα ααΎααααΈαααα αΆαααΆαα
ααΎα’ααααααα αααααΆαααΆααΎαα‘αΎαααααααΆαα αααααΌαααΆαααααΏααααααΆααααΈαα·αα·ααΈαααααΊαα·αααΌαααααΆαααα α αΎααα
αααα»αααΆαα’αα»ααααααααααΆ ααΎαααΆαααααΈααΆαα
αααΎααααα»αααΆααααααααΎααΆαααΆααααα½αα α§ααΆα ααα ααΎααααΈααααΆαααα·ααααααααααΆααΆαααααΈα’αααΈα―αααΆαααααα·αααΆααααΆαααΆααα ααΎαααααΎ NSKeyedArchiver
.
NSData *data = serialize(object);β
MDB_val value = {β
.mv_size = data.length,β
.mv_data = (void *)data.bytesβ
};
ααααααΆαααΆααααα ααΆαααααααααααααΆαα’αα»αααααα ααααααΆααα ααΆα§ααΆα ααα αα ααααααααΆαα»αα―αααΆα metainformation α’αααΈαα ααΆααααααααα―αααΆααααααα’αααααααΎααααΆαα ααΎαααααΎα’αααα αα αΆαααΌα ααααΆααααααα»α ααΆαααααα·α ααααΆααα·α αα ααααΆααααααΎαααααΆαααααααααα½αααΆααΊααΆααα·ααααααΆααΆαα»ααααααααΌαααΆαααααααΌααΆαααΆααΆαα»ααααααααααΆααα
ααΎααααΈα’αα»ααααααΆαα αααα»αααΆααΆ 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;β
}
αααααΈαααααΆααααα αΆααααα αΆαααΈααααααααααααααΆααααααΆααααα
αααα
ααΆααααααααα’αα»ααααΆαα±ααα’ααααααα
αΆααααΆααααα
ααααΆααααααα·αααααΉααααα
ααααααααααα»ααααααα ααα»αααααα
αααα’αΆααα·ααααααα ααΆαααααΈαα»αααΆα mdb_get
ααααα·α
ααΎααα
αααΆααα·αααααΆαααα
α’αΆααααααΆαααα·αα·αααα·α αααααΌαααααΆααα·αααααααααααΆαα»αααααΆαααααααααα»α ααΆααα·αααΎαααα½αααΆααααααα ORM ααααααααααααΏαα’αΆααα·αααααααααααααααΎααααα·ααα·αααααα αααααΈααΆααΆαααΆααααααααα’αΆαααΆααα’αααααα·ααΈααΆααααααααααααα
αΆαααΆα
αααααΌαα
αα
αΆαααΌααααααααα·αααααΆα
αααΎααααααΆααααααΉαααΆα
- αααααΆααααααα·ααααα·ααΆααααααΆαα’αΆαααααα»ααααα ααααα·α αα αα ααΆαααααααααααααααααΌαααΆαααΆααΆααΆαα ααααΆααα»ααααΆααα αΌααααααααα·ααααα·ααΆαααααΌαααΆααα·αα ααΌα αααααΆαααααααααΆααααΈαα»α ααααα B-tree αααααααα»αα½αααΆαααΈααΆαααα α’ααα»αα αααααααααΆαααα ααααααΎααΆαααααα αα αααα·αααααΆααααααΌααααΆαααΆαα½αααΆααααΌαααΆαααααααααααα·ααααα·ααΆααααΆαα αα ααΆαααα½αα αααα»ααααααΆαα½αααααΆααα αααΆαααΆααααα·ααααα·ααΆαα α»αααααααααααααΆααααΆαα½ααα½αααααΆααααα αα αααααα’αΆα ααααΌαααΆαααααΎααααΆααα‘αΎααα·ααααααΆαααα·ααααααααααΈα ααααα·αααΎααΆα αΆαααΆα ααααααΆααααααα»ααΎααααΈαααααΆαααΆαααΈαα·αααΈααααα·ααααα·ααΆααααααΆααααααΎα ααααα½ααααα ααααααΌαα ααααα
- ββαααααΆααβααααα·ααααα·ααΆαβαααααβα’αΆα ααααα·α βαα βαα ααΆααααααααβαααααβααααααβααΉαβααΆαβαα»ααααΆαβαα αΌαβαααβααΈαα·αα·ααΈβααααααβααααΌαβ (αααααβα¬βαα»αβαα·αααααα)α
- αααααΈααΆαα
ααΆαααααααα
NodeValue
αα·ααααααααα ααα»ααααααααΌαααΆαααΆαα (ααΌαααΎαααααααα "ααΆααααααΆαα·ααααααααααΎα§αααααααααααααααΆααααα ") α’αααα’αΆα α αΌαααααΎααΆαααααααΆααααα»ααααα·ααΆαααΆααααααααα·α α ααΏαα αααααΊαα»ααααα’ααααΌα! - αα·ααααα·ααααααααΆααααααααΆααααα αα
ααΆαααααααααα½αααααααΌαααΆαααααααααΆααααααααα·α
αααααΆαααα½αα ααΆαααααΆααααααΌαααΆααα’ααααααΌαααααααΎα‘αΎαααΆαααααα·ααΈααΆαααααααα»αααααα
mdb_put
. αααααΆαααΆαααΆααααα αα·αααΆα’αααα ααααααΎαα·α αα ααΆααααααααΆαααα»ααααΆααααα ααΆαα·αα’αΆα αα αα½α ααααα αααααααΆαααααα’αααα αα αΆαααααα ααΆααααααααααααααα·ααα ααααΌαααΆαααΌααααααΈαααα»αααααααΆαααα’αΆαα - αααα
αα―αααΆαα‘αΎααα·ααα
ααααααα’αΆααααααΆαααααΎαααΆααααααΆαααααααααα§ααΆα ααα ααΆααααααΎαααα ααααα»αα’αα·ααααΆαααααααΎαα»αααΆα
mdb_env_set_map_size
ααααΎα±ααααΆααα»ααααΆαααΆαααααα»αααΌαααααα·ααααα·ααΆαααΆααα’αα αα·αα’αααααΆαααΆαααααααααΆααΌαα αα·αα ααα’α»ααα ααααα»ααΆααααΆααα
ααΆα
α»αααααα αααααααα·ααααα½ααααααΊα’αΆαααααααααΆααααΆαα αααααΆααααα αΆαααααΉαααΆαααααααΆαα·αααααΉααααΆαααααα½ααααααα αα
αααα»αααααΌαα’αααΈααΎαααΎ B αααα»αααΆααααααααααΆααααΆαα’αααΈααααααααααααααααααΆααααΌαααΆααααα
ααααα»αααΆαα
αα
αΆαα ααΆααααΎααΆαααΈααααααα’αΆααααααΆαααααΆαα
αΆααααααΎαααααα·ααααααα’αΆααααααΆαα½αααΉααα·αααααααααααα’αΆα
ααααΆαααΆαααααα»αα αααααΆααααααααααα·α
αα
αα½αααααΆαααα½ααα
αααα»ααα
ααΆαααααααα MDB_val
α αΎαααΆααααααααα
ααΆααααα·α
αα
αα
ααΆαααααααααα½α ααΆααααααΆαα·αααααααααΆαα
αααα»αααααΈααΌαα
α αααα»ααααααΆαα½αααααΆααα ααααΆαααααααααααααααααΈααα½αα
ααα½α (αααα»αααααΈ iOS αααααΊ armv7) αααααΌαα±ααα’αΆααααααΆααααα·ααααααααΆαα½αααΆαα α»αα»αααααα αααααΆααααααΆαααΈα α¬αα·ααΆααααααΆαααα ααα ααααΈααααααααααα ( αααααΆαα armv7 ααΆααΊ 32 αααΈα) α αα·ααΆααααααΆααααααααα·ααααα·ααΆαααΌα
ααΆ *(int *foo)0x800002
αα
ααΎαα½αααααΊααααΎααΉαααΆααααααα
αααα½ααα·αααΆαα±ααααΆαααΆααααα αΆαααΈαα·αααΆαα½αααΉαααΆααααα EXC_ARM_DA_ALIGN
. ααΆαβαα·ααΈβααΈαβαααΆαβααΎααααΈβαααβααΆαβααΈβαααβααΆαααΆβααβααααα
βαααβαααα
ααΈαα½α ααΆααααααΆαα αααααα·ααααααααααα αααα»ααα ααΆαααααααααααααΆααααααΉαααΆαααααααα α§ααΆα ααα αα ααΎα§αααααααααααααααααΆαααααα½α ααΆααΉαααααΌαααΆααααα»ααααα αΆααααΌα ααΆααααααα
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 ααΆαα·αααααΆα’αΆα ααααΌαααΆαα’αα»αααααα αααα»ααααααααΆααααΆααΈαα
- αααα₯ααααααααα αααααααΆααα’αααα»ααααααααααααα»ααααααααααααΌαααΆαααΎαααΈα―αααΆααα α’αααα αα αΆααα αααααΆααααααααααααΆααα
ααΆααααΆαααα’ LMDB API αααααααΌααα·ααΈααααΆαααααα·αααααΆααα½ααααα»αααΆααααααααΈααΆααααααααααααα·α
ααααΌαα ααΎααααΈααααΎααΌα
αααα α’αααααααΌααααααΎαααΌαααααααααααααααααΆααΆααααααααα·α
ααΆα α¬ααααΎαα
ααΉααααααααΆαααΈααΆαααα
αααααααααΆαααΎααα
ααααααααα ααΆα§ααΆα ααα ααΆααααααΉααααααΈαααα»αααΌαααΆαααΎ ααΎαα’αΆα
αααααΎααααα½ααααα»αααα ααΆα 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 ααΎαβαα·αβααααΉαβααβααα½αβααΆαβαααααΉαβααα»αααααβαα ααα»ααααβααβαααααβααβαααα ααααα·αααΎααΎααααΈαααααααααααααααααααΌ α’αααααααΌααα·αα·αααααΎα αααα»αα αααααααααααααααα ααΆαααΈαααααααααααααααααααααΆ ααααα½αααΆα’αΆα α αΌαααααΎαααΆαααΆαααααα·αααΆαααΆααα·ααΆαααααααα
α€.α£. ααααΌααααΆαααααααααΆαααΆααΆα
ααααααααααα ααΎαααΆααααααααααααΎααααΈαα·α αΆαααΆααααααα·αααααΆαααΆααα’ααααααΆααα ααΆ αα·αααααΎααΆαααΆαα½αααΌαααααΆααα·ααααααααΆααΆααααα½αα ααΎαβα’αΆα βαα·ααΆαβααΆαβααΆ ααΆααΆαβαα½αβααΊβααΆβαααα»αβααβαααααααααΆβαααβααΆαβααααααβαααβααΆαβααααααβααΌα ααααΆβααβααΌβαααααβαααααΉαα ααααα·αααΎα’ααααααα αΆαααΌαααααΆα αα»αααααα αα·αααααααααααΆαααααααααΆ parallelepiped α’αααααα½αααΆαααααΆααααΆααααααΎαααΎαααααΌαααααΆααα·ααααααα
'' '"
αααααΆαααΆαααΆααααα αα αααα»αααΈαα·ααα·α ααΆααααααΉαα’αΆα ααα½αααΆααααααΆααααα αΌαααΆααα·α αα½α ααΆααα ααΆααΉαααΆαααα αααα»αααΌαααααΆααα·αααααα ααΆααααΌαααΆαααΆαααΆα ααΈαα½αααΆαααΆααΆαααΆα αααΎα α αΎαααΈααΈα ααΎααααΈααααΎααΆαααααΎαααΎααα αααα»ααα½αααΆααΆαααααΆαααα»αααΈαααααΉαα ααααα αααααα α»αααααααααααααΌαααΆαα§αααα·αααααααα αΆααααΆααααααΎα αα·αααΆαααααΆααααααΆαα αα·ααα ααα
ααΆααΆαααααααααα
αααααα·ααΈαααααΆαααααα "αα·α α·αααααΆα" α ααΆαααα αΆαααΆαα·ααΆααααααΈαααααΆααααΌα ααααααααΆαααΆαααα·α ααααα ααΎααααΈβα’αα»ααααβαααααΎαβαααβαααβα±ααβααΆαβααα’βαααααΎα βαα βααΆααβααΆααΆαβαα α’αααβααααΌαβαααααΎαβαα½αβαααβααΆαα½αβααΉαβααααααβααααααΈα αα½αααΆααΉαααΆαααΆααα½ααααααΆαααΆαααα·α αααααααα―αααΆαααααΌαααΆααααααΎα αααααΉαααΎααα½ααΆαααααααα·αα·α ααααααααααα ααααα αααααΆαααααΆααα α»α ααααΈααααα·ααααααααΌα ααααΆααΉαααααΆααα α»α αα αααα»αααΆααΆααα αα½αααΆααααΌαααΆαααα α ααΆ index keys α αα αααα»αααΌαααΆαααΆαααααααα½αααααααΌαααΆαααααα·α ααΆαααααΉαααααΌα α
ααΎααααΈαααααααααααΆααΆααααααααααΆααΈααααΆαα αα·ααα αααα αααα»αααΌαααααΆααα·αααααααααα½α ααΆααΆαααΈααΆααα αα ααααααααααααα½αααααΌαααΆααααααααα αα½αααΆααΆααα’ααα αααααααΎα±ααααΆααΆα’αΆαα·ααΆαααααααααα»ααααααΆααααΆααααααα ααΎαααΉααααααα ααΆαααΌαααΆαααΆααααΆαααα»αααααΌαααααΆαα»ααααααΆααΆα αα·ααααα»αααΆααΆα - ααααα ααΆαα αααΆααααααααΎαααααΆααα
αααααΉααα·αα·ααααααααα·ααααααααΌα ααααΆαα ααΉααααααΉαα ααααα ααΆαα’αα»ααααααααααααααα’α αααααααααααααΆααααααΆαααααΆααααΆαα½αααΆααΌαα αααΆααα ααααααααααααααααααααα ααααααΊαα·αααα’αααα»αααΆαααααααααΆα αααΎαα
- ααΎαα·ααΆαααΈααα ααααα»ααα·ααααααααααΆα’αΆα αααααΌααααα
- ααΆαααααααααααΆαα’αα»αααα α αΆααααΆααααΈαααααααΎαα αα α»ααααααααΆααα·ααααααααααΆααααααΆαα α’αααααΉαααααΌααααααααΆα‘αΎααα·ααααααααΎααααΆααα α»α ααΈαα
- ααΆαααααααααααΆαααΆααααααΌα ααααα·αααΎααΎαααααα ααααΎαα αα α»ααααααααΆααα·αααααααααααΆααααααΆαα½αααα ααΎαααΉαααα½αααΆαααα α»αααααααααααΆααα·ααααΈαααααΆααααααΆαααα·αααααααα αααα»ααααααααααα»αα
αααααΆααααΎαααΉααα·α αΆαααΆααΈαααααα»αααααΆααα ααα»α ααααααΆαααΆαααααα
ααΆααααα αααααΆαααααααααΆαααΆααΆα
ααααΆαααΊααααα’αααααΆααααΆαααααΆααααΆααΆααα·αα·ααααααΆαα½αααΆααΆααα "αααααΉαααΆααααα". ααΌα ααααααααααααααΆααΆααααα αΆα αααααααααααααααααααααΆαα·αα·ααααααΊααΆα αααΆααα αααααααααααααα ααααα αα·ααΈααΆαααααααααα»αααααΆαααα»ααα·ααααα·ααΆααα’αααααααΆααααααΆααααΆαααΎαααααΆααααααΉαααΆααααααΆαα»αα αααΆααα αααααααααααααααααααααααααααΆαααα ααΆαα αααΆααααα½ααααααΊααΆααΎααααΈααα½αααΆααααααααα index key α’αααααααΌαααααΎ 2 queries αα ααΆαα database αααα½αα±αααα½αα ααΆααααααααΆααα αααααααΆαααααΌαααααΆααα·ααααααααααααααΎααα ααΌα αααα
ααααΌαα½ααααααααααααααΆααααΆααααα αααααΆαααααααααΆαααΆααΆαααΊ "ααβαα·αβααααΎβααααΆαα". ααααΉαααΆαααααααΆααΊααΆααααααααα»ααααααααααααααα ααΎαα ααααα·αα αΆαααΆα ααααααΆααααΆααααααααα ααα»αααααααααΆααααΆααααααΎααααααααΆαααααααα‘αΎααα·αα αα αααα»ααααααα·ααΈ Mail.ru Cloud ααΆαα§ααΆα αααααΆαααααααααααΆαααααΎααααΆααααααααΆ ααΎααααΈαααααΆαααΆααααααα αΌααα αααα»ααααα α ααα·ααααααααααααα iOS ααΆααααΆαα αααα»αααΉααααααααΆαααααα·ααα½α ααα»ααααααΆα§ααΆα αααα αααΆααααΆαα
Cloud mobile clients ααΆααααααααααααα αΆαα―αααΆα αα·αααααΆααα’αααααα’αααααααΎααααΆααααΆαα αααααααααΆαα½αααα»αααααααααααα αααααΆαααΆαα―αααΆααααααααα·α αα½α α αΎαααΆαααααααΆαααΆααααΆααααΆα αααΎαααααααααααααααααΆα’αααΈααΆαααααααααααΆααααααΆααααααΉααα½ααα (α’ααααααααααΌαααΆαααααααα·αααα·α αΌαααααΎααααΆαα αααααΆααα·αααα·α’αααΈααα) ααΆααΉααα·αααα ααα»αααααα»αααααα»ααααααααααααα αααααααΆαα αααα»αααΆααΆαα ααααααΆαα½αααΆα ααααααΆαααΆααααα ααααα·αααΎα’αααα αααααα αΆαα―αααΆααααααααααα αααααΆα α’ααααα ααααααΌααααααΆαα»αααΆαα ααααααααΆαα½αα αααααααααΆαααααααΆαα·ααΊαααααΎαααΆααΆαααΆα ααααα‘αααααααΆααααΆα αα αααα»αααααΆααααΆαααΆαααααα ααΌαααααααααΆααααΌαααΆααααα αΌααααα’αααα "P" α αΎαααααααααΆαα "propname" α’αΆα ααααΌαααΆααααα½αααααααααααΆααααΆααααΆα "ααααααΆαααΆααΆααα"αβ
ααΆαααα·ααααααααααΆαααα½αααα αααααΆααααΆααααααααααααΆααααααΆαα»ααααααΆααΆαααααΈααααΌαααΆααααααΎαα‘αΎα ααααΌαααΆαααΆαααααα»ααααααααααααααααααααααΆα αααα»ααααααΆαα½αααααΆααα α’ααααα·αα ααα αααααα·ααααααα’αααΈα―αααΆα αα·αααα―αααΆααααααααΌαααΆααααααΆαα»ααααα»αααΆααΆααααα½α α αΎααααααα αααα½ααααα·α αα·ααααααααααααααααΌαααΆαααα αααααααΌαααΆααααααααα ααααΆααα α»α βPβ αααα»αααααααααααΆα βααααααααΆααααααΆααβ αα·α βααααΆαααααααΆβα ααΌαα’ααα»αααααα½ααα α’αααα’αΆα αααααΎαααΌααααα·αα·αααααα½α αααα’αααα’αΆα ααα½αααΆαααΌαααα αααα αααααΈαααα»αα’αααα’αΆα ααα½αααΆααα·ααααααααααΆααααααααΆααα
ααα ααααΈααααα·ααααΆα
ααΎαααΆααααααααααααααααΆαα’αα»αααα LMDB ααΆαα·αααααΆαα αααααΆααααΈααΆ α ααα½αααααΆαααααααααααα·ααΈααΆαααα α»α 30%α
ααααααβααβααΆαααΆαβαααβααΆαβααααΎβααΆαβααααα
βα‘αΎαβααΎαβααΈβαααα»α iOSα αα
αα
α»ααααααααα ααααα "α―αααΆα" ααααΆαααα½ααα
αααα»ααααααα·ααΈ Android ααααΆαααααΌααα
ααααΎ LMDB α αΎαααααααααααααααααα»αααααΎαααΆαα ααΆααΆ C αααβαααααΆαα»αβαααααβααααΌαβααΆαβα’αα»αααα ααΊααΆβαααα½αβααβααα’βαααα»αβααΆαβαααααΎαβααααααααβαααααα·ααΈβααααΌαβαα»ααα·αβααΆβαααααααα·ααΆβαααα»α C++α αααΆαααΈααααααΎαααΌαααααΌαααΆαααααΎααΎααααΈααααΆαααααααΆααα C++ αααααααααΆααααΌαααΆαα½αααΉαααΌααααα·ααΆαα
αααα»α Objective-C αα·α Kotlin
ααααα: www.habr.com