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のほうが早かった