Skip to content
Snippets Groups Projects

Kalepso experiments

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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")
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment