๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Python

LMDB ํ˜•์‹ ๋ฐ์ดํ„ฐ์…‹์ด๋ž€? | ํ…์ŠคํŠธ ์ธ์‹ ๋ฐ์ดํ„ฐ์…‹ ํฌ๋งท

by ๋ญ…์ฆค 2023. 4. 14.
๋ฐ˜์‘ํ˜•
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()

 

 

๋ฐ˜์‘ํ˜•