[PyQt] Hunting down memory leaks
Hans Meine
meine at informatik.uni-hamburg.de
Tue Dec 14 17:02:12 GMT 2010
Am Dienstag 14 Dezember 2010, 17:05:42 schrieb Darryl Wallace:
> One of the things I've found in this regard has to do with Python and
> garbage collection. If the reference count to certain objects does not go
> to zero then the item will not be garbage collected.
>
> Ensure that the objects that you want cleaned up have no references to
> them. I've found that setting widgets' parents to None and then setting
> that variable to None often does the trick.
>
> Anyone else have tips on garbage collection with PyQt???
I also use sip.delete(obj) or obj.deleteLater() from time to time.
Also I have a large number of helper functions based on the gc module, e.g.
the ones below. These are very useful, use like this:
h1 = gcHistogram()
... # some long-running calculations which seem to leak memory
h2 = gcHistogram()
diffHists(h1, h2)
This will output the *types* of objects that have been created in the
meantime, along with their counts. Sometimes, this will not help much though,
e.g. if you use standard python lists a lot. (It might make sense to use
specialized classes derived from list anyway, no?)
def gcHistogram():
"""Returns per-class counts of existing objects."""
result = {}
for o in gc.get_objects():
t = type(o)
count = result.get(t, 0)
result[t] = count + 1
return result
def diffHists(h1, h2):
"""Prints differences between two results of gcHistogram()."""
for k in h1:
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])
HTH,
Hans
More information about the PyQt
mailing list