# HG changeset patch # User mason@suse.com # Date 1144191640 14400 # Node ID 1cbb14c048cb78d7621bcd7ab677ee6e0fd096f5 # Parent ee96ca273f32f71343a6dba099d547526543b559 Reduce index memory usage by storing the bare string instead of tuples Storing the tuple returned by struct.unpack significantly increases the memory required to store the entire index in ram. This patch uses struct.unpack on demand instead. diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -135,9 +135,9 @@ class lazyparser(object): for x in xrange(lend): if self.index[i + x] == None: b = data[off : off + self.s] - e = struct.unpack(self.format, b) - self.index[i + x] = e - self.map[e[-1]] = i + x + self.index[i + x] = b + n = b[self.shaoffset:self.shaoffset + 20] + self.map[n] = i + x off += self.s def findnode(self, node): @@ -218,7 +218,10 @@ class lazyindex(object): self.p.loadindex(pos) return self.p.index[pos] def __getitem__(self, pos): - return self.p.index[pos] or self.load(pos) + ret = self.p.index[pos] or self.load(pos) + if isinstance(ret, str): + ret = struct.unpack(self.p.indexformat, ret) + return ret def __setitem__(self, pos, item): self.p.index[pos] = item def __delitem__(self, pos): @@ -242,11 +245,13 @@ class lazymap(object): def __iter__(self): yield nullid for i in xrange(self.p.l): - try: - yield self.p.index[i][-1] - except: + ret = self.p.index[i] + if not ret: self.p.loadindex(i) - yield self.p.index[i][-1] + ret = self.p.index[i] + if isinstance(ret, str): + ret = struct.unpack(self.p.indexformat, ret) + yield ret[-1] def __getitem__(self, key): try: return self.p.map[key]