我使用pyodbc编写了一个Python脚本,将数据从Excel工作表传输到ms访问,并使用matplotlib使用Excel工作表中的一些数据创建绘图并将其保存到文件夹中。当我运行脚本时,它完成了我预期的操作;但是,我正在使用任务管理器对其进行监控,最终使用超过1500 MB的RAM!
我甚至不明白这是怎么回事。它创建了560个图像,但这些图像的总大小仅为17 MB。 excel表是8.5 MB。我明白,如果没有看到我的所有代码,你可能无法告诉我究竟是什么问题(我不知道究竟是什么问题所以我只需要发布整个事情而我认为这不合理要求你阅读我的整个代码),但一些一般指导就足够了。
感谢。
更新
我就像@HYRY建议的那样做了并将我的代码拆分了。我首先使用matplotlib函数运行脚本,然后在没有它们的情况下运行脚本。正如那些已经评论过的人所怀疑的那样,内存耗尽来自matplotlib函数。现在我们已经缩小了它,我将发布一些代码。请注意,下面的代码在两个for循环中执行。内部for循环将始终执行四次,而外部for循环执行,但是需要多次。
#Plot waveform and then relative harmonic orders on a bar graph.
#Remember that table is the sheet name which is named after the ExperimentID
cursorEx.execute('select ['+phase+' Time] from ['+table+']')
Time = cursorEx.fetchall()
cursorEx.execute('select ['+phase+' Waveform] from ['+table+']')
Current = np.asanyarray(cursorEx.fetchall())
experiment = table[ :-1]
plt.figure()
#A scale needs to be added to the primary current values
if line == 'P':
ratioCurrent = Current / 62.5
plt.plot(Time, ratioCurrent)
else:
plt.plot(Time, Current)
plt.title(phaseTitle)
plt.xlabel('Time (s)')
plt.ylabel('Current (A)')
plt.savefig(os.getcwd()+'\\HarmonicsGraph\\'+line+'H'+experiment+'.png')
cursorEx.execute('select ['+phase+' Order] from ['+table+']')
cursorEx.fetchone() #the first row is zero
order = cursorEx.fetchmany(51)
cursorEx.execute('select ['+phase+' Harmonics] from ['+table+']')
cursorEx.fetchone()
percentage = np.asanyarray(cursorEx.fetchmany(51))
intOrder = np.arange(1, len(order) + 1, 1)
plt.figure()
plt.bar(intOrder, percentage, width = 0.35, color = 'g')
plt.title(orderTitle)
plt.xlabel('Harmonic Order')
plt.ylabel('Percentage')
plt.axis([1, 51, 0, 100])
plt.savefig(os.getcwd()+'\\HarmonicsGraph\\'+line+'O'+experiment+'.png')
答案 0 :(得分:2)
我认为当你在脚本中执行多个绘图时,plt.close()是一个非常难的解决方案。很多时候,如果你保留图形参考,你可以对它们进行所有的工作,然后调用:
plt.clf()
您将看到代码如何更快(每次生成画布都不一样!)。如果你没有适当的清洁来调用多个轴,那么内存泄漏是非常糟糕的!
答案 1 :(得分:1)
我的代码中没有看到清理部分,但我愿意打赌问题是你没有打电话
plt.close()
完成每个情节后。完成每个数字后添加一行,看看是否有帮助。