问题:运行python程序的时候,在100轮以后时间从初始的3S一次,慢慢变为1分钟一次,越来越慢。
处理方法:查询资料得,这种问题的出现基本是由于程序内存泄漏。所以需要监测内存占用情况。
监测内存需要: memory_profiler 与 psutil
1. pip install memory_profiler pip install psutil
2. 在需要监测的程序前放入装饰器, 更多用法见memory_profiler的文档: https://pypi.org/project/memory-profiler/
例:
from memory_profiler import profile
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
3. 运行 python -m memory_profiler test.py
就会出现如下结果:
Line # Mem usage Increment Line Contents
================================================
10 189.7 MiB 189.7 MiB @profile
11 def readdata(data_path, user_id):
12 279.7 MiB 90.0 MiB power = pd.read_csv(data_path)
13 190.9 MiB 0.0 MiB power = power.loc[(power.user_id == user_id), :]
14 191.0 MiB 0.1 MiB data = power.drop(["user_id"], axis=1)
15 191.0 MiB 0.0 MiB return data
本文最终发现的问题是在, 217 303.5 MiB 33.4 MiB sess.run(tf.global_variables_initializer())
因为直接把神经网络的创建和sess.run 放在for循环里,所以每次循环都重新sess.run,创建计算图,导致内存占用越来越大,最终程序崩溃。
因此最后将神经网络建立与训练部分单独 def 了一下,然后再调用一次,这样只建立了一个计算图,内存只占用一次,训练时间一下快了很多