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: