Thanks for your response Michael, after some other tests I can see some objects released:
<class 'sqlalchemy.util.OrderedDict'>: 239 -> 199 (-40) <type 'instancemethod'>: 630 -> 531 (-99) <class 'sqlalchemy.sql.expression.ColumnCollection'>: 147 -> 107 (-40) <class 'sqlalchemy.sql.util.ClauseAdapter'>: 98 -> 28 (-70) <class 'sqlalchemy.orm.util._ORMJoin'>: 84 -> 24 (-60) <type 'weakref'>: 3851 -> 3825 (-26) <class 'sqlalchemy.util.IdentitySet'>: 14 -> 4 (-10) <class 'sqlalchemy.sql.util.ColumnAdapter'>: 7 -> 2 (-5) <class 'sqlalchemy.orm.strategies.EagerLazyOption'>: 42 -> 12 (-30) <class 'sqlalchemy.sql.util.AnnotatedAlias'>: 14 -> 4 (-10) <class 'sqlalchemy.sql.compiler._CompileLabel'>: 234 -> 96 (-138) <class 'sqlalchemy.util.OrderedSet'>: 799 -> 464 (-335) <class 'sqlalchemy.sql.expression._BinaryExpression'>: 175 -> 115 (-60) <type 'set'>: 2390 -> 1370 (-1020) <class 'sqlalchemy.sql.expression._generated_label'>: 542 -> 277 (-265) <class 'sqlalchemy.dialects.sqlite.base.SQLiteCompiler'>: 11 -> 8 (-3) <class 'sqlalchemy.engine.base.Connection'>: 6 -> 3 (-3) <class 'sqlalchemy.engine.base.RootTransaction'>: 6 -> 3 (-3) <class 'sqlalchemy.util.UniqueAppender'>: 14 -> 4 (-10) <class 'sqlalchemy.orm.collections.InstrumentedList'>: 14 -> 4 (-10) <type 'function'>: 11147 -> 11142 (-5) <class 'sqlalchemy.orm.query.QueryContext'>: 7 -> 2 (-5) <class 'sqlalchemy.orm.collections.CollectionAdapter'>: 14 -> 4 (-10) <class 'sqlalchemy.sql.expression.Alias'>: 49 -> 14 (-35) <class 'sqlalchemy.sql.expression.ClauseList'>: 45 -> 25 (-20) <class 'sqlalchemy.orm.query.Query'>: 7 -> 2 (-5) <class 'sqlalchemy.orm.attributes.QueryableAttribute'>: 14 -> 4 (-10) <class 'sqlalchemy.schema.Column'>: 619 -> 299 (-320) <type 'list'>: 4208 -> 3304 (-904) <class 'sqlalchemy.orm.state.InstanceState'>: 24 -> 7 (-17) <class 'sqlalchemy.orm.query._MapperEntity'>: 7 -> 2 (-5) <type 'tuple'>: 7058 -> 6291 (-767) <class 'sqlalchemy.sql.expression.ColumnSet'>: 86 -> 46 (-40) <class 'sqlalchemy.sql.expression.Select'>: 15 -> 5 (-10) <type 'dict'>: 10985 -> 9474 (-1511) <class 'sqlalchemy.orm.properties.Comparator'>: 78 -> 68 (-10) <class 'sqlalchemy.orm.util.ORMAdapter'>: 42 -> 12 (-30) <class 'explorsrv.models.samodels.ConfigurazioneQuickCall'>: 10 -> 3 (-7) <type 'cell'>: 336 -> 331 (-5) <class 'explorsrv.models.samodels.ConfigurazioneDocking'>: 7 -> 2 (-5) <class 'sqlalchemy.orm.util.AliasedClass'>: 42 -> 12 (-30) <class 'sqlalchemy.schema.ForeignKey'>: 87 -> 37 (-50) <class 'sqlalchemy.util.PopulateDict'>: 60 -> 22 (-38) for example explorsrv.models.samodels.ConfigurazioneQuickCall is a related object and after some database activity 7 references were collected, as you can see from the gc graph above. after each database task I call a method such this: @staticmethod def tryCommitAndClose(session,ritorno=None): try: session.commit() except: session.rollback() session.close() return ritorno else: session.close() return True and this should release the session resources, so in summary my sqlalchemy usage should be safe and even if the memory isn't immediatly released it should not leak, I understand you correctly? On 18 Dic, 15:02, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Dec 18, 2010, at 5:32 AM, drakkan wrote: > > > > > Hi, > > > inspecting the gc I see a sqlalchemy memory leak in my application, > > here is the output from the gc: > > > <class 'sqlalchemy.engine.base.Connection'>: 2 -> 3 (+1) > > <class 'sqlalchemy.engine.base.RootTransaction'>: 2 -> 3 (+1) > > <class 'sqlalchemy.util.LRUCache'>: 1 -> 2 (+1) > > <class 'sqlalchemy.util.PopulateDict'>: 2 -> 3 (+1) > > <type 'tuple'>: 5987 -> 5990 (+3) > > <class 'sqlalchemy.sql.expression._BindParamClause'>: 73 -> 80 (+7) > > <type 'dict'>: 8943 -> 8954 (+11) > > <class 'sqlalchemy.sql.expression.Insert'>: 1 -> 2 (+1) > > <class 'sqlalchemy.util.OrderedDict'>: 180 -> 181 (+1) > > <type 'instancemethod'>: 490 -> 487 (-3) > > <class 'sqlalchemy.dialects.sqlite.base.SQLiteCompiler'>: 2 -> 3 (+1) > > <type 'collections.defaultdict'>: 34 -> 35 (+1) > > <type 'weakref'>: 3830 -> 3831 (+1) > > <type 'list'>: 2953 -> 2963 (+10) > > > every time I make some database object a reference is added to > > sqlalchemy objects and never released. I'm sure the problem is my > > application and not sa, however I would like to know how to force > > sqlalchemy to delete objects references. > > > I'm using these function to query gc: > > > def gcHistogram(self): > > import gc > > result = {} > > for o in gc.get_objects(): > > t = type(o) > > count = result.get(t, 0) > > result[t] = count + 1 > > print len(result) > > return result > > > def diffHists(self,h1, h2): > > for k in h1: > > if k in h2: > > if h1[k] != h2[k]: > > print "%s: %d -> %d (%s%d)" % ( > > k, h1[k], h2[k], h2[k] > > > h1[k] and "+" or "", h2[k] - h1[k]) > > SQLA doesn't maintain strong references to anything at the module level. > The objects you have above appear to be related to the "compiled cache" used > by an individual mapper. This is an LRU-enabled dictionary that holds onto > Insert constructs and their compiled form up to approximately 100 elements. > The dictionary is associated with a mapper, which in turn is associated with > your mapped class. If you dereference your mapped class (and all instances > of that class), the mapper and the LRU cache will be gone. You can also > say mapper._compiled_cache.clear() which will probably remove the > Insert/SQLiteCompiler objects above. > > As for Sessions, if you close(), commit(), rollback(), or expire_all() the > session object, all user objects inside are weakly referenced by the session > (though related objects will have strong references to each other). > > > > > thanks > > Nicola > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to sqlalch...@googlegroups.com. > > To unsubscribe from this group, send email to > > sqlalchemy+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.