del 的神奇功效
众所周知,del
在python可以删除变量,让这个变量无法重新使用。但是,实际上空间并没有释放,只是使得变量的引用次数变为-1,若恰好在循环外,内存会无法得到释放,这时就需要gc.collect()
来帮忙:
a = range(1,1e8)
del a
import gc
gc.collect()
这样一来,大部分问题都能解决
但是!!!! 如果只是这样我也没必要写这篇文章特地记下来了
最近在用pyTorch运行网络的时候,发现没过几个epoch整个电脑就进入死机状态。
使用Ubuntu自带的系统资源监视器人肉跟踪发现,内存占用不断地上涨,虽然比较慢,但确实在上涨这种情况,难怪会死机,内存都爆掉了……
为了解决这个问题首先检查了代码问题,有没有会让内存溢出的操作(交叉引用),许久发现,并没有这个问题。
随后我发现代码有这么一段:
for data in dataloader:
...
_, feat = model(inputs)
...
_, preds = torch.max(ouput.data, 1)
...
这个_
引起了我的注意,这个变量始终没有被使用到,还被多次赋值
可能是由于pyTorch的缺陷,这个_后面所代表的Tensor被累积性的储存在内存中,并没有得到释放
于是改成这样,问题居然就解决了……
for data in dataloader:
...
_, feat = model(inputs)
...
_, preds = torch.max(ouput.data, 1)
...
del —