【问题标题】:Workaround memory leak in shared object共享对象中的解决方法内存泄漏
【发布时间】:2015-08-11 12:34:13
【问题描述】:

在我的 Python 代码中,我使用了一个第三方共享对象 .so 文件,我怀疑它包含内存泄漏。

在我的程序运行期间,我有一个循环,我在其中重复调用共享对象的函数。当程序运行时,我可以在htop 中看到,内存使用量正在稳步增加。当 RAM 已满时,程序崩溃,终端输出 killed。我的假设是,如果内存泄漏是由共享对象产生的,否则 Python 会引发Exception.MemoryError

我尝试使用reload(modul_name) 后跟gc.collect(),但它没有根据htop 释放内存。

我该怎么办?

【问题讨论】:

    标签: python memory-leaks shared-libraries


    【解决方案1】:

    检查库是否提供了任何对象销毁/释放函数,以便客户端可以释放内存。

    看看你是否能确定它是否是导致明显泄漏的单个函数,然后尽量避免调用该函数。

    除此之外,除非您有共享库的源代码或维护者的耳朵,否则您无能为力。

    【讨论】:

    • 感谢您的专业知识。是否有另一种方法可以强制 python 删除并重新加载 so 库,或者这是不可能的,或者只是在这种情况下不工作?我会尽量掌握源代码。
    • 那么其他假设呢。你觉得他们说的对吗?
    【解决方案2】:

    作为临时修复,您可以使用装饰器在单独的进程中运行您的函数,但最终您需要修复底层泄漏。

    import multiprocessing
    def memory_leak(func):
      def conn_func(conn, *args, **kwargs):
        conn.send(func(*args, **kwargs))
        conn.close()
    
      def new_function(*args, **kwargs):
        parent_conn, child_conn = multiprocessing.Pipe()
        p = multiprocessing.Process(target=conn_func, args=[child_conn]+list(args), kwargs=kwargs)
        p.start()
        result = parent_conn.recv()
        p.join()
        return result
    
      return new_function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2013-04-01
      • 1970-01-01
      • 2017-06-20
      • 2011-08-14
      • 2010-10-15
      相关资源
      最近更新 更多