# HG changeset patch # User Matt Mackall # Date 1192081607 18000 # Node ID 64cf1c85367437d7c3a9009550d0461d041afb40 # Parent a0952e4e52eb4a7616ea4faeab5b1d957c0d1987 revlog: reduce memory usage in addgroup - use a buffer to extract the delta from a chunk - avoid concatenating to a compressed delta - use a buffer to directly extra full text from a trivial delta - delete chunk and delta objects after use diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1140,7 +1140,8 @@ class revlog(object): # raise RevlogError(_("already have %s") % hex(node[:4])) chain = node continue - delta = chunk[80:] + delta = buffer(chunk, 80) + del chunk for p in (p1, p2): if not p in self.nodemap: @@ -1159,17 +1160,22 @@ class revlog(object): # current size. if chain == prev: - tempd = compress(delta) - cdelta = tempd[0] + tempd[1] + cdelta = compress(delta) + cdeltalen = len(cdelta[0]) + len(cdelta[1]) textlen = mdiff.patchedsize(textlen, delta) - if chain != prev or (end - start + len(cdelta)) > textlen * 2: + if chain != prev or (end - start + cdeltalen) > textlen * 2: # flush our writes here so we can read it in revision if dfh: dfh.flush() ifh.flush() text = self.revision(chain) - text = mdiff.patches(text, [delta]) + if len(text) == 0: + # skip over trivial delta header + text = buffer(delta, 12) + else: + text = mdiff.patches(text, [delta]) + del delta chk = self._addrevision(text, transaction, link, p1, p2, None, ifh, dfh) if not dfh and not self._inline: @@ -1181,20 +1187,22 @@ class revlog(object): raise RevlogError(_("consistency error adding group")) textlen = len(text) else: - e = (offset_type(end, 0), len(cdelta), textlen, base, + e = (offset_type(end, 0), cdeltalen, textlen, base, link, self.rev(p1), self.rev(p2), node) self.index.insert(-1, e) self.nodemap[node] = r entry = self._io.packentry(e, self.node, self.version, r) if self._inline: ifh.write(entry) - ifh.write(cdelta) + ifh.write(cdelta[0]) + ifh.write(cdelta[1]) self.checkinlinesize(transaction, ifh) if not self._inline: dfh = self.opener(self.datafile, "a") ifh = self.opener(self.indexfile, "a") else: - dfh.write(cdelta) + dfh.write(cdelta[0]) + dfh.write(cdelta[1]) ifh.write(entry) t, r, chain, prev = r, r + 1, node, node