|
| 1 | +#!/usr/bin/env python3 |
| 2 | +import os |
| 3 | +import sys |
| 4 | +from pathlib import Path |
| 5 | +import re |
| 6 | +import datetime |
| 7 | + |
| 8 | +try: |
| 9 | + from time import clock_gettime_ns, CLOCK_MONOTONIC |
| 10 | + |
| 11 | + def time_ns(): |
| 12 | + |
| 13 | + return clock_gettime_ns(CLOCK_MONOTONIC) |
| 14 | + |
| 15 | +except Exception: |
| 16 | + from time import time_ns |
| 17 | + |
| 18 | + |
| 19 | +RE_DIGITS = re.compile(r'([0-9]+)') |
| 20 | + |
| 21 | + |
| 22 | +def run(argv, out, err): |
| 23 | + |
| 24 | + start_time = time_ns() |
| 25 | + pid = os.posix_spawn(argv[0], argv, {}, file_actions=( |
| 26 | + (os.POSIX_SPAWN_OPEN, 1, out, os.O_WRONLY | os.O_CREAT, 0o666), |
| 27 | + (os.POSIX_SPAWN_OPEN, 2, err, os.O_WRONLY | os.O_CREAT, 0o666), |
| 28 | + )) |
| 29 | + (pid, status, rusage) = os.wait4(pid, 0) |
| 30 | + elapsed = time_ns() |
| 31 | + elapsed -= start_time |
| 32 | + exitcode = os.waitstatus_to_exitcode(status) |
| 33 | + return exitcode, rusage, elapsed |
| 34 | + |
| 35 | + |
| 36 | +def main(): |
| 37 | + |
| 38 | + qdir = sys.argv[1] or 'q/scalar' |
| 39 | + bindings = sys.argv[2] or 'bindings.json' |
| 40 | + outdir = sys.argv[3] or "result-{:%Y%m%dT%H%M%S}".format(datetime.datetime.now()) |
| 41 | + argv = sys.argv[4:] |
| 42 | + assert len(argv) |
| 43 | + querydir = Path(qdir) |
| 44 | + os.makedirs(outdir + '/' + qdir, exist_ok=True) |
| 45 | + with open(outdir + '/' + qdir + "/summary.tsv", "w") as outf: |
| 46 | + print(' '.join(argv + ['-p', qdir, '--bindings-file', bindings]), file=outf) |
| 47 | + for query in sorted(querydir.glob('**/*.sql'), key=lambda x: tuple(map(lambda y: int(y) if re.match(RE_DIGITS, y) else y, re.split(RE_DIGITS, str(x))))): |
| 48 | + q = str(query) |
| 49 | + print(q, end='\t', file=outf) |
| 50 | + name = outdir + '/' + q |
| 51 | + outname = name + '-result.yson' |
| 52 | + exitcode, rusage, elapsed = run( |
| 53 | + argv + [ |
| 54 | + '--result-file', outname, |
| 55 | + '--bindings-file', bindings, |
| 56 | + '--plan-file', name + '-plan.yson', |
| 57 | + '--err-file', name + '-err.txt', |
| 58 | + '--expr-file', name + '-expr.txt', |
| 59 | + '-p', q |
| 60 | + ], |
| 61 | + name + '-stdout.txt', |
| 62 | + name + '-stderr.txt') |
| 63 | + print(rusage.ru_utime, end='\t', file=outf) |
| 64 | + print(rusage.ru_stime, end='\t', file=outf) |
| 65 | + print(rusage.ru_maxrss, end='\t', file=outf) |
| 66 | + print(exitcode, end='\t', file=outf) |
| 67 | + print(elapsed, end='\t', file=outf) |
| 68 | + print(rusage.ru_minflt, end='\t', file=outf) |
| 69 | + print(rusage.ru_majflt, end='\t', file=outf) |
| 70 | + print(rusage.ru_inblock, end='\t', file=outf) |
| 71 | + print(rusage.ru_oublock, end='\t', file=outf) |
| 72 | + print(rusage.ru_nvcsw, end='\t', file=outf) |
| 73 | + print(rusage.ru_nivcsw, end='\t', file=outf) |
| 74 | + # resource.struct_rusage(ru_utime=7.919329, ru_stime=5.22704, |
| 75 | + # ru_maxrss=639600, ru_ixrss=0, ru_idrss=0, ru_isrss=0, |
| 76 | + # ru_minflt=135127, ru_majflt=0, ru_nswap=0, ru_inblock=0, |
| 77 | + # ru_oublock=48, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, |
| 78 | + # ru_nvcsw=57452, ru_nivcsw=273 |
| 79 | + # ) |
| 80 | + print(file=outf) |
| 81 | + outf.flush() |
| 82 | + |
| 83 | + |
| 84 | +if __name__ == "__main__": |
| 85 | + main() |
0 commit comments