diff --git a/selfdrive/debug/internal/qlog_size.py b/selfdrive/debug/internal/qlog_size.py new file mode 100755 index 0000000000..bcf0781516 --- /dev/null +++ b/selfdrive/debug/internal/qlog_size.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +import argparse +import bz2 +from collections import defaultdict + +import matplotlib.pyplot as plt + +from cereal.services import service_list +from tools.lib.logreader import LogReader +from tools.lib.route import Route + +MIN_SIZE = 0.5 # Percent size of total to show as separate entry + + +def make_pie(msgs, typ): + compressed_length_by_type = {k: len(bz2.compress(b"".join(v))) for k, v in msgs.items()} + + total = sum(compressed_length_by_type.values()) + + sizes = sorted(compressed_length_by_type.items(), key=lambda kv: kv[1]) + + sizes_large = [(k, sz) for (k, sz) in sizes if sz >= total * MIN_SIZE / 100] + sizes_large += [('other', sum([sz for (_, sz) in sizes if sz < total * MIN_SIZE / 100]))] + + labels, sizes = zip(*sizes_large) + + plt.figure() + plt.title(f"{typ}") + plt.pie(sizes, labels=labels, autopct='%1.1f%%') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Check qlog size based on a rlog') + parser.add_argument('route', help='route to use') + parser.add_argument('segment', type=int, help='segment number to use') + args = parser.parse_args() + + r = Route(args.route) + rlog = r.log_paths()[args.segment] + msgs = list(LogReader(rlog)) + + msgs_by_type = defaultdict(list) + for m in msgs: + msgs_by_type[m.which()].append(m.as_builder().to_bytes()) + + qlog_by_type = defaultdict(list) + for name, service in service_list.items(): + if service.decimation is None: + continue + + for i, msg in enumerate(msgs_by_type[name]): + if i % service.decimation == 0: + qlog_by_type[name].append(msg) + + make_pie(msgs_by_type, 'rlog') + make_pie(qlog_by_type, 'qlog') + plt.show()