1#! /usr/bin/python 2"""Groups memory by allocation sizes. 3 4Takes a log entry and sorts sorts everything into groups based on what size 5chunks the memory has been allocated in. groups is an array that contains the 6divisions (in bytes). 7 8The output format is: 9 10timestamp, percent of memory in chunks < groups[0], percent between groups[0] 11and groups[1], etc. 12 13""" 14 15import argparse 16from cros_utils import compute_total_diff 17from datetime import datetime 18 19pretty_print = True 20 21parser = argparse.ArgumentParser() 22parser.add_argument('filename') 23args = parser.parse_args() 24 25my_file = open(args.filename) 26output_file = open('groups.csv', 'a') 27 28# The cutoffs for each group in the output (in bytes) 29groups = [1024, 8192, 65536, 524288, 4194304] 30 31base_time = datetime(2014, 6, 11, 0, 0) 32prev_line = '' 33half_entry = (None, None) 34 35for line in my_file: 36 if 'heap profile:' in line: 37 if half_entry[0] is not None: 38 group_totals = half_entry[1] 39 total = sum(group_totals) * 1.0 40 to_join = [half_entry[0]] + [value / total for value in group_totals] 41 to_output = ','.join([str(elem) for elem in to_join]) 42 output_file.write(to_output) 43 total_diff = compute_total_diff(line, base_time) 44 half_entry = (total_diff, [0] * (len(groups) + 1)) 45 if '] @ ' in line and 'heap profile:' not in line: 46 mem_samples = line.strip().split('[')[0] 47 num_samples, total_mem = map(int, mem_samples.strip().split(':')) 48 mem_per_sample = total_mem // num_samples 49 group_totals = half_entry[1] 50 for cutoff_index in range(len(groups)): 51 if mem_per_sample <= groups[cutoff_index]: 52 group_totals[cutoff_index] += total_mem 53 break 54 if mem_per_sample > groups[-1]: 55 group_totals[-1] += total_mem 56