在部署了我编写的软件之后,我发现供应商的库在一致且可预测的基础上泄漏内存,根据某个函数的调用次数,这是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中的内存泄漏问题?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)