changeset 200:8450c18f2a45

annotate: memory efficiency -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 annotate: memory efficiency Keep track of how many times a given ancestor is referenced and delete the annotation information after it's no longer relevant. This tends to reduce the number of cached revisions to just a couple. manifest hash: 281e48b67ce310e355bed1615e0f16a643850f56 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCnJjyywK+sNU5EO8RAkZ1AKCugPjkRgwVB+71amZf8H5dLCbNvgCfePIB 4FHI1c9IOEzHUNkYPDGqt+0= =OnFo -----END PGP SIGNATURE-----
author mpm@selenic.com
date Tue, 31 May 2005 09:03:46 -0800
parents 2424676edd8c
children f918a6fa2572
files mercurial/hg.py
diffstat 1 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hg.py	Tue May 31 08:56:05 2005 -0800
+++ b/mercurial/hg.py	Tue May 31 09:03:46 2005 -0800
@@ -41,6 +41,7 @@
                     new += child[s:t]
             return new
 
+        # find all ancestors
         needed = {}
         visit = [node]
         while visit:
@@ -49,7 +50,11 @@
                 if p not in needed:
                     needed[p] = 1
                     visit.append(p)
+                else:
+                    # count how many times we'll use this
+                    needed[p] += 1
 
+        # sort by revision which is a topological order
         visit = needed.keys()
         visit = [ (self.rev(n), n) for n in visit ]
         visit.sort()
@@ -61,6 +66,10 @@
             for p in self.parents(n):
                 if p != nullid:
                     curr = pair(hist[p], curr)
+                    # trim the history of unneeded revs
+                    needed[p] -= 1
+                    if not needed[p]:
+                        del hist[p]
             hist[n] = curr
 
         return hist[n]