Kalepso experiments
The snippet can be accessed without any authentication.
Authored by
Dmytro Bogatov
uniform-range-queries.py 3.73 KiB
#!/usr/bin/env python3
from dotmap import DotMap
import random
import time
def parse():
import argparse
inputSizeDefault = 100
inputSizeMin = 10
inputSizeMax = 100000
def argcheckInputSize(value):
number = int(value)
if number < inputSizeMin or number > inputSizeMax:
raise argparse.ArgumentTypeError(f"Input / queries size must be {inputSizeMin} to {inputSizeMax}. Given {number}")
return number
def argcheckInputMax(value):
number = int(value)
if number <= 0:
raise argparse.ArgumentTypeError(f"Input max must be above 0. Given {number}")
return number
def argcheckRange(value):
percent = float(value)
if percent < 0.01 or percent > 0.9:
raise argparse.ArgumentTypeError(f"Range must be above a percentage 1% to 90%. Given {percent}")
return percent
parser = argparse.ArgumentParser(description="Run simple uniform range queries on Kalepso.")
parser.add_argument("--size", dest="size", metavar="input-size", type=argcheckInputSize, required=False, default=inputSizeDefault, help=f"The size of data [{inputSizeMin} - {inputSizeMax}]")
parser.add_argument("--queries", dest="queries", metavar="queries-size", type=argcheckInputSize, required=False, default=int(inputSizeDefault / 10), help=f"The number of queries [{inputSizeMin} - {inputSizeMax}]")
parser.add_argument("--max", dest="max", metavar="input-max", type=argcheckInputMax, required=False, default=inputSizeDefault, help=f"The max value of data points (min is 0) [>0]")
parser.add_argument("--range", dest="range", metavar="range-percent", type=argcheckRange, required=False, default=0.3, help=f"The range size as percent of max-min data [0.01 - 0.9]")
parser.add_argument("--seed", dest="seed", metavar="seed", type=int, default=123456, required=False, help="Seed to use for PRG")
parser.add_argument("--kalepso-port", dest="kalepsoPort", metavar="kalepso-port", type=int, default=3306, required=False, help="Kalepso port")
parser.add_argument("--mysql-port", dest="mysqlPort", metavar="mysql-port", type=int, default=3307, required=False, help="MySQL port")
args = parser.parse_args()
random.seed(args.seed)
return DotMap({"size": args.size, "max": args.max, "range": args.range, "queries": args.queries, "kalepsoPort": args.kalepsoPort, "mysqlPort": args.mysqlPort})
def generateLoads(inputs):
data = []
queries = []
for i in range(1, inputs.size):
data += [random.randint(0, inputs.max)]
querySize = int(inputs.max * inputs.range)
for i in range(1, inputs.queries):
left = random.randint(0, inputs.max - querySize)
queries += [(left, left + querySize)]
return DotMap({"data": data, "queries": queries})
def runLoads(loads, port):
import mysql.connector as mysql
db = mysql.connect(
host = "localhost",
user = "root",
port = port,
passwd = "MYPASSWD"
)
cursor = db.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS experimental")
cursor.execute("USE experimental")
cursor.execute("DROP TABLE IF EXISTS ranges")
cursor.execute("CREATE TABLE IF NOT EXISTS ranges (number INT)")
init = time.time()
insert = "INSERT INTO ranges (number) VALUES (%s)"
cursor.executemany(insert, list(map(lambda number: (number,), loads.data)))
db.commit()
inserted = time.time()
query = "SELECT number FROM ranges WHERE number BETWEEN %s AND %s"
for rangeQuery in loads.queries:
cursor.execute(query, rangeQuery)
records = cursor.fetchall()
queried = time.time()
return DotMap({"insertion": inserted - init, "queries": queried - inserted})
if __name__ == "__main__":
inputs = parse()
loads = generateLoads(inputs)
for engine in [("Kelepso", inputs.kalepsoPort), ("MySQL", inputs.mysqlPort)]:
times = runLoads(loads, engine[1])
print(f"For {engine[0]}: inserted in {int(times.insertion * 1000)} ms, queries in {int(times.queries * 1000)} ms")
Please register or sign in to comment