55 lines
1.7 KiB
Python
Executable file
55 lines
1.7 KiB
Python
Executable file
#! /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
|