| #! /usr/bin/python |
| |
| """Groups memory by allocation sizes. |
| |
| Takes a log entry and sorts sorts everything into groups based on what size |
| chunks the memory has been allocated in. groups is an array that contains the |
| divisions (in bytes). |
| |
| The output format is: |
| |
| timestamp, percent of memory in chunks < groups[0], percent between groups[0] |
| and groups[1], etc. |
| |
| """ |
| |
| import argparse |
| from utils import compute_total_diff |
| from datetime import datetime |
| |
| pretty_print = True |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument("filename") |
| args = parser.parse_args() |
| |
| my_file = open(args.filename) |
| output_file = open("groups.csv", "a") |
| |
| # The cutoffs for each group in the output (in bytes) |
| groups = [1024, 8192, 65536, 524288, 4194304] |
| |
| base_time = datetime(2014, 6, 11, 0, 0) |
| prev_line = "" |
| half_entry = (None, None) |
| |
| for line in my_file: |
| if "heap profile:" in line: |
| if half_entry[0] is not None: |
| group_totals = half_entry[1] |
| total = sum(group_totals) * 1.0 |
| to_join = [half_entry[0]] + [value / total for value in group_totals] |
| to_output = ",".join([str(elem) for elem in to_join]) |
| output_file.write(to_output) |
| total_diff = compute_total_diff(line, base_time) |
| half_entry = (total_diff, [0]*(len(groups) + 1)) |
| if "] @ " in line and "heap profile:" not in line: |
| mem_samples = line.strip().split("[")[0] |
| num_samples, total_mem = map(int, mem_samples.strip().split(":")) |
| mem_per_sample = total_mem // num_samples |
| group_totals = half_entry[1] |
| for cutoff_index in range(len(groups)): |
| if mem_per_sample <= groups[cutoff_index]: |
| group_totals[cutoff_index] += total_mem |
| break |
| if mem_per_sample > groups[-1]: |
| group_totals[-1] += total_mem |