Sha256: 4ad38f2b0b5aa07c98905ea14b2283a2390fcc8529fff5d07641cd4beb70983c

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import sys
import argparse
from collections import defaultdict

import meshers

MB = 1/1024.0/1024.0

class Span(object):
    def __init__(self, obj):
        self.name = obj['name']
        self.size = obj['object-size']
        self.length = obj['length']
        self.bitmap = obj['bitmap']


def read_data(json_path):
    '''
    Reads a dict of size -> span list from a mesh dump file at `json_path`
    '''
    size_classes = defaultdict(list)

    with open(json_path) as f:
        for l in f.readlines():
            obj = json.loads(l)
            span = Span(obj)
            size_classes[span.size].append(span)

    return size_classes


def count_meshes(mesher, spans):
    bitmaps = [s.bitmap for s in spans]
    if len(bitmaps) % 2 == 1:
        bitmaps.append('1' * len(s.bitmap))

    return mesher(bitmaps)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--size', type=int, help='size to dump graph')
    parser.add_argument('json_file', nargs=1, help='A JSON dump from libmesh')
    args = parser.parse_args()

    if not args.json_file:
        parser.print_help()
        return 1

    size_classes = read_data(args.json_file[0])

    sizes = sorted(size_classes.keys(), reverse=True)

    total_size = 0
    for size in sizes:
        spans = size_classes[size]
        total_size += sum([s.size * s.length for s in spans])

    print('Total heap size: %.1f MiB' % (total_size * MB,))

    saved = 0
    for size in sizes:
        if size >= 4096:
            continue
        spans = size_classes[size]
        # n = count_meshes(meshers.optimalMesher, spans)
        # n = count_meshes(meshers.optimalMesher, spans)
        n = count_meshes(meshers.greedyMesher, spans)
        print('\t%5d: %d spans (%d meshes)' % (size, len(spans), len(n)))
        saved += (size * spans[0].length) * len(n)

    print('Saved size: %.1f MiB' % (saved * MB,))

    return 0


if __name__ == '__main__':
    sys.exit(main())

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mesh-rb-0.0.1 ext/mesh/mesh/theory/read_mesh_dump.py