LMDB (Lightning Memory-Mapped Database)
lmdb๋ Lightning Memory-Mapped Database์ ์ฝ์๋ก, embedded key-value ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ด๋ค. lmdb๋ ํ์ผ ์์คํ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฝ๊ณ ์ธ ์ ์๋๋ก ํ๋ค. ์ด๋ ๋น ๋ฅธ ์ฝ๊ธฐ์ ์ฐ๊ธฐ, ์ฐ๋ ๋ ์์ ์ฑ, ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ด, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ ๋ ๋งค์ฐ ํจ์จ์ ์ด๋ค.
lmdb ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํค-๊ฐ ์์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ, ์ฌ๊ธฐ์ ํค๋ ๊ณ ์ ํ ๋ฌธ์์ด์ด๋ฉฐ, ๊ฐ์ ์ด ๋ฌธ์์ด์ ์ฐ๊ด๋ ๋ฐ์ดํฐ์ ๋๋ค. ์ด๋ฌํ ํน์ง์ ํ ์คํธ ์ธ์ ๋ถ์ผ์์ ๋งค์ฐ ์ ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ์ง์ ํด๋น ์ด๋ฏธ์ง์ ํฌํจ๋ ํ ์คํธ ๋ผ๋ฒจ(GT)์ ์ ์ฅํ๋ ๋ฐ์ lmdb๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ค์ ๋ก ๋๋ถ๋ถ์ ํ ์คํธ ์ธ์ ๋ชจ๋ธ์ ๊ณต์ ์ฝ๋์์ lmdb ํ์์ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ๊ณ ์๋ค.
lmdb๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ํ์ด์ฌ์์๋ lmdb ๋ชจ๋์ ํตํด ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์๋ค.
lmdb ๋ชจ๋ ์ฌ์ฉ๋ฒ (python)
- lmdb ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ณ ๋ซ๊ธฐ : lmdb.open ํจ์๋ฅผ ์ด์ฉํด์ ์ด๊ณ close ํจ์๋ก ๋ซ์์ผ ํจ
- lmdb ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ฐ๊ธฐ
- env.begin ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํ๊ณ , txn.put ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์์
- put ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ๋ฐ์ดํฐ์ key๋ฅผ, ๋ ๋ฒ์งธ ์ธ์๋ก๋ ๋ฐ์ดํฐ์ value๋ฅผ ์ ๋ฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋๋ ๋ฌธ์์ด์ด ์๋ bytes ํ์์ผ๋ก ์ ์ฅํด์ผ ํ๋ฏ๋ก, encode ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ bytes๋ก ๋ณํ
- lmdb ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ
- txn.get ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์
- get ํจ์์ ์ธ์๋ก๋ ๋ฐ์ดํฐ์ key๋ฅผ ์ ๋ฌํ๋ฉฐ, ๋ฐํ๊ฐ์ผ๋ก๋ bytes ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ
- ์ฝ์ด์จ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์ด์ผ ๊ฒฝ์ฐ, decode ํจ์๋ฅผ ์ฌ์ฉํ์ฌ bytes๋ฅผ ๋ฌธ์์ด๋ก ๋ณํ
import lmdb
# LMDB ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐ
env = lmdb.open('/path/to/database', map_size=int(1e12))
# LMDB ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ฐ๊ธฐ
with env.begin(write=True) as txn:
key = 'some_key'
value = 'some_value'
# ๋ฐ์ดํฐ ์ฐ๊ธฐ
txn.put(key.encode('utf-8'), value.encode('utf-8'))
# LMDB ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ฐ๊ธฐ
with env.begin() as txn:
key = 'some_key'
# ๋ฐ์ดํฐ ์ฝ๊ธฐ
value = txn.get(key.encode('utf-8')).decode('utf-8')
print(value)
# LMDB ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ซ๊ธฐ
env.close()