#! /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 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