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