#!/usr/bin/python2 """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 cros_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