13918bb924
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
39 lines
1.5 KiB
Python
39 lines
1.5 KiB
Python
"""Drive benches/scale_bisect one configuration per process; parse its lines.
|
|
usage: scale_bisect.py BIN k=.. n=.. [cats=..] [prune=..] [mode=..] [ops=..] [--timeout S]
|
|
"""
|
|
import subprocess, sys, re, json
|
|
|
|
def run(binary, cfg, timeout=90):
|
|
args = [binary] + [f"{k}={v}" for k, v in cfg.items()]
|
|
try:
|
|
p = subprocess.run(args, capture_output=True, text=True, timeout=timeout)
|
|
out, status = p.stdout, "ok"
|
|
except subprocess.TimeoutExpired as e:
|
|
out, status = (e.stdout or b"").decode() if isinstance(e.stdout, bytes) else (e.stdout or ""), "timeout"
|
|
res = {"status": status}
|
|
for line in out.splitlines():
|
|
if line.startswith("REFUSED"):
|
|
res["status"] = "refused"
|
|
m = re.match(r"(\w+) min=([\d.]+) med=([\d.]+) max=([\d.]+)", line)
|
|
if m:
|
|
res[m[1]] = (float(m[2]), float(m[3]), float(m[4]))
|
|
for kv in re.findall(r"(\w+)=([\d.]+)", line):
|
|
if kv[0] in ("rows", "cols", "maxrss_mb", "improv_mb", "snapshot_kb", "rss_after_open_mb", "cells"):
|
|
res[kv[0]] = float(kv[1])
|
|
m = re.match(r"json_encode_setcell_updates ms=(.*)", line)
|
|
if m:
|
|
res["json_setcell"] = m[1]
|
|
return res
|
|
|
|
if __name__ == "__main__":
|
|
binary = sys.argv[1]
|
|
cfg, timeout = {}, 90
|
|
rest = sys.argv[2:]
|
|
for a in rest:
|
|
if a.startswith("--timeout"):
|
|
timeout = int(a.split("=")[1])
|
|
else:
|
|
k, v = a.split("=", 1)
|
|
cfg[k] = v
|
|
print(json.dumps(run(binary, cfg, timeout)))
|