python-3.x - python中释放内存的简单方法
问题描述
一段时间以来,我正在尝试解决我的记忆问题。我编写了一个程序来绘制(并保存图)示波器.trc
文件。这些包含1 亿个数据点。Matplotlib
可以绘制一个文件,但只要我将绘图操作放在 a 中for loop
,它就会抛出一个MemoryError
. 我将绘图操作放入 a 的原因for loop
是我正在编写一个程序来遍历许多数据集并将每个数据集的绘图保存在一个文件夹中。
我尝试重新采样,但它没有提供一个好的解决方案。该数据集是 UHF 测量,由非常短的脉冲组成。每个脉冲可以包含1 亿个数据点中的3 个。因此,当我重新采样(减少数据量)时,会导致数据丢失。例子:
原始数据集:
重采样数据集,sampling factor = 10
:
如您所见,一些冲动被缩短了。
最大的问题是为什么 pythonplot function
在完成后没有释放内存。我的程序是这样工作的:
- 开始
for loop
- 分析数据集 1
- 执行绘图功能
- 分析数据集 2
- 执行绘图功能
[MemoryError]
使用,和Plot Function
来绘制图形。未显示,但作为文件保存到文件夹中。为什么python完成后不释放内存?pd.DataFrames()
lists
variables
figure
.png
plot 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')
解决方案
推荐阅读
- javascript - While 循环在不应该的情况下仍然触发
- java - 如何在Activity中调用带参数的方法?
- javascript - 当mongoose模型没有被req.params.id删除时,如何修复它的deleteOne()函数?
- angular - 如何在Angular 6中的(角度材料设计)中设置活动选项卡
- excel - 在没有公式的情况下隐藏excel中的特定行
- javascript - 如果不是输入,则事件目标的名称未定义
- php - 发送带有 php 链接的短信
- node.js - package-lock.json 包需求漏洞 (npm)
- javascript - 如何使用 typscript 从字体文件中获取实际字体名称
- r - 在 R 中跨多个“脏”列匹配两个数据集