相关疑难解决方法(0)

在绘制循环时,Matplotlib内存不足

我有一个相当简单的绘图程序,看起来像这样:

from __future__ import division
import datetime
import matplotlib
matplotlib.use('Agg')
from matplotlib.pyplot import figure, plot, show, legend, close, savefig, rcParams
import numpy
from globalconstants import *

    def plotColumns(columnNumbers, t, out, showFig=False, filenamePrefix=None, saveFig=True, saveThumb=True):
        lineProps = ['b', 'r', 'g', 'c', 'm', 'y', 'k', 'b--', 'r--', 'g--', 'c--', 'm--', 'y--', 'k--', 'g--', 'b.-', 'r.-', 'g.-', 'c.-', 'm.-', 'y.-', 'k.-']

        rcParams['figure.figsize'] = (13,11)
        for i in columnNumbers:
            plot(t, out[:,i], lineProps[i])

        legendStrings = list(numpy.zeros(NUMCOMPONENTS)) 
        legendStrings[GLUCOSE] = 'GLUCOSE'
        legendStrings[CELLULOSE] = 'CELLULOSE'
        legendStrings[STARCH] = 'STARCH' …
Run Code Online (Sandbox Code Playgroud)

python numpy matplotlib

25
推荐指数
3
解决办法
4万
查看次数

Python matplotlib:指定图形大小时未释放内存

我正在使用matplotlib生成许多数值模拟结果图.这些图用作视频中的帧,因此我通过反复调用类似于此的函数来生成许多图:

from pylab import *

def plot_density(filename,i,t,psi_Na):  
    figure(figsize=(8,6))
    imshow(abs(psi_Na)**2,origin = 'lower')
    savefig(filename + '_%04d.png'%i)
    clf()
Run Code Online (Sandbox Code Playgroud)

问题是每次调用此函数时,python进程的内存使用量会增加几兆字节.例如,如果我用这个循环调用它:

if __name__ == "__main__":
    x = linspace(-6e-6,6e-6,128,endpoint=False)
    y = linspace(-6e-6,6e-6,128,endpoint=False)
    X,Y = meshgrid(x,y)
    k = 1000000
    omega = 200
    times = linspace(0,100e-3,100,endpoint=False)
    for i,t in enumerate(times):
        psi_Na = sin(k*X-omega*t)
        plot_density('wavefunction',i,t,psi_Na)
        print i
Run Code Online (Sandbox Code Playgroud)

然后ram的使用量随着时间的推移而增长到600MB.但是,如果我figure(figsize=(8,6))在函数定义中注释掉行,则ram使用率保持稳定在52MB.(8,6)是默认的图形大小,因此在两种情况下都会生成相同的图像.我想从我的数值数据中制作不同大小的图,而不会耗尽ram.我怎么能强迫python释放这个记忆?

我已经尝试了gc.collect()每个循环强制垃圾收集,我试图f = gcf()获取当前数字然后del f删除它,但无济于事.

我在64位Ubuntu 10.04上运行CPython 2.6.5.

python memory-management matplotlib

25
推荐指数
2
解决办法
1万
查看次数

创建一个引用计数的数字

似乎在matplotlib中创建一个图形的标准方法并不像我在python中所期望的那样:默认情况下fig = matplotlib.figure(),在循环中调用将保留所有创建的数字,并最终耗尽内存.

相当 ,其处理的解决方法职位,但需要显式调用matplotlib.pyplot.close(fig)似乎有点hackish.我想要的是一个简单的方法来fig计算引用,所以我不必担心内存泄漏.有办法做到这一点吗?

python memory-management matplotlib

24
推荐指数
2
解决办法
7398
查看次数

如何完全清除所有Matplotlib图的记忆

我有数据分析模块,其中包含多次调用Matplotlib pyplot API的函数,每次运行时最多可生成30个数字.这些数字在生成后会立即写入磁盘,因此我需要从内存中清除它们.目前,在我的每个功能结束时,我都这样做

import matplotlib.pyplot as plt

plt.clf()
Run Code Online (Sandbox Code Playgroud)

但是我不太确定这个陈述是否能真正清除记忆.我特别担心,因为我看到每次运行模块进行调试时,我的可用内存空间不断减少.任何人都可以告诉我,在我将这些图写入磁盘后,每次我需要做些什么才能真正清除我的记忆?

谢谢.

python memory matplotlib

19
推荐指数
4
解决办法
1万
查看次数

Matplotlib错误导致内存泄漏.我怎样才能释放那段记忆?

我正在运行包含matplotlib的django应用程序,并允许用户指定图形的轴.这可能导致'溢出错误:超出Agg复杂度'

当发生这种情况时,高达100MB的RAM被捆绑起来.通常我使用fig.gcf(),, plot.close()和释放内存gc.collect(),但与错误相关的内存似乎与绘图对象无关.

有谁知道我怎么能释放那个记忆?

谢谢.

这是一些代码,它给出了Agg Complexity Error.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np      
import gc

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.savefig('yourdesktop/random.png')   # code gives me an error here

fig.clf()    # normally I use these lines to release the memory
plt.close()
del a, b
gc.collect()
Run Code Online (Sandbox Code Playgroud)

python memory-leaks matplotlib

11
推荐指数
2
解决办法
6745
查看次数

在savefig和close()之后,Matplotlib不释放内存

我有一段代码,代码可以正常循环一次或两次,但最终会构建内存.我试图找到内存泄漏,memory_profiler这是结果:

row_nr    Memory_usage    Memory_diff    row_text
 470     52.699 MiB     0.000 MiB      ax.axis('off')
 471     167.504 MiB    114.805 MiB    fig.savefig('figname.png', dpi=600)
 472     167.504 MiB    0.000 MiB      fig.clf()
 473     109.711 MiB    -57.793 MiB    plt.close()
 474     109.711 MiB    0.000 MiB      gc.collect()`
Run Code Online (Sandbox Code Playgroud)

我创建了这样的图: fig, ax = plt.subplots()

任何建议109 - 52 = 57 MiB去了吗?

我正在使用python 3.3.

python memory-leaks matplotlib

8
推荐指数
3
解决办法
2380
查看次数

在PyQt GUI中嵌入和更新matplotlib图时内存泄漏

我试图嵌入一个matplotlib图,每秒更新一次PyQt GUI主窗口.

在我的程序中,我threading.Timer通过timer下面显示的函数每秒调用一次更新函数.我有一个问题:我的程序每秒都会变大 - 每4秒钟大约1k.我最初的想法是append函数(返回一个新数组update_figure)不会删除旧数组?这可能是我问题的原因吗?

def update_figure(self):
    self.yAxis = np.append(self.yAxis, (getCO22()))
    self.xAxis = np.append(self.xAxis, self.i)
    # print(self.xAxis)
    if len(self.yAxis) > 10:
        self.yAxis = np.delete(self.yAxis, 0)

    if len(self.xAxis) > 10:
        self.xAxis = np.delete(self.xAxis, 0)

    self.axes.plot(self.xAxis, self.yAxis, scaley=False)
    self.axes.grid(True)

    self.i = self.i + 1

    self.draw()
Run Code Online (Sandbox Code Playgroud)

这是我的计时器功能 - 这是通过点击我的PyQt GUI中的按钮触发,然后调用自己,如您所见:

def timer(self):
    getCH4()
    getCO2()
    getConnectedDevices()
    self.dc.update_figure()
    t = threading.Timer(1.0, self.timer)
    t.start()
Run Code Online (Sandbox Code Playgroud)

编辑:我无法发布我的整个代码,因为它需要很多.dll包含.所以我将尝试解释这个程序的功能.

在我的GUI中,我想显示我的CO 2值随着时间的推移.我的get_co22函数只返回一个浮点值,我100%肯定这个工作正常.使用我的计时器,如上所示,我想继续为matplotlib图添加一个值 - 该Axes对象可供我使用self.axes.我尝试绘制数据的最后10个值.

编辑2:在聊天中进行了一些 …

python matplotlib python-3.x

5
推荐指数
1
解决办法
930
查看次数

Python plt:关闭或清晰的数字不起作用

我用我不显示但存储到硬盘驱动器的脚本生成了大量图形。过了一会儿,我收到了消息

/usr/lib/pymodules/python2.7/matplotlib/pyplot.py:412: RuntimeWarning: 打开了20多个图。通过 pyplot 接口 ( matplotlib.pyplot.figure)创建的图会保留直到明确关闭,并且可能会消耗太多内存。(要控制此警告,请参阅 rcParam figure.max_num_figures)。max_open_warning、运行时警告)

因此,我尝试在存储后关闭或清除数字。到目前为止,我尝试了以下所有方法,但没有一个有效。我仍然收到来自上面的消息。

plt.figure().clf()
plt.figure().clear()
plt.clf()
plt.close()
plt.close('all')
plt.close(plt.figure())
Run Code Online (Sandbox Code Playgroud)

此外,我试图通过以下方式限制开放数字的数量

plt.rcParams.update({'figure.max_num_figures':1})
Run Code Online (Sandbox Code Playgroud)

下面是一段与上述行为类似的示例代码。我在我尝试过的地方添加了我尝试过的不同选项作为评论。

from pandas import DataFrame
from numpy import random
df = DataFrame(random.randint(0,10,40))

import matplotlib.pyplot as plt
plt.ioff()
#plt.rcParams.update({'figure.max_num_figures':1})
for i in range(0,30):
    fig, ax = plt.subplots()
    ax.hist([df])
    plt.savefig("/home/userXYZ/Development/pic_test.png")
    #plt.figure().clf()
    #plt.figure().clear()
    #plt.clf()
    #plt.close() # results in an error
    #plt.close('all') # also error
    #plt.close(plt.figure()) # also error
Run Code Online (Sandbox Code Playgroud)

完整地说,这是我在使用时遇到的错误plt.close

无法调用“event”命令:在执行从“ttk::ThemeChanged”中调用的“event generate $w <>”(过程“ttk::ThemeChanged”第6行)时,应用程序已被破坏

python matplotlib python-2.7

5
推荐指数
1
解决办法
8322
查看次数