summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2016-06-12 17:24:44 +0300
committerLars Wirzenius <liw@liw.fi>2016-06-12 17:24:44 +0300
commit199c6665c1e3d9fbd29a5c67288c127c9cf2dc5a (patch)
tree42af65d9196c47734382e4ee7d5bacb696372b2e
parent60acef363e2c841ad387887ad6b770fcf659f63d (diff)
downloadobnam-199c6665c1e3d9fbd29a5c67288c127c9cf2dc5a.tar.gz
Add report
-rwxr-xr-xmeliae-report48
-rw-r--r--meliae-report.j240
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>