Rev 153: A bit more info while computing referrers. in http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection

John Arbash Meinel john at arbash-meinel.com
Tue Dec 29 15:45:54 GMT 2009


At http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection

------------------------------------------------------------
revno: 153
revision-id: john at arbash-meinel.com-20091229154532-4drym9jwwkpy598i
parent: john at arbash-meinel.com-20091229154023-w9v5rcer8382ihp1
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: mem-object-collection
timestamp: Tue 2009-12-29 09:45:32 -0600
message:
  A bit more info while computing referrers.
-------------- next part --------------
=== modified file 'meliae/loader.py'
--- a/meliae/loader.py	2009-12-29 04:59:10 +0000
+++ b/meliae/loader.py	2009-12-29 15:45:32 +0000
@@ -34,6 +34,11 @@
     _loader,
     )
 
+
+timer = time.time
+if sys.platform == 'win32':
+    timer = time.clock
+
 # This is the minimal regex that is guaranteed to match. In testing, it is
 # about 3x faster than using simplejson, it is just less generic.
 _object_re = re.compile(
@@ -200,21 +205,20 @@
 
     def compute_referrers(self):
         """For each object, figure out who is referencing it."""
-        addresses = self.objs.keys()
-        referrers = dict.fromkeys(addresses, None)
+        referrers = {}
+        get_refs = referrers.get
         total = len(self.objs)
+        tlast = timer()-20
         for idx, obj in enumerate(self.objs.itervalues()):
-            if self.show_progress and idx & 0x1ff == 0:
-                sys.stderr.write('compute referrers %8d / %8d        \r'
-                                 % (idx, total))
+            if self.show_progress and idx & 0x3f == 0:
+                tnow = timer()
+                if tnow - tlast > 0.1:
+                    tlast = tnow
+                    sys.stderr.write('compute referrers %8d / %8d        \r'
+                                     % (idx, total))
             address = obj.address
             for ref in obj.ref_list:
-                try:
-                    refs = referrers[ref]
-                except KeyError:
-                    # Reference to something outside this set of objects.
-                    # Doesn't matter what it is, we won't be updating it.
-                    continue
+                refs = get_refs(ref, None)
                 # This is ugly, so it should be explained.
                 # To save memory pressure, referrers will point to one of 4
                 # types.
@@ -240,10 +244,18 @@
                 elif t is list:
                     refs.append(address)
                 else:
-                    raise TypeError('unknown refs type: %s\n'
-                                    % (t,))
+                    raise TypeError('unknown refs type: %s\n' % (t,))
                 referrers[ref] = refs
-        for obj in self.objs.itervalues():
+        if self.show_progress:
+            sys.stderr.write('compute referrers %8d / %8d        \r'
+                             % (idx, total))
+        for idx, obj in enumerate(self.objs.itervalues()):
+            if self.show_progress and idx & 0x3f == 0:
+                tnow = timer()
+                if tnow - tlast > 0.1:
+                    tlast = tnow
+                    sys.stderr.write('set referrers %8d / %8d        \r'
+                                     % (idx, total))
             try:
                 refs = referrers.pop(obj.address)
             except KeyError:
@@ -256,7 +268,7 @@
                 else:
                     obj.referrers = refs
         if self.show_progress:
-            sys.stderr.write('compute referrers %8d / %8d        \n'
+            sys.stderr.write('set referrers %8d / %8d        \n'
                              % (idx, total))
 
     def remove_expensive_references(self):
@@ -504,7 +516,7 @@
     :return: A generator of MemObjects.
     """
     # TODO: cStringIO?
-    tstart = time.time()
+    tstart = timer()
     input_mb = input_size / 1024. / 1024.
     temp_cache = {}
     address_re = re.compile(
@@ -537,13 +549,13 @@
         if show_prog and (line_num - last > 5000):
             last = line_num
             mb_read = bytes_read / 1024. / 1024
-            tdelta = time.time() - tstart
+            tdelta = timer() - tstart
             sys.stderr.write(
                 'loading... line %d, %d objs, %5.1f / %5.1f MiB read in %.1fs\r'
                 % (line_num, len(objs), mb_read, input_mb, tdelta))
     if show_prog:
         mb_read = bytes_read / 1024. / 1024
-        tdelta = time.time() - tstart
+        tdelta = timer() - tstart
         sys.stderr.write(
             'loaded line %d, %d objs, %5.1f / %5.1f MiB read in %.1fs        \n'
             % (line_num, len(objs), mb_read, input_mb, tdelta))



More information about the bazaar-commits mailing list