我正在运行一个python代码,用于模拟和预测快速压缩机器内的条件(如温度,压力,化学物质等)。设置代码以便计算所有这些参数(保存在numpy数组中)的时间演变,然后将它们输出到一个函数,该函数根据时间创建并保存这些参数的图。
这些数组非常大,该函数使用matplotlib创建大约14个图。当我得到一个错误读取" python.exe已经停止工作"时,该函数将到达第7个图(有时更多,有时更少)。不确定它是否是一个记忆问题,因为情节太大或者正在发生什么。
我已尝试过两种方法(正如您在我的示例代码中看到的那样)plt.figure.clf()
和plt.close()
。我甚至试过在两个地块之间做time.sleep
。以下是我的函数的示例片段,它执行绘图(不是真实的代码,只是说明我的问题所必需的示例)。
我正在使用Windows,Python 2.7和Matplotlib 1.4.2
def graph_parameters(time, a, b, c, d, e): #a,b,c,d,e are my parameters
delay = 10
plt.figure(1)
plt.figure(facecolor="white")
plt.plot(time, a)
plt.ylabel('a')
plt.xlabel('Time(s)')
plt.savefig('fig1.png')
plt.figure(1).clf()
plt.close('all')
time.sleep(delay)
plt.figure(2)
plt.figure(facecolor="white")
plt.plot(time, b)
plt.ylabel('b')
plt.xlabel('Time(s)')
plt.savefig('fig2.png')
plt.figure(2).clf()
plt.close('all')
time.sleep(delay)
等
提前致谢。
答案 0 :(得分:1)
我不完全确定,但我认为这是一个记忆问题。我找到了一种方法(来自另一个stackoverflow条目)来删除我不需要的变量。根据我上面的例子,如果我只想保持'时间_'和参数' a _',' b _',' c _',' d _'并且' e _',我在主代码的末尾运行以下内容:
graph_array = np.array([time_, a_, b_, c_, d_, e_])
#Delete variables that aren't going to be plotted in order to free up memory
attributes = sys.modules[__name__]
for name in dir():
if name[0]!='_' and np.all( name!= np.array(['graph_array', 'attributes','np', 'gc', 'graph_parameters']) ):
delattr(attributes, name)
gc.collect()
graph_parameters(*graph_array)
基本上for循环的作用是保留私有和神奇的函数名称和指定变量的名称,并删除所有其他名称。我从以下链接的答案中得到了这个想法。 How do I clear all variables in the middle of a Python script?
我在代码运行时看到了我的任务管理器,并且在开始保存图之前,Python的内存使用量(~1,600,000 K到~100,000 K)显着下降,表明此方法确实释放了内存。此外,没有崩溃。