I'm doing some memory debugging today, and I've found that just reading the indexes and holding all of the keys in memory can be a rather significant amount of memory.
Specifically:
python -c "
from bzrlib import trace, branch
trace.enable_default_logging()
b = branch.Branch.open('launchpad-2a/devel')
b.lock_read()
maps = []
for vf_name in ['revisions', 'signatures', 'inventories', 'chk_bytes', 'texts']:
vf = getattr(b.repository, vf_name)
maps.append(vf.get_parent_map(vf.keys()))
trace.debug_memory('after %s' % (vf_name,))
b.unlock()
trace.debug_memory('after unlock')
del maps
trace.debug_memory('after del')
list() # Make sure to trigger real garbage collection after big dicts are deleted
import gc
print gc.collect()
trace.debug_memory('after gc')
del b
trace.debug_memory('after del b')
print gc.collect()
trace.debug_memory('after gc')
"
after revisions
VmPeak: 54408 kB
VmSize: 46268 kB
VmRSS: 43332 kB
after signatures
VmPeak: 64664 kB
VmSize: 58500 kB
VmRSS: 55676 kB
after inventories
VmPeak: 90772 kB
VmSize: 82888 kB
VmRSS: 79892 kB
after chk_bytes
VmPeak: 280732 kB
VmSize: 224852 kB
VmRSS: 222164 kB
after texts
VmPeak: 306600 kB
VmSize: 269712 kB
VmRSS: 266688 kB
after unlock
VmPeak: 306600 kB
VmSize: 269712 kB
VmRSS: 266688 kB
after del
VmPeak: 306600 kB
VmSize: 237436 kB
VmRSS: 234412 kB
0
after gc
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
after del b
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
22
after gc
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
So... why isn't any of that memory getting reclaimed, even after deleting the branch and running gc.collect()
andrew, did you end up confirming this?
I'm doing some memory debugging today, and I've found that just reading the indexes and holding all of the keys in memory can be a rather significant amount of memory.
Specifically:
python -c " default_ logging( ) Branch. open('launchpad -2a/devel' ) b.repository, vf_name) append( vf.get_ parent_ map(vf. keys()) ) debug_memory( 'after %s' % (vf_name,)) memory( 'after unlock') memory( 'after del') memory( 'after gc') memory( 'after del b') memory( 'after gc')
from bzrlib import trace, branch
trace.enable_
b = branch.
b.lock_read()
maps = []
for vf_name in ['revisions', 'signatures', 'inventories', 'chk_bytes', 'texts']:
vf = getattr(
maps.
trace.
b.unlock()
trace.debug_
del maps
trace.debug_
list() # Make sure to trigger real garbage collection after big dicts are deleted
import gc
print gc.collect()
trace.debug_
del b
trace.debug_
print gc.collect()
trace.debug_
"
after revisions
VmPeak: 54408 kB
VmSize: 46268 kB
VmRSS: 43332 kB
after signatures
VmPeak: 64664 kB
VmSize: 58500 kB
VmRSS: 55676 kB
after inventories
VmPeak: 90772 kB
VmSize: 82888 kB
VmRSS: 79892 kB
after chk_bytes
VmPeak: 280732 kB
VmSize: 224852 kB
VmRSS: 222164 kB
after texts
VmPeak: 306600 kB
VmSize: 269712 kB
VmRSS: 266688 kB
after unlock
VmPeak: 306600 kB
VmSize: 269712 kB
VmRSS: 266688 kB
after del
VmPeak: 306600 kB
VmSize: 237436 kB
VmRSS: 234412 kB
0
after gc
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
after del b
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
22
after gc
VmPeak: 306600 kB
VmSize: 237440 kB
VmRSS: 234416 kB
So... why isn't any of that memory getting reclaimed, even after deleting the branch and running gc.collect()