【问题标题】:How to create and delete class instance in python for loop如何在python for循环中创建和删除类实例
【发布时间】:2020-03-31 19:46:51
【问题描述】:

我正在使用一个类来创建一个张量流模型。在 for 循环中,我创建了一个实例,我必须在每次迭代结束时删除它以释放内存。删除不起作用,我的内存不足。这是我尝试过的一个最小示例:

import numpy as np

class tfModel(self, x):
   def __init__(self, x):
      ....

   def predict(self, x):
      ...
      return x_new


if __name__=="__main__":

   x = np.ones(100)
   for i in range(0, 3):
      model = tfModel(x)
      x = model.predict(x)
      del model

我在相关问题中读到“del”只删除一个引用,而不是类实例本身。但是如何确保所有引用都被删除并且实例可以被垃圾回收呢?

【问题讨论】:

  • Python 没有提供任何直接管理内存的方法,它是一种垃圾收集语言。 del 删除 names 而不是对象。在这种情况下,由于您在循环的每次迭代中重新分配 modeldel model 完全没有意义
  • 我也尝试使用垃圾收集器(import gc)并在“del model”之后手动输入“gc.collect”,但仍然没有成功。

标签: python class tensorflow memory-leaks


【解决方案1】:

我认为你在谈论两件事:

  1. 模型本身。我假设您的模型可以适合您的记忆。否则,您将无法运行任何预测。
  2. 数据。如果数据是问题,你应该用python创建一个数据generator,这样内存中就不会同时存在所有数据。您应该生成每个示例 (x) 或每批示例并将它们输入模型以进行预测。如果您的内存无法保存所有结果,则可以在必要时将结果序列化到磁盘。

更具体地说,是这样的:


class tfModel(self):
   def __init__(self):
      ....

   def predict(self, x):
      ...
      return x_new

def my_x_generator():
  for x in range(100):
    yield x


THRESHOLD = 16

if __name__=="__main__":

   model = tfModel()
   my_result_buffer = []
   for x in my_x_generator():
      x_pred = model.predict(x)
      my_result_buffer.append(x_pred)
      if len(my_result_buffer) > THRESHOLD:
        ## serialize my_result_buffer to disk
        my_result_buffer = []

还要注意,在我上面的示例代码中:

  1. tfModel 的构造函数不应依赖于x。 (x 已从 __init__ 中删除)。当然,您可以使用模型参数来初始化模型。
  2. 您应该在数据循环之外实例化您的模型。例如,模型只需要实例化一次;相同的模型将用于对所有示例进行预测。

【讨论】:

  • 感谢您的回答。不幸的是,我确实需要在 for 循环中创建模型实例,因为预测用于构建新模型。
  • 因此,我必须在 for 循环中创建和删除模型。对于第一次迭代,该模型完全符合我的记忆。但是,我的模型占用的内存随着每次迭代而增加。我认为“模型”在迭代步骤开始时不会存在,但它确实......
【解决方案2】:

这似乎是一个特定的张量流问题。使用模块 multiprocessing,可以在 for 循环中生成进程。进程完成后关闭并释放内存。

我在这里找到了这个解决方案: Clearing Tensorflow GPU memory after model execution

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2016-09-06
    • 2021-11-27
    • 2022-10-20
    相关资源
    最近更新 更多