在我的Python代码中,我使用第三方共享对象,.so
文件,我怀疑它包含内存泄漏。
在我的程序运行期间,我有一个循环,我重复调用共享对象的函数。当程序运行时,我可以在htop
中看到,内存使用量正在稳步增加。当RAM已满时,程序将与终端输出killed
崩溃。我的假设是,如果内存泄漏是由共享对象产生的,因为否则Python会引发Exception.MemoryError
。
我尝试使用reload(modul_name)
后跟gc.collect()
,但根据htop
没有释放内存。
我该怎么办?
答案 0 :(得分:1)
检查库是否提供了任何对象销毁/释放功能,以便客户端可以释放内存。
看看你是否可以确定它是否是导致明显泄漏的单个函数,然后尝试避免调用该函数。
除此之外,除非您拥有共享库的源代码或维护者的耳朵,否则您无能为力。
答案 1 :(得分:1)
作为临时修复,您可以使用装饰器在sperate过程中运行您的函数,但最终您需要修复底层漏洞。
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