2014-12-04 14 views
6

我必須繪製並保存從1到500的循環與不同的數據,但由於Matplot lib導致內存泄漏。 有人有任何想法如何處理?Matplotlib簡單大小寫內存泄漏與熊貓

簡單情況下這裏:

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

pdindex = pd.date_range(start='01/01/2013', freq='15min', end='01/01/2019') 
df = pd.DataFrame({'test':np.random.normal(0,1,len(pdindex))}, index=pdindex) 


def memplot_plot(df, i): 
    df.test.plot()  
    plt.title('graph' + str(i)) 
    plt.savefig(str(i) + '.png', dpi=144) 
    plt.close() 

for i in range(1, 100): 
    print '*******************************' 
    print 'i : ' + str(i)  
    print len(gc.get_objects()) 
    print sys.getsizeof(gc.get_objects()) 
    memplot_plot(df, i)  
    gc.collect() 

並且輸出是(存儲器錯誤,因爲我的= 6):

******************************* 
i : 1 
74682 
325680 
******************************* 
i : 2 
290627 
1190248 
******************************* 
i : 3 
506420 
2145012 
******************************* 
i : 4 
721993 
3054204 
******************************* 
i : 5 
937566 
3865524 
******************************* 
i : 6 
1153139 
4892352 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Anaconda\lib\site- packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile 
    execfile(filename, namespace) 
    File "C:/PERSO/script_backtesting.py", line 124, in <module> 
    memplot_plot(df, i)  
    File "C:/PERSO/script_backtesting.py", line 107, in memplot_plot 
    plt.savefig(str(i) + '.png', dpi=144) 
    File "C:\Anaconda\lib\site-packages\matplotlib\pyplot.py", line 576, in savefig 
    res = fig.savefig(*args, **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\figure.py", line 1470, in savefig 
    self.canvas.print_figure(*args, **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\backend_bases.py", line 2192, in  print_figure 
    **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 513, in print_png 
    FigureCanvasAgg.draw(self) 
    File "C:\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 461, in  draw 
    self.figure.draw(self.renderer) 
    File "C:\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\figure.py", line 1079, in draw 
    func(*args) 
    File "C:\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\axes\_base.py", line 2092, in draw 
    a.draw(renderer) 
    File "C:\Anaconda\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda\lib\site-packages\matplotlib\axis.py", line 1103, in draw 
    ticks_to_draw = self._update_ticks(renderer) 
    File "C:\Anaconda\lib\site-packages\matplotlib\axis.py", line 957, in _update_ticks 
    tick_tups = [t for t in self.iter_ticks()] 
    File "C:\Anaconda\lib\site-packages\matplotlib\axis.py", line 903, in iter_ticks 
    self.major.formatter.set_locs(majorLocs) 
    File "C:\Anaconda\lib\site-packages\pandas\tseries\converter.py", line 982, in set_locs 
    self._set_default_format(vmin, vmax) 
    File "C:\Anaconda\lib\site-packages\pandas\tseries\converter.py", line 966, in _set_default_format 
    format = np.compress(info['maj'], info) 
    File "C:\Anaconda\lib\site-packages\numpy\core\fromnumeric.py", line 1563, in compress 
    return compress(condition, axis, out) 
MemoryError 

圖的存儲器,用於從發射計算機腳本breack的和殺死控制檯。 enter image description here

+0

我能夠在Window 7 64-bit,pandas 0.15.1和matplotlib 1.4.0上重現這一點。如果您重新配置繪圖,以便設置一個圖形和座標軸並將其傳遞到繪圖('df.test.plot(ax = ax)'),而不是執行plt.close(),則只需執行軸清除了'ax.cla()',內存仍然爬起來,但速度並不快。除此之外,我不確定發生了什麼。 – Ajean 2014-12-04 17:26:16

+4

此問題似乎是無關緊要的,因爲它是一個錯誤報告。適當時,您應該用matplotlib或pandas提交錯誤。 – 2014-12-04 18:46:49

+0

此代碼適用於我的Mac,無泄漏內存......非常奇怪! – 2014-12-04 21:00:02

回答

5

這顯然是一個錯誤。如果這個問題支左右,如下修改代碼消除我的計算機上的內存泄漏:

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

pdindex = pd.date_range(start='01/01/2013', freq='15min', end='01/01/2019') 
df = pd.DataFrame({'test':np.linspace(0,1,len(pdindex))}, index=pdindex) 

fig, ax = plt.subplots() 

def memplot_plot(df, i, f, a): 
    a.plot(df.index, df.test) 
    a.set_title('graph' + str(i)) 
    f.savefig(str(i) + '.png', dpi=144) 
    a.cla() 

for i in range(1, 100): 
    print '*******************************' 
    print 'i : ' + str(i)  
    print len(gc.get_objects()) 
    print sys.getsizeof(gc.get_objects()) 
    memplot_plot(df, i, fig, ax)  
    gc.collect() 

輸出現在看起來是這樣的:

... 
******************************* 
i : 13 
83727 
732816 
******************************* 
i : 14 
83727 
732816 
******************************* 
i : 15 
83727 
732816 

...等

+0

它在我的PC上運行良好!Thx。因此,熊貓的錯誤​​,我會提交。 – 2014-12-04 21:49:32