[pypy-commit] pypy stmgc-c7: Don't load the whole file in memory (doesn't fit for a 600MB file produced by a 10-minutes run) and print progress.

arigo noreply at buildbot.pypy.org
Thu Jan 22 17:11:36 CET 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r75487:dc21409bb756
Date: 2015-01-22 17:11 +0100
http://bitbucket.org/pypy/pypy/changeset/dc21409bb756/

Log:	Don't load the whole file in memory (doesn't fit for a 600MB file
	produced by a 10-minutes run) and print progress.

diff --git a/pypy/stm/print_stm_log.py b/pypy/stm/print_stm_log.py
--- a/pypy/stm/print_stm_log.py
+++ b/pypy/stm/print_stm_log.py
@@ -45,13 +45,14 @@
 
 class LogEntry(object):
     def __init__(self, timestamp, threadnum, otherthreadnum,
-                 event, marker1, marker2):
+                 event, marker1, marker2, frac):
         self.timestamp = timestamp
         self.threadnum = threadnum
         self.otherthreadnum = otherthreadnum
         self.event = event
         self.marker1 = marker1
         self.marker2 = marker2
+        self.frac = frac
 
     def __str__(self):
         s = '[%.3f][%s->%s]\t%s' % (
@@ -66,11 +67,13 @@
 
 def parse_log(filename):
     f = open(filename, 'rb')
-    result = []
     try:
         header = f.read(16)
         if header != "STMGC-C7-PROF01\n":
             raise ValueError("wrong format in file %r" % (filename,))
+        f.seek(0, 2)
+        frac = 1.0 / f.tell()
+        f.seek(16, 0)
         result = []
         while True:
             packet = f.read(19)
@@ -81,12 +84,11 @@
                 raise ValueError("the file %r appears corrupted" % (filename,))
             m1 = f.read(len1)
             m2 = f.read(len2)
-            result.append(LogEntry(sec + 0.000000001 * nsec,
-                                   threadnum, otherthreadnum, event, m1, m2))
+            yield LogEntry(sec + 0.000000001 * nsec,
+                           threadnum, otherthreadnum, event, m1, m2,
+                           f.tell() * frac)
     finally:
         f.close()
-    return result
-
 
 
 class ThreadState(object):
@@ -174,13 +176,17 @@
     return r + '%'
 
 def dump(logentries):
-    start_time, stop_time = logentries[0].timestamp, logentries[-1].timestamp
-    total_time = stop_time - start_time
-    print 'Total real time:             %.3fs' % (total_time,)
-    #
     threads = {}
     conflicts = {}
+    cnt = 0
     for entry in logentries:
+        if (cnt & 0x7ffff) == 0:
+            if cnt == 0:
+                start_time = entry.timestamp
+            else:
+                print >> sys.stderr, '%.0f%%' % (entry.frac * 100.0,),
+        cnt += 1
+        #
         if entry.event == STM_TRANSACTION_START:
             t = threads.get(entry.threadnum)
             if t is None:
@@ -221,6 +227,14 @@
             if t is not None and t.in_transaction():
                 t.transaction_unpause(entry)
     #
+    if cnt == 0:
+        raise Exception("empty file")
+    print >> sys.stderr
+    print
+    stop_time = entry.timestamp
+    total_time = stop_time - start_time
+    print 'Total real time:             %.3fs' % (total_time,)
+    #
     total_cpu_time = sum([v.cpu_time for v in threads.values()])
     print 'Total CPU time in STM mode:  %.3fs (%s)' % (
         total_cpu_time, percent(total_cpu_time, total_time))


More information about the pypy-commit mailing list