【发布时间】:2018-12-05 04:39:54
【问题描述】:
我想循环绘制 .csv 文件。通过在 Stack 中搜索,我找到了使用 plt.figure() 的解决方案。当我运行 2 个文件时,这确实解决了我的问题。但是当我尝试这 20 个文件时,它给了我 MEMORY ERROR。它运行到第 6 个文件,然后抛出错误。
我要导入的每个 .csv 文件的大小约为 (800,000~1mil) x 10。
失败的解决方案/调试/问题来源-
我知道当您导入大文件时,您可能会导致内存错误(再次来自 Stack 的信息)。但是在这里我一遍又一遍地将文件加载到同一个变量中。因此我没想到会出现内存错误,因为我没有为每个循环使用更多内存。
这不是由于单个文件,因为我成功地批量运行了程序 - (1,5),(5,10),(10,15),(15-20)。但我希望这一次发生。
我试图定义用于绘图的函数,希望能避免这个问题。但又遇到了同样的问题。
如果我可以在每个循环完成后刷新 Python 数据库(?我的意思是浏览器中的缓存),我想我可以避免这个问题。但是我怎样才能做到这一点呢?
提前致谢。
P.S - 如果我能以某种方式加速程序,那将是一个奖励。
这是程序
import numpy as np
import matplotlib.pyplot as plt
global n,data1
n = '/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/k(0.1)_NO-DM.csv'
data1 = np.genfromtxt(n,delimiter=',',dtype=None)
for k in range(0,20):
a = '/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/k_(0.1)_%d.csv'%k
data2 = np.genfromtxt(a,delimiter=',',dtype=None)
plt.figure()
diff = data1 - data2
plt.plot(np.log10(data1[:,1]),np.absolute(diff[:,6]),label='|diff_d|')
plt.xlabel('log(a)')
plt.ylabel('|diff_d|')
plt.legend()
plt.title('q_d = %d '%data2[0,10])
plt.savefig('/media/gautam/New Volume/IIT/Cosmology/2nd year/NEW Codes/Fig/k_(0.1)_%d_diff.png'%k)
【问题讨论】:
-
两种可能。一种是:
del data2和gc.collect(),只要不再需要data2。另一个是给我们multiprocessing一次处理一个数据文件。当SubProcess完成时,它的内存被释放。 -
@JohnAnderson 我尝试了第一个选项。它使问题延长了一点。但是经过几个循环之后,我再次面临同样的问题。我认为这可能是情节数据的。当它们甚至没有分配变量时,我该如何删除它们?我对多处理一无所知。但我会调查一下。谢谢。
-
也许这会有所帮助。来自matplotlib documentation:
If you are creating many figures, make sure you explicitly call “close” on the figures you are not using, because this will enable pylab to properly clean up the memory. -
@JohnAnderson 是的,它运行得非常完美而且速度也很快。将此添加为答案。它也会帮助其他人。非常感谢。
标签: python python-3.x matplotlib memory