Я создаю COM-клиент в потоке и выполняю несколько операций с этим клиентом. Каждый поток генерируется с сервера, который использует модуль Python socketserver
, который имеет встроенную поддержку потоковой передачи.Утечка памяти в потоковом COM-объекте с Python
Когда я загружаю и используя этот объект COM, ожидается ожидаемый всплеск использования памяти python.exe. При использовании 10 параллельных потоков максимальный объем памяти составляет около 500 МБ. Однако, когда операции завершены, и COM-объект, по-видимому, выпущен, есть 50Mb дополнительной памяти, используемой процессом, чем раньше. Если я затем создаю 10 дополнительных потоков, использующих один и тот же сервер, добавляется еще 13 Мб, используемое python.exe после закрытия COM-объектов. В конечном итоге каждые 10 дополнительных одновременных потоков добавляют примерно 6 МБ после их завершения. Когда я заканчиваю весь процесс python.exe, вся память освобождается.
Я упростил следующий код, чтобы имитировать, как socketserver использует threadding
, и проблема такая же.
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()
Я понимаю, что вряд ли получить какой-либо поддержки здесь вокруг конкретного COM-библиотеки (это продукт IBM, используемый в исследованиях рынка известный как TablesObjectModel). Однако я хочу знать, есть ли что-нибудь, НИЧЕГО, дополнительное, что я могу сделать, чтобы освободить эту память. Я читал о квартирах в COM, но это звучит как pythoncom.CoInitialize должен позаботиться об этом для меня. Любая помощь будет оценена по достоинству.
Это может быть не совсем уместно, но попробуйте использовать пул потоков вместо нерест новый поток без определения каких-либо ограничений, как, например, вы вывешенный. – woozyking
Является ли TOM.Document в процессе или вне процесса? Вы уверены, что память не выпущена после «некоторого времени»? Это может произойти, например, с COM-объектами, написанными в технологиях с сборщиком мусора (например, .NET, хотя я сомневаюсь, что TOM.Document написан на .NET) –
TOM.Document находится в процессе. Это не вызывает другой процесс за пределами python.exe. –