Python 内存泄漏解决方法

时间:2021-03-07 21:24:14

标签: python memory memory-leaks multiprocessing

我刚刚在需要广泛使用的包中遇到内存泄漏。由于包的复杂性,我不确定这个内存泄漏是否可以在任何合理的时间内得到修复,这就是我寻找解决方法的原因。场景如下:考虑一个泛型函数

def foo(mutable):
   run_memory_leak(mutable)

其中 run_memory_leak 表示在被调用时会泄漏内存的几行代码(例如,永久增加 1MB 的 RAM 使用量),它将一些元素附加到 mutable 对象。一旦这些行被调用,唯一需要的是存储在 mutable 中的结果,但所有其他可能在 run_memory_leak() 中创建的东西都不再需要了。我的设置看起来像这样

for i in range(N):
   foo(mutable)
   # Do something with mutable here...

我需要多次调用 foo 的地方,不可避免地会消耗过多的 RAM 并在一段时间后崩溃。 (mutable 的大小被认为是固定的)。一种简单的解决方法是以某种格式存储 mutable 并在一段时间后重新加载 python 文件,但这似乎不是一个非常实用的解决方案,尤其是在将 mutable 保存并加载到文件时占用太多时间。

我考虑过的另一种解决方法是使用 multiprocessing 包。例如,当我使用内置进程时:

for i in range(N):
   p = Process(target=foo, args=(mutable,))
   p.start()
   p.join()

内存泄漏消失了。但是,由于 mutable 包默认不共享内存,因此不再修改 multiprocessing 中的元素。该包有一些用于声明共享内存数组的选项,但我的 mutable 对象本身是一个非常复杂的类,不能轻易转换为这种格式。 (准确地说,它包含一个 PyTorch 模块和额外的存储空间)。有什么办法可以调用foo,依次更改mutable的内容,然后释放在此过程中使用的所有内存吗?

0 个答案:

没有答案
相关问题