Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlog.py @ 2080:1cbb14c048cb
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.
author | mason@suse.com |
---|---|
date | Tue, 04 Apr 2006 19:00:40 -0400 |
parents | ee96ca273f32 |
children | 416d8b2a75b8 |
comparison
equal
deleted
inserted
replaced
2079:ee96ca273f32 | 2080:1cbb14c048cb |
---|---|
133 i = blockstart / self.s | 133 i = blockstart / self.s |
134 off = 0 | 134 off = 0 |
135 for x in xrange(lend): | 135 for x in xrange(lend): |
136 if self.index[i + x] == None: | 136 if self.index[i + x] == None: |
137 b = data[off : off + self.s] | 137 b = data[off : off + self.s] |
138 e = struct.unpack(self.format, b) | 138 self.index[i + x] = b |
139 self.index[i + x] = e | 139 n = b[self.shaoffset:self.shaoffset + 20] |
140 self.map[e[-1]] = i + x | 140 self.map[n] = i + x |
141 off += self.s | 141 off += self.s |
142 | 142 |
143 def findnode(self, node): | 143 def findnode(self, node): |
144 """search backwards through the index file for a specific node""" | 144 """search backwards through the index file for a specific node""" |
145 if self.allmap: return None | 145 if self.allmap: return None |
216 if pos < 0: | 216 if pos < 0: |
217 pos += len(self.p.index) | 217 pos += len(self.p.index) |
218 self.p.loadindex(pos) | 218 self.p.loadindex(pos) |
219 return self.p.index[pos] | 219 return self.p.index[pos] |
220 def __getitem__(self, pos): | 220 def __getitem__(self, pos): |
221 return self.p.index[pos] or self.load(pos) | 221 ret = self.p.index[pos] or self.load(pos) |
222 if isinstance(ret, str): | |
223 ret = struct.unpack(self.p.indexformat, ret) | |
224 return ret | |
222 def __setitem__(self, pos, item): | 225 def __setitem__(self, pos, item): |
223 self.p.index[pos] = item | 226 self.p.index[pos] = item |
224 def __delitem__(self, pos): | 227 def __delitem__(self, pos): |
225 del self.p.index[pos] | 228 del self.p.index[pos] |
226 def append(self, e): | 229 def append(self, e): |
240 self.p.loadmap() | 243 self.p.loadmap() |
241 return key in self.p.map | 244 return key in self.p.map |
242 def __iter__(self): | 245 def __iter__(self): |
243 yield nullid | 246 yield nullid |
244 for i in xrange(self.p.l): | 247 for i in xrange(self.p.l): |
245 try: | 248 ret = self.p.index[i] |
246 yield self.p.index[i][-1] | 249 if not ret: |
247 except: | |
248 self.p.loadindex(i) | 250 self.p.loadindex(i) |
249 yield self.p.index[i][-1] | 251 ret = self.p.index[i] |
252 if isinstance(ret, str): | |
253 ret = struct.unpack(self.p.indexformat, ret) | |
254 yield ret[-1] | |
250 def __getitem__(self, key): | 255 def __getitem__(self, key): |
251 try: | 256 try: |
252 return self.p.map[key] | 257 return self.p.map[key] |
253 except KeyError: | 258 except KeyError: |
254 try: | 259 try: |