• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

rocksdb

date: 2022-01-04 excerpt: rocksdbの使い方

tag: python3kvsrocksdb


rocksdbと使い方

概要

  • facebookが作成したkvs
  • leveldbに似たパフォーマンスと更にいくつかの改良が施されている

インストール

debian, ubuntu

$ sudo apt install liblz4-dev libsnappy-dev librocksdb-dev

pythonのクライアントライブラリのインストール

$ python3 -m pip install python-rocksdb
  • liblz4, libsnappyも含めてリンクが行われる

使用例

初期化

import rocksdb

opts = rocksdb.Options()
opts.create_if_missing = True
opts.max_open_files = 300000
opts.write_buffer_size = 67108864
opts.max_write_buffer_number = 3
opts.target_file_size_base = 67108864

db = rocksdb.DB('rocksdb_test', opts)

値の書き込み

db.put(key, val)
  • key, valはbytes型

値の取得

db.get(key)

値の削除

db.delete(key)

すべてのアイテムをiterate

it = db.iteritems() # イテレータを得る
it.seek_to_first() # イテレータを先頭に移動
for k, v in it: # すべてのアイテムをイテレート
    ...

パフォーマンス測定

  • rocksdbとleveldbの速度差を計測
  • ランダムに10万件のキーとバリューを作成し、書き込みを行い、読み出しを行う
import rocksdb
import random
from hashlib import sha512
from loguru import logger
import shutil
from pathlib import Path

if Path("./rocksdb_test").is_dir():
    shutil.rmtree("./rocksdb_test")
if Path("./leveldb_test").is_dir():
    shutil.rmtree("./leveldb_test/")

opts = rocksdb.Options()
opts.create_if_missing = True
opts.max_open_files = 300000
opts.write_buffer_size = 67108864
opts.max_write_buffer_number = 3
opts.target_file_size_base = 67108864
db = rocksdb.DB('rocksdb_test', opts)

kv = {}
for i in range(10**6):
    key = bytes(str(random.randint(0, 10**9)), "utf8")
    val = bytes(sha512(key).hexdigest() * random.randint(1, 10), "utf8")
    kv[key] = val

logger.info("start benchmark to rocksdb.")
for k, v in kv.items():
    db.put(k, v)
    assert db.get(k) == kv[k]
del db

db = rocksdb.DB('rocksdb_test', opts)
it = db.iteritems()
it.seek_to_first()
cnt = 0
for k, v in it:
    cnt += 1
    assert v == kv[k]

logger.info(f"finish benchmark to rocksdb. total keys = {cnt}")

import plyvel
db = plyvel.DB('leveldb_test', create_if_missing=True)
logger.info("start benchmark to leveldb.")
for k, v in kv.items():
    db.put(k, v)
    assert db.get(k) == kv[k]
cnt = 0
db.close()

db = plyvel.DB('leveldb_test', create_if_missing=True)
for k, v in db:
    cnt += 1
    assert v == kv[k]
db.close()
logger.info(f"finish benchmark to leveldb. total keys = {cnt}")
  • 結果として、rocksdbで7秒、leveldbで25秒であり、rocksdbのほうが早かった


python3kvsrocksdb Share Tweet