如何在 python for 循环中创建和删除 class 实例
How to create and delete class instance in python for loop
我正在使用 class 创建张量流模型。在 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" 仅删除引用,而不删除 class 实例本身。但是如何确保所有引用都被删除并且实例可以被垃圾回收?
我认为你在谈论两件事:
- 模型本身。我假设您的模型可以适合您的记忆。否则你无法运行任何预测。
- 数据。如果数据有问题,你应该用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 = []
另请注意,在我上面的示例代码中:
tfModel
的构造函数不应依赖于 x
。 (x
已从 __init__
中删除)。当然,您可以使用模型参数来初始化您的模型。
- 您应该在数据循环之外实例化您的模型。例如,模型只需要实例化一次;将使用相同的模型对所有示例进行预测。
好像是tensorflow的具体问题。使用模块 multiprocessing,可以在 for 循环中生成进程。进程在完成后关闭并释放内存。
我在这里找到了这个解决方案:
我正在使用 class 创建张量流模型。在 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" 仅删除引用,而不删除 class 实例本身。但是如何确保所有引用都被删除并且实例可以被垃圾回收?
我认为你在谈论两件事:
- 模型本身。我假设您的模型可以适合您的记忆。否则你无法运行任何预测。
- 数据。如果数据有问题,你应该用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 = []
另请注意,在我上面的示例代码中:
tfModel
的构造函数不应依赖于x
。 (x
已从__init__
中删除)。当然,您可以使用模型参数来初始化您的模型。- 您应该在数据循环之外实例化您的模型。例如,模型只需要实例化一次;将使用相同的模型对所有示例进行预测。
好像是tensorflow的具体问题。使用模块 multiprocessing,可以在 for 循环中生成进程。进程在完成后关闭并释放内存。
我在这里找到了这个解决方案: