Excellent - thanks :-) Warwick
On 27/06/2011, at 2:37 AM, Michael Bayer wrote: > > On Jun 26, 2011, at 4:31 AM, Warwick Prince wrote: > >> Hi Michael >> >> I'm having an issue with memory usage that I would appreciate some insight.. >> >> I have a fairly straight forward process, that works perfectly as far as it >> delivering the desired updates in the DB etc, however, it accumulates memory >> usage (just like a leak) and I can not find a way to release it. >> >> I have a multi threaded process. Each thread creates a scopedsession from >> the standard global Session = scoped_session(sessionmaker()) construct. >> Each thread does some work using mapped objects to update some and add some >> rows into the (MySQL on Windows) DB. All this works perfectly and as >> expected. Due to various reasons, I flush/commit after each row is >> updated/inserted. After the "batch" of updates is complete, I come back >> and session.remove() (In an attempt to dump the session) and then wait for a >> while and do the entire thing again. At the start of each run, I create a >> new session=Session() and do the updates and return and session.remove(). >> >> To me, I would assume that the memory would be the session's cache of >> objects that are being managed - which I can understand. What I can't >> understand is why when I delete *everything* e.g. del engine, del meta, del >> session and even stop the thread, the memory is still consumed. I must >> stop the entire process before the memory is returned to the system. After >> around 10 hours of running, I've used 2Gb+ of memory and everything crashes. > > By "the memory is still consumed", if you're talking about the memory of your > process, that's Python's behavior - once the size of memory usage grows to X, > it stays at X no matter what you dereference within the process. So the key > is to manage how large a collection ever gets filled up in the first place. > The only true measure of "python objects being leaked" is the size of > gc.get_objects(). If that size is managed, that's as far as Python code can > go towards managing memory. > > So I'm assuming you just mean the size of the process. If you're dealing > with large numbers of rows being loaded into memory, you'd need to cut down > on the maximum size of objects loaded at once. > > The Session does not strongly reference anything, except for that which is > present in the ".new" and ".dirty" collections. If those are empty, it is > not strongly referencing anything, and as long as gc is enabled, the number > of objects in memory will be managed. Older versions of Session in 0.5, > 0.4 and such were not as good at this, but in 0.6, 0.7 it's quite solid, > there is a whole suite of unit tests that ensure SQLAlchemy components like > Engine, Session, schema, etc. do not leak memory under a variety of > setup/teardown situations. But it seems like you're don't yet know if > you're experiencing a problem at the Python object level. > > > >> i.e. It loops over the other database (non SQL) reading all the data that I >> WOULD use to update the SQL database using SA. When SA is not involved, >> nothing is happening with the memory. > > note that DBAPIs, particularly older versions of MySQLdb, may have memory > leaks, and most DBAPIs when asked to fetch a result will load the full set of > results into memory before fetchone() is ever called, thus causing a great > unconditional increase in the size of memory if you are fetching very large > result sets. > >> >> Any hint on how I can a) see what is being held and b) dump it! > > gc.get_objects() > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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.