[PyQt] PyQt4 memory leak

David Aguilar davvid at gmail.com
Fri Aug 9 11:08:56 BST 2013


On Wed, Jul 31, 2013 at 9:46 PM, David Aguilar <davvid at gmail.com> wrote:
> On Fri, Jul 19, 2013 at 3:06 AM, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
>> On Mon, 15 Jul 2013 22:27:45 -0700, David Aguilar <davvid at gmail.com>
>> wrote:
>>> Matti Aarnio reported a memory leak in git-cola that I traced back to
>>> PyQt4.
>>>
>>> I've attached a minimal reproducer.
>>>
>>> I've tested this on Mac OS X and Debian/testing with PyQt4 4.9.x.
>>>
>>> Matti's tried it on x86_64 Fedora 18, we see the same behavior there.
>>>
>>> Everytime we hit the "Refresh" button more memory is consumed and
>>> never returned.
>>>
>>> Is there anything we can do differently to allow the widgets to get
>>> cleaned up?
>>>
>>> The add_items() call uses treewidget.takeItems() to make the old items
>>> go away, and then adds new items.  The old items do not seem to be
>>> getting cleaned up.
>>
>> It's a SIP code generation bug - fix in tonight's snapshot.
>>
>> A workaround may be to remove the items individually...
>>
>>     while root.takeChild(0) is not None:
>>         pass

BTW Qt is really slow when removing from the front of the array.

I ended up doing this instead:

    count = root.childCount()
    while count > 0:
        root.takeChild(count-1)
        count = root.childCount()

The performance profile suggests that Qt shifts subsequent items when
takeChild(0) is used, so taking from the end is fastest.

Thanks,
-- 
David


More information about the PyQt mailing list