diff options
author | Lars Wirzenius <liw@liw.fi> | 2016-06-12 17:24:44 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2016-06-12 17:24:44 +0300 |
commit | 199c6665c1e3d9fbd29a5c67288c127c9cf2dc5a (patch) | |
tree | 42af65d9196c47734382e4ee7d5bacb696372b2e | |
parent | 60acef363e2c841ad387887ad6b770fcf659f63d (diff) | |
download | obnam-199c6665c1e3d9fbd29a5c67288c127c9cf2dc5a.tar.gz |
Add report
-rwxr-xr-x | meliae-report | 48 | ||||
-rw-r--r-- | meliae-report.j2 | 40 |
2 files changed, 88 insertions, 0 deletions
diff --git a/meliae-report b/meliae-report new file mode 100755 index 00000000..713826e2 --- /dev/null +++ b/meliae-report @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Read a data file produced by python-meliae (one JSON object per +# line), and produce a report of memory use by Python type. + + +import json +import sys + +import jinja2 + +import meliaereader + + +def log(msg): + sys.stderr.write(msg + '\n') + sys.stderr.flush() + + +def make_report(filename, mr): + vars = { + 'mr': mr, + 'filename': filename, + } + t = jinja2.Template(read_template()) + text = t.render(**vars) + if not text.endswith('\n'): + text += '\n' + return text + + +def read_template(): + filename = 'meliae-report.j2' + with open(filename) as f: + return f.read() + + +def main(): + for filename in sys.argv[1:]: + log('processing {}'.format(filename)) + mr = meliaereader.MeliaeReader() + mr.read(filename) + log('read {} objs'.format(len(mr))) + mr.compute_closures() + sys.stdout.write(make_report(filename, mr)) + + +main() diff --git a/meliae-report.j2 b/meliae-report.j2 new file mode 100644 index 00000000..c5df68a6 --- /dev/null +++ b/meliae-report.j2 @@ -0,0 +1,40 @@ +<html> + <head> + <title>Summary {{ filename }}</title> + <style> + table { + font-family: mono; + border: 0; + text-align: left; + } + th { + font-weight: bold; + border-bottom: 1px solid black; + } + </style> + </head> + <body> + <h1>Summary of {{ filename }}</h1> + + <p>Number of objects: {{ mr|length }}</p> + <p>Total size: {{ mr.get_total_size() }}</p> + + <table> + <tr> + <th>type</th> + <th>objs</th> + <th>total size</th> + <th>closure size</th> + </tr> + + {% for typename in mr.get_obnam_types()|sort %} + <tr> + <td>{{ typename }}</td> + <td>{{ mr.get_objs_of_type(typename)|length }}</td> + <td>{{ mr.get_size(mr.get_objs_of_type(typename)) }}</td> + <td>{{ mr.get_size(mr.get_closure_of_type(typename)) }}</td> + </tr> + {% endfor %} + + </body> +</html> |