簡體   English   中英

如何在python for循環中創建和刪除類實例

[英]How to create and delete class instance in python for loop

我正在使用一個類來創建一個張量流模型。 在 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”只刪除一個引用,而不是類實例本身。 但是如何確保所有引用都被刪除並且實例可以被垃圾收集?

我認為你在談論兩件事:

  1. 模型本身。 我假設您的模型適合您的記憶。 否則,您將無法運行任何預測。
  2. 數據。 如果數據是問題,你應該用python做一個數據生成器,這樣不是所有的數據都同時存在於內存中。 您應該生成每個示例 ( 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的構造tfModel不應依賴於x x__init__刪除)。 當然,您可以使用模型參數來初始化模型。
  2. 您應該在數據循環之外實例化您的模型。 例如,模型只需要實例化一次; 將使用相同的模型對所有示例進行預測。

這似乎是一個特定的張量流問題。 使用模塊 multiprocessing,可以在 for 循環中生成進程。 完成后關閉進程並釋放內存。

我在這里找到了這個解決方案: Clearing Tensorflow GPU memory after model execution

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM