#! /usr/bin/env python import os, sys import stat def dump(f, prefix, dir): dir = dir.split('/') dir.reverse() dir = '\\'.join(dir) print >> f, '%sfn=%s' % (prefix, dir or '.') #dirname = os.path.dirname(dir) #print >> f, '%sfl=%s' % (prefix, dirname.replace('/', '\\') or '.') #basename = os.path.basename(dir) #print >> f, '%sfn=%s' % (prefix, basename or '\\') def normalize(total): return total / 2048 # blocks => MBs def recurse(f, dir, dir_st): pdir = dir[:80] + ' ' * (80-len(dir)) sys.stderr.write(pdir + '\b'*len(pdir)) total = 1 try: names = os.listdir(dir) except OSError, e: names = [] subcollects = [] for name in names: if dir == '.': path = name else: path = os.path.join(dir, name) try: st = os.lstat(path) except OSError: pass else: if stat.S_ISREG(st.st_mode): total += st.st_blocks elif stat.S_ISDIR(st.st_mode): if st.st_dev == dir_st.st_dev: # one file system only subcollects.append((path, st)) subsizes = [] for path, st in subcollects: subsizes.append(recurse(f, path, st)) print >> f dump(f, '', dir) print >> f, 1, normalize(total) for (path, st), subtotal in zip(subcollects, subsizes): dump(f, 'c', path) print >> f, 'calls=1 1' print >> f, 1, normalize(subtotal) total += subtotal return total if __name__ == '__main__': if len(sys.argv) == 1: root = '.' else: root = sys.argv[1] tmpfn = '/dev/shm/dukcachegrind.%d' % os.getpid() f = open(tmpfn, 'w') print >> f, "events: MB" recurse(f, root, os.stat(root)) f.close() print >> sys.stderr, ' ' * 80 os.system('kcachegrind %s' % tmpfn) os.unlink(tmpfn)