-
-
Save coleifer/747c4406b3c2363e0716 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import time | |
import bsddb3 | |
import kyotocabinet as kc | |
import plyvel | |
from lsm import LSM | |
def timed(fn): | |
def inner(*args): | |
s = time.time() | |
fn(*args) | |
return round(time.time() - s, 3) | |
return inner | |
class Test(object): | |
def __init__(self, n): | |
self.n = n | |
if os.path.exists(self.filename): | |
if os.path.isdir(self.filename): | |
os.removedirs(self.filename) | |
else: | |
os.unlink(self.filename) | |
self._db = self.get_db() | |
def close(self): | |
try: | |
self._db.close() | |
except AttributeError: | |
pass | |
@timed | |
def test_writes(self): | |
for i in range(self.n): | |
self.write('%09d' % i) | |
@timed | |
def test_reads(self): | |
for i in range(self.n): | |
self.read('%09d' % i) | |
@timed | |
def test_range(self, r): | |
l = int(self.n * r) | |
for i in range(0, self.n - l, l): | |
low = '%09d' % i | |
high = '%09d' % (i + l) | |
self.get_range(low, high) | |
def write(self, i): | |
self._db[i] = i | |
def read(self, i): | |
return self._db[i] | |
class BDBBTreeTest(Test): | |
filename = '/tmp/bdb_btree.db' | |
def get_db(self): | |
return bsddb3.btopen(self.filename) | |
def get_range(self, low, high): | |
self._db.set_location(low) | |
while True: | |
k, v = self._db.next() | |
if k == high: | |
break | |
class KyotoBTreeTest(Test): | |
filename = '/tmp/kyoto_btree.kct' | |
def get_db(self): | |
db = kc.DB() | |
db.open(self.filename, kc.DB.OWRITER | kc.DB.OCREATE) | |
return db | |
def write(self, i): | |
self._db.set(i, i) | |
def read(self, i): | |
return self._db.get(i) | |
def get_range(self, low, high): | |
cursor = self._db.cursor() | |
cursor.jump(low) | |
while True: | |
k, v = cursor.get() | |
if k == high: | |
break | |
cursor.next() | |
class LevelDBTest(Test): | |
filename = '/tmp/leveldb.db' | |
def get_db(self): | |
return plyvel.DB(self.filename, create_if_missing=True) | |
def write(self, i): | |
self._db.put(i, i) | |
def read(self, i): | |
return self._db.get(i) | |
def get_range(self, low, high): | |
for key, value in self._db.iterator(start=low, stop=high): | |
pass | |
class LSMTest(Test): | |
filename = '/tmp/lsm.db' | |
def get_db(self): | |
return LSM( | |
self.filename, | |
enable_multiple_processes=False, | |
safety_level=0, | |
) | |
def get_range(self, low, high): | |
for k, v in self._db[low:high]: | |
pass | |
tests = [ | |
BDBBTreeTest, | |
KyotoBTreeTest, | |
LevelDBTest, | |
LSMTest, | |
] | |
N = 100000 | |
print 'Testing with N =', N | |
print '------------------------------------' | |
for TestClass in tests: | |
test_name = TestClass.__name__.replace('Test', '') | |
print test_name | |
print '~' * len(test_name) | |
test = TestClass(N) | |
print 'Writes: ', test.test_writes() | |
print 'Reads: ', test.test_reads() | |
print 'Range (10%): ', test.test_range(.1) | |
print 'Range (20%): ', test.test_range(.2) | |
print 'Range (40%): ', test.test_range(.4) | |
print 'Range (80%): ', test.test_range(.8) | |
test.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment