首页 > 解决方案 > python中释放内存的简单方法

问题描述

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

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

原始数据集:

在此处输入图像描述

重采样数据集,sampling factor = 10

在此处输入图像描述

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

最大的问题是为什么 pythonplot function在完成后没有释放内存。我的程序是这样工作的:

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

使用,和Plot Function来绘制图形。未显示,但作为文件保存到文件夹中。为什么python完成后不释放内存?pd.DataFrames()listsvariablesfigure.pngplot function

我一直在尝试手动释放内存,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')

标签: python-3.xmatplotlibplotgarbage-collection

解决方案


推荐阅读