Rev 5374: (jameinel) Use a custom object for build details to save a decent amount of in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Sat Aug 7 22:48:38 BST 2010
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5374 [merge]
revision-id: pqm at pqm.ubuntu.com-20100807214836-umokeeg6d1dytzvm
parent: pqm at pqm.ubuntu.com-20100807203122-emne66ssgwyu26o6
parent: john at arbash-meinel.com-20100806181422-puv63wplscz2mc0w
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Sat 2010-08-07 22:48:36 +0100
message:
(jameinel) Use a custom object for build details to save a decent amount of
memory (John A Meinel)
modified:
bzrlib/groupcompress.py groupcompress.py-20080705181503-ccbxd6xuy1bdnrpu-8
bzrlib/tests/test_groupcompress.py test_groupcompress.p-20080705181503-ccbxd6xuy1bdnrpu-13
=== modified file 'bzrlib/groupcompress.py'
--- a/bzrlib/groupcompress.py 2010-05-20 02:57:52 +0000
+++ b/bzrlib/groupcompress.py 2010-08-06 18:14:22 +0000
@@ -1809,6 +1809,54 @@
return result
+class _GCBuildDetails(object):
+ """A blob of data about the build details.
+
+ This stores the minimal data, which then allows compatibility with the old
+ api, without taking as much memory.
+ """
+
+ __slots__ = ('_index', '_group_start', '_group_end', '_basis_end',
+ '_delta_end', '_parents')
+
+ method = 'group'
+ compression_parent = None
+
+ def __init__(self, parents, position_info):
+ self._parents = parents
+ (self._index, self._group_start, self._group_end, self._basis_end,
+ self._delta_end) = position_info
+
+ def __repr__(self):
+ return '%s(%s, %s)' % (self.__class__.__name__,
+ self.index_memo, self._parents)
+
+ @property
+ def index_memo(self):
+ return (self._index, self._group_start, self._group_end,
+ self._basis_end, self._delta_end)
+
+ @property
+ def record_details(self):
+ return static_tuple.StaticTuple(self.method, None)
+
+ def __getitem__(self, offset):
+ """Compatibility thunk to act like a tuple."""
+ if offset == 0:
+ return self.index_memo
+ elif offset == 1:
+ return self.compression_parent # Always None
+ elif offset == 2:
+ return self._parents
+ elif offset == 3:
+ return self.record_details
+ else:
+ raise IndexError('offset out of range')
+
+ def __len__(self):
+ return 4
+
+
class _GCGraphIndex(object):
"""Mapper from GroupCompressVersionedFiles needs into GraphIndex storage."""
@@ -2009,9 +2057,8 @@
parents = None
else:
parents = entry[3][0]
- method = 'group'
- result[key] = (self._node_to_position(entry),
- None, parents, (method, None))
+ details = _GCBuildDetails(parents, self._node_to_position(entry))
+ result[key] = details
return result
def keys(self):
@@ -2033,7 +2080,7 @@
# each, or about 7MB. Note that it might be even more when you consider
# how PyInt is allocated in separate slabs. And you can't return a slab
# to the OS if even 1 int on it is in use. Note though that Python uses
- # a LIFO when re-using PyInt slots, which probably causes more
+ # a LIFO when re-using PyInt slots, which might cause more
# fragmentation.
start = int(bits[0])
start = self._int_cache.setdefault(start, start)
=== modified file 'bzrlib/tests/test_groupcompress.py'
--- a/bzrlib/tests/test_groupcompress.py 2010-02-17 17:11:16 +0000
+++ b/bzrlib/tests/test_groupcompress.py 2010-08-05 16:27:35 +0000
@@ -1066,3 +1066,25 @@
# consumption
self.add_key_to_manager(('key4',), locations, block, manager)
self.assertTrue(manager.check_is_well_utilized())
+
+
+class Test_GCBuildDetails(tests.TestCase):
+
+ def test_acts_like_tuple(self):
+ # _GCBuildDetails inlines some of the data that used to be spread out
+ # across a bunch of tuples
+ bd = groupcompress._GCBuildDetails((('parent1',), ('parent2',)),
+ ('INDEX', 10, 20, 0, 5))
+ self.assertEqual(4, len(bd))
+ self.assertEqual(('INDEX', 10, 20, 0, 5), bd[0])
+ self.assertEqual(None, bd[1]) # Compression Parent is always None
+ self.assertEqual((('parent1',), ('parent2',)), bd[2])
+ self.assertEqual(('group', None), bd[3]) # Record details
+
+ def test__repr__(self):
+ bd = groupcompress._GCBuildDetails((('parent1',), ('parent2',)),
+ ('INDEX', 10, 20, 0, 5))
+ self.assertEqual("_GCBuildDetails(('INDEX', 10, 20, 0, 5),"
+ " (('parent1',), ('parent2',)))",
+ repr(bd))
+
More information about the bazaar-commits
mailing list