如何解决Python中使用的供应商DLL中的内存泄漏问题?

如何解决Python中使用的供应商DLL中的内存泄漏问题?,第1张

概述我正在使用供应商的C API为一个商业软件加载他们的库使用 Python的ctypes模块. 在部署了我编写的软件之后,我发现供应商的库在一致且可预测的基础上泄漏内存,根据某个函数的调用次数,这是API的一部分. 我甚至在不使用堆分配的C程序中复制了泄漏. 我联系了供应商关于这个问题,他们说他们正在研究它,但我可能无法在下一个版本的软件上实际期望修复. 我有想法在泄漏函数调用一定阈值后重新加载供应 我正在使用供应商的C API为一个商业软件加载他们的库使用 Python的ctypes模块.

在部署了我编写的软件之后,我发现供应商的库在一致且可预测的基础上泄漏内存,根据某个函数的调用次数,这是API的一部分.

我甚至在不使用堆分配的C程序中复制了泄漏.

我联系了供应商关于这个问题,他们说他们正在研究它,但我可能无法在下一个版本的软件上实际期望修复.

我有想法在泄漏函数调用一定阈值后重新加载供应商的DLL,但这并没有释放泄漏的内存.

我发现我可以像这样强制卸载库:

_ctypes.Freelibrary(vendor_dll._handle)

这释放了内存,但在使用供应商的API几分钟后,导致解释器似乎随机崩溃.

我在Python BUG跟踪器中发现了这个问题,描述了我的情况:
@L_404_1@

似乎如果仍然存在对库的开放引用,强制它卸载将不可避免地使Python解释器崩溃.

最糟糕的情况是,我想我可以在一个单独的进程中加载​​供应商的库,使用多处理队列代理请求,并设置一个看门狗,以便在解释器死亡时重新创建进程.

有没有更好的方法来解决这个问题?

解决方法 最后,我通过在一个单独的进程中加载​​供应商的库并通过Pyro4访问它来解决了这个问题,如下所示:

class libraryWorker(multiprocessing.Process):    def __init__(self):        super().__init__()    def run(self):        self.library = ctypes.windll.Loadlibrary(            'vendor_library.dll')        Pyro4.serveSimple(            {self,'library'},ns=False)    def lib_func(self):        res = self.library.func()        return res

按摩旧代码以避免在两个进程之间传递ctypes指针是一项额外的工作,但它的工作原理.

通过在单独的进程中加载​​库,我可以跟踪内存使用情况.当它变得太高时,我可以终止并重新创建进程来释放内存.

总结

以上是内存溢出为你收集整理的如何解决Python中使用的供应商DLL中的内存泄漏问题?全部内容,希望文章能够帮你解决如何解决Python中使用的供应商DLL中的内存泄漏问题?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1197605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存