[Yt-svn] yt-commit r374 - trunk/yt/lagos
mturk at wrangler.dreamhost.com
mturk at wrangler.dreamhost.com
Thu Jan 31 13:42:46 PST 2008
Author: mturk
Date: Thu Jan 31 13:42:34 2008
New Revision: 374
URL: http://yt.spacepope.org/changeset/374
Log:
I think this goes a long way toward fixing the memory leaks I was experiencing
(and that I reported in #63 .) Weak reference proxies are used in LOTS of
places. This has good and bad aspects -- but I think I have minimized the
number of places I use them, which should eliminate any real serious problems.
Unit tests should not work on my laptop again. :)
Modified:
trunk/yt/lagos/BaseDataTypes.py
trunk/yt/lagos/BaseGridType.py
trunk/yt/lagos/HierarchyType.py
Modified: trunk/yt/lagos/BaseDataTypes.py
==============================================================================
--- trunk/yt/lagos/BaseDataTypes.py (original)
+++ trunk/yt/lagos/BaseDataTypes.py Thu Jan 31 13:42:34 2008
@@ -67,6 +67,7 @@
self.data = {}
self.field_parameters = {}
self.__set_default_field_parameters()
+ self._cut_masks = {}
for key, val in kwargs.items():
self.set_field_parameter(key, val)
@@ -101,6 +102,8 @@
"""
Clears out all data from the EnzoData instance, freeing memory.
"""
+ for key in self.data.keys():
+ del self.data[key]
del self.data
self.data = {}
@@ -481,7 +484,6 @@
Enzo2DData.__init__(self, 4, fields, **kwargs)
self.center = center
self.set_field_parameter('center',center)
- self._cut_masks = {}
# Let's set up our plane equation
# ax + by + cz + d = 0
self._norm_vec = normal/na.sqrt(na.dot(normal,normal))
@@ -1121,7 +1123,8 @@
cen = base_region.get_field_parameter("center")
Enzo3DData.__init__(self, center=cen,
fields=None, pf=base_region.pf, **kwargs)
- self._base_region = base_region
+ self._base_region = base_region # We don't weakly reference because
+ # It is not cyclic
self._base_indices = indices
self._grids = None
self._refresh_data()
@@ -1168,7 +1171,6 @@
self._height = height
self._radius = radius
self._d = -1.0 * na.dot(self._norm_vec, self.center)
- self._cut_masks = {}
self._refresh_data()
def _get_list_of_grids(self):
@@ -1228,7 +1230,6 @@
Enzo3DData.__init__(self, center, fields, pf, **kwargs)
self.left_edge = left_edge
self.right_edge = right_edge
- self._cut_masks = {}
self._refresh_data()
def _get_list_of_grids(self):
@@ -1264,7 +1265,6 @@
Enzo3DData.__init__(self, center, fields, pf, **kwargs)
self._grids = na.array(grid_list)
self.fields = fields
- self._cut_masks = {}
self.connection_pool = True
def _get_list_of_grids(self):
@@ -1295,7 +1295,6 @@
@type fields: list of strings
"""
Enzo3DData.__init__(self, center, fields, pf, **kwargs)
- self._cut_masks = {}
self.set_field_parameter('radius',radius)
self.radius = radius
self._refresh_data()
Modified: trunk/yt/lagos/BaseGridType.py
==============================================================================
--- trunk/yt/lagos/BaseGridType.py (original)
+++ trunk/yt/lagos/BaseGridType.py Thu Jan 31 13:42:34 2008
@@ -52,7 +52,7 @@
self.fields = []
self.start_index = None
self.id = id
- if hierarchy: self.hierarchy = hierarchy
+ if hierarchy: self.hierarchy = weakref.proxy(hierarchy)
if filename: self.set_filename(filename)
self.overlap_masks = [None, None, None]
self._overlap_grids = [None, None, None]
@@ -133,7 +133,7 @@
self.Children = h.gridTree[self.id-1]
pID = h.gridReverseTree[self.id-1]
if pID != None and pID != -1:
- self.Parent = h.grids[pID - 1]
+ self.Parent = weakref.proxy(h.grids[pID - 1])
else:
self.Parent = None
Modified: trunk/yt/lagos/HierarchyType.py
==============================================================================
--- trunk/yt/lagos/HierarchyType.py (original)
+++ trunk/yt/lagos/HierarchyType.py Thu Jan 31 13:42:34 2008
@@ -57,7 +57,7 @@
self.boundary_filename = os.path.abspath(pf.parameter_filename) \
+ ".boundary"
self.directory = os.path.dirname(self.hierarchy_filename)
- self.parameter_file = pf
+ self.parameter_file = weakref.proxy(pf)
self.__data_file = None
# Now we search backwards from the end of the file to find out how many
# grids we have, which allows us to preallocate memory
@@ -97,7 +97,6 @@
self.grids = na.array([self.grid(i+1) for i in xrange(self.num_grids)])
mylog.debug("Done creating grid objects")
-# self._grids = self.grids
self.gridReverseTree = [-1] * self.num_grids
self.gridTree = [ [] for i in range(self.num_grids)]
@@ -179,8 +178,8 @@
'_read_field_names' : _data_style_funcs[self.data_style][2],
'_read_data_slice' : _data_style_funcs[self.data_style][3],
'_read_exception' : _data_style_funcs[self.data_style][4](),
- 'pf' : self.parameter_file,
- 'hierarchy': self }
+ 'pf' : self.parameter_file, # Already weak
+ 'hierarchy': weakref.proxy(self) }
self.grid = classobj("EnzoGrid",(EnzoGridBase,), dd)
self.proj = classobj("EnzoProj",(EnzoProjBase,), dd)
self.slice = classobj("EnzoSlice",(EnzoSliceBase,), dd)
@@ -243,13 +242,13 @@
del self.eiTopGrid
except:
pass
+ for gridI in xrange(self.num_grids):
+ for g in self.gridTree[gridI]:
+ del g
del self.gridReverseTree
del self.gridLeftEdge, self.gridRightEdge
del self.gridLevels, self.gridStartIndices, self.gridEndIndices
del self.gridTimes, self.__hierarchy_string, self.__hierarchy_lines
- for gridI in xrange(self.num_grids):
- for g in self.gridTree[gridI]:
- del g
del self.gridTree
def __deserialize_hierarchy(self, harray):
@@ -365,14 +364,14 @@
continue
firstGrid = int(m.group(1))-1
if m.group(2) == "Next":
- self.gridTree[firstGrid].append(self.grids[secondGrid])
+ self.gridTree[firstGrid].append(weakref.proxy(self.grids[secondGrid]))
self.gridReverseTree[secondGrid] = firstGrid + 1
self.grids[secondGrid].Level = self.grids[firstGrid].Level + 1
self.gridLevels[secondGrid] = self.gridLevels[firstGrid] + 1
elif m.group(2) == "This":
parent = self.gridReverseTree[firstGrid]
if parent and parent > -1:
- self.gridTree[parent-1].append(self.grids[secondGrid])
+ self.gridTree[parent-1].append(weakref.proxy(self.grids[secondGrid]))
self.gridReverseTree[secondGrid] = parent
self.grids[secondGrid].Level = self.grids[firstGrid].Level
self.gridLevels[secondGrid] = self.gridLevels[firstGrid]
@@ -403,7 +402,8 @@
mylog.debug("Grabbing serialized tree data")
pTree = cPickle.loads(treeArray.read())
self.gridReverseTree = list(self.get_data("/","ReverseTree"))
- self.gridTree = [ [ self.grids[i] for i in pTree[j] ] for j in range(self.num_grids) ]
+ self.gridTree = [ [ weakref.proxy(self.grids[i]) for i in pTree[j] ]
+ for j in range(self.num_grids) ]
self.gridLevels = self.get_data("/","Levels")[:]
mylog.debug("Grabbed")
for i,v in enumerate(self.gridReverseTree):
More information about the yt-svn
mailing list