一段时间以来,我正在尝试解决内存问题。我编写了一个程序来绘制(并保存无花果)示波器.trc
文件。这些包含 1亿个数据点。 Matplotlib
可以绘制一个文件,但是一旦我将绘制操作放在for loop
中,它就会抛出MemoryError
。之所以将绘图操作放入for loop
中,是因为我正在编写一个程序来遍历许多数据集并将每个绘图保存在一个文件夹中。
我尝试过重采样,但是它不能提供很好的解决方案。该数据集是UHF测量,由非常短的脉冲组成。每个冲动可以包含 1亿个中的 3个数据点。因此,当我重新采样(减少数据量)时,会导致数据丢失。示例:
原始数据集:
重新采样的数据集,sampling factor = 10
:
如您所见,一些脉冲被缩短了。
最大的问题是,为什么plot function
完成后python为什么不释放内存。我的程序是这样的:
for loop
[MemoryError]
Plot Function
使用pd.DataFrames()
,lists
和variables
绘制图形。 figure
未显示,但已作为.png
文件保存到文件夹中。为什么plot function
完成后python为什么不释放内存?
我一直在尝试使用garbage collector
手动释放内存,但是无法管理。一个循环应该有足够的内存,因此在每个循环的最后是否应该释放内存?是否有使用gc
进行此操作的正确方法?
我试图将其放在plot function
的末尾,但仍然得到MemoryError
:
del dataframes, lists, variables
gc.collect()
编辑:
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import readTrc
foldername = 'trc_folder'
folder = os.listdir(foldername)
path = os.path.dirname(os.path.realpath(__file__))
for filenumber, i in enumerate(folder):
trc = path + '/' + foldername + '/' + i
print('reading trc file ' + str(filenumber))
datX, datY, d = readTrc.Trc().open(trc)
srx, sry = pd.Series(datX * 1000), pd.Series(datY * 1000)
df_oszi = pd.concat([srx, sry], axis = 1)
df_oszi.set_index(0, inplace = True)
df_oszi.plot(grid = 1,
color = 'blue',
linewidth = 0.5,
figsize = (9,5),
legend = False,
xticks = np.arange(df_oszi.index[0], df_oszi.index[-1], 1))
print('plotting file ' + str(filenumber))
plt.savefig('Plot_' + str(filenumber) + '.png', dpi = 300)
plt.close('all')