Stab in the dark:  after calling the Clear() method on object "tom" in method 
CreateTom, use "del tom" or "tom = None" to try and lose any remnant COM 
references before pythoncom.CoUninitialize() is called.

-------------------------> "These thoughts are mine alone!" <---------
Andrew MacIntyre           Operations Branch
tel:   +61 2 6219 5356     Communications Infrastructure Division
fax:   +61 2 6253 3277     Australian Communications & Media Authority
email: andrew.macint...@acma.gov.au<mailto:andrew.macint...@acma.gov.au>        
    http://www.acma.gov.au/

From: python-win32 
[mailto:python-win32-bounces+andrew.macintyre=acma.gov...@python.org] On Behalf 
Of Michael Watson
Sent: Saturday, 4 May 2013 8:05 AM
To: python-win32@python.org
Subject: [python-win32] Memory Leak in Threaded COM Object


I am creating a COM client within a thread and performing several operations 
with this client. Each thread is spawned from a server that uses Python's 
socketserver module which has built-in threading support.

When I am loading and using this COM object there is an expected spike in 
memory usage by python.exe. With 10 concurrent threads there is a peak in 
memory usage of about 500Mb. However when the operations are finished and the 
COM object is apparently released, there are 50Mb of additional memory used by 
the process than before. If I then spawn 10 additional threads using the same 
server there are 13Mb additional used by python.exe after those COM objects are 
closed. Eventually every 10 additional concurrent threads adds approximately 
6Mb after they are done. When I end the entire python.exe process, all the 
memory is released.

I have simplified the following code to mimic how the socketserver uses 
threadding and the problem is the exact same.

import win32com.client

import threading

import pythoncom



def CreateTom():

    pythoncom.CoInitialize()

    tom = win32com.client.Dispatch("TOM.Document")

    tom.Dataset.Load("FileName")

    tom.Clear()

    pythoncom.CoUninitialize()



for i in range(50):

    t = threading.Thread(target = CreateTom)

    t.daemon = False

    t.start()

I understand that I will unlikely get any support here around the specific COM 
library (it is an IBM product used in Market Research known as the 
TablesObjectModel). However I want to know if there is anything, ANYTHING, 
additional that I can do to release this memory. I have read about Apartments 
in COM but it sounds like pythoncom.CoInitialize should take care of this for 
me. Any help would be appreciated.

NOTICE: This email message is for the sole use of the intended recipient(s) 
 and may contain confidential and privileged information. Any unauthorized 
 review, use, disclosure or distribution is prohibited. If you are not the 
 intended recipient, please contact the sender by reply email and destroy all 
 copies of the original message.
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to