在python中释放内存的一种简单方法

时间:2019-04-24 07:39:51

标签: python-3.x matplotlib plot garbage-collection

一段时间以来,我正在尝试解决内存问题。我编写了一个程序来绘制(并保存无花果)示波器.trc文件。这些包含 1亿个数据点。 Matplotlib可以绘制一个文件,但是一旦我将绘制操作放在for loop中,它就会抛出MemoryError。之所以将绘图操作放入for loop中,是因为我正在编写一个程序来遍历许多数据集并将每个绘图保存在一个文件夹中。

我尝试过重采样,但是它不能提供很好的解决方案。该数据集是UHF测量,由非常短的脉冲组成。每个冲动可以包含 1亿个中的 3个数据点。因此,当我重新采样(减少数据量)时,会导致数据丢失。示例:

原始数据集:

enter image description here

重新采样的数据集,sampling factor = 10

enter image description here

如您所见,一些脉冲被缩短了。

最大的问题是,为什么plot function完成后python为什么不释放内存。我的程序是这样的:

  1. 开始for loop
  2. 分析数据集1
  3. 执行绘图功能
  4. 分析数据集2
  5. 执行绘图功能[MemoryError]

Plot Function使用pd.DataFrames()listsvariables绘制图形。 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')

0 个答案:

没有答案