[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