[검증] levelDB는 데이터량이 증가하면 데이터 등록에 시간이 걸리는가? ?

신경이 쓰인 것



ethereum을 프라이빗 블록체인으로 사용할 경우 데이터량이 늘어나면 geth(go-ethereum) 내에서 사용되고 있는 levelDB에 데이터 등록에 시간이 걸리게 된다는 기사를 발견했다.
그런 일이 있어. 라고 생각해 실제로 계측해 보았다

했던 일



Key는 처리 번호, Value에 적당한 데이터라고 하는 적당한 데이터를 100만건 등록한다.
100건마다 소요한 처리 시간을 계측하여 처리 시간이 증가하고 있는지 확인했다.

levelDB뿐만 아니라 마침내 mongoDB에서 시도했습니다.

levelDB 처리 시간



아래 코드로 데이터 등록

measurement_leveldb.py
import time
import leveldb

# テストデータ:750バイト
inputData = '{"_id" : "ObjectId(\5e3b4dd825755df3f15a2d17\")","coediting" : False,"comments_count" : 0,"created_at" : "2020-02-05T20:20:10+09:00","group" : None,"id" : "6ed1eec1d6fba127a863","likes_count" : 0,"private" : False,"reactions_count" : 0,"tags" : [{"name" : "Python","versions" : [ ]},{"name" : "MongoDB","versions" : [ ]},{"name" : "Python3","versions" : [ ]},{"name" : "pymongo","versions" : [ ]}],"title" : "PythonでmongoDBを操作する~その6:aggregate編~","updated_at" : "2020-02-05T20:20:10+09:00","url" : "https://qiita.com/bc_yuuuuuki/items/6ed1eec1d6fba127a863","page_views_count" : 96,"tag1" : "Python","tag2" : "MongoDB","tag3" : "Python3","tag4" : "pymongo","tag5" : "","tag_list" : ["Python","MongoDB","Python3","pymongo"],"stocks_count" : 0}'

start = time.time()

db = leveldb.LevelDB("measurement_test")

start = time.time()

for i in range(1,1000001):
    db.Put(i.to_bytes(4, 'little'), inputData.encode('utf-8'))
    if i % 100 == 0:
        end = time.time()
        print("{0}:{1}".format(i,end-start))
        start = end

처리 결과


mongoDB 처리 시간



아래 코드로 측정

measurement_mongodb.py
from mongo_sample import MongoSample
import time

mongo = MongoSample("db","measurement")

# テストデータ:750バイト
inputData = '{"_id" : "ObjectId(\5e3b4dd825755df3f15a2d17\")","coediting" : False,"comments_count" : 0,"created_at" : "2020-02-05T20:20:10+09:00","group" : None,"id" : "6ed1eec1d6fba127a863","likes_count" : 0,"private" : False,"reactions_count" : 0,"tags" : [{"name" : "Python","versions" : [ ]},{"name" : "MongoDB","versions" : [ ]},{"name" : "Python3","versions" : [ ]},{"name" : "pymongo","versions" : [ ]}],"title" : "PythonでmongoDBを操作する~その6:aggregate編~","updated_at" : "2020-02-05T20:20:10+09:00","url" : "https://qiita.com/bc_yuuuuuki/items/6ed1eec1d6fba127a863","page_views_count" : 96,"tag1" : "Python","tag2" : "MongoDB","tag3" : "Python3","tag4" : "pymongo","tag5" : "","tag_list" : ["Python","MongoDB","Python3","pymongo"],"stocks_count" : 0}'

start = time.time()
path = "measurement.txt"
with open(path, "w") as out:
    for i in range(1,1000001):
        mongo.insert_one({str(i):inputData})
        if i % 100 == 0:
            end = time.time()
            out.write("{0}:{1}\n".format(i,end-start))
            start = time.time()

처리 결과


검증 결과



처리 결과의 분포를 보면, levelDB, mongoDB 모두 일정한 처리 시간대에 대체로 분포하고 있다.
돌출하여 처리 시간을 필요로 하는 것도 있지만, 수건 정도이기 때문에, 기입 속도가 열화하고 있다고는 말할 수 없다.

데이터량에 따라 쓰기 속도가 느려지는 경우는 오른쪽 어깨 올라가거나 오른쪽 위를 향해 곡선을 그리는 분포가 되지만, 이번 검증에서는 이러한 분포가 되지 않았다.

감상



읽은 기사의 상세한 환경이나 데이터량이 불명했기 때문에, 참고로 한 기사의 내용이 사실인지 어떤지까지는 불명인 채입니다.
또한, geth는 당연히 go 언어이고, 나는 go의 환경을 만드는 것이 어색했기 때문에 파이썬으로 시도했습니다.
이 근처도 영향이 있을지도 모르기 때문에 계속 조사해 볼까라고 생각합니다.

levelDB에 대해 조금만 지식을 얻을 수 있었기 때문에 좋았습니다.

좋은 웹페이지 즐겨찾기