2017-06-01 34 views
0

所以我只绘制了大量的绘图,大约5000,而且我的内存已满。我搜索了该网站和网络,发现了多个解决方案,例如plt.close,plt.clf()gc.collect(),但都没有帮助。我不明白为什么我的记忆会充满,即使我关闭了所有的数字。帮助将不胜感激。当在循环中创建绘图时内存已满

同样在这里的主题,但瓦特/ OA解决方案的工作对我来说: How can I release memory after creating matplotlib figures

y = range(5039*402) 
x = np.arange(0,402,1) 
for i in xrange(len(data_collection)-1): 
    plt.figure() 
    plt.plot(x,y[i*402:402*(i+1)]) 
    plt.savefig('save%i.png'%(i)) 
    plt.close() 

对不起,可能是一个简单的问题,但我新的Python

回答

0

你不提的是哪个版本您正在使用的matplotlib,但这是早期版本的一个已知问题(它应该在2.0.x中修复)。我用来“解决”内存泄漏的一种方法是在自己的进程中创建每个图。例如,您可以为每个绘图使用子流程,线程或多进程。

Python subprocess

Python threading

Python multiprocessing

我首选的方法是多处理,因为(IMO)所以可以非常容易搬东西进出每道工序的(对象必须与pickle)。

Python pickling

ETA:下面是一个愚蠢的例子,用于展示如何使用多处理来构建脚本。

import datetime as dt 
import multiprocessing as mp 

return_queue1 = mp.Queue() 
return_queue2 = mp.Queue() 

def foo(text, return_queue): 
    for _ in range(5000): 
     continue 
    return_queue.put(dt.datetime.now()) 

def bar(text, return_queue): 
    for _ in range(5000): 
     continue 
    return_queue.put(dt.datetime.now()) 

for _ in range(5): 
    log = 0 
    if __name__ == '__main__': 
     for _ in range(100): 
      p1 = mp.Process(name='p1', target=foo, args=('foo', return_queue1,)) 
      p2 = mp.Process(name='p2', target=bar, args=('bar', return_queue2,)) 
      p1.start() 
      p2.start() 

      if return_queue1.get() > return_queue2.get(): 
       log += 1 

     p1.join() 
     p2.join() 
     print(u"Times bar won: {0}".format(log)) 
+0

啊,我明白了。我正在使用版本1.5.3。 对于其他人都有同样的问题,你可以检查你的版本只是︰ import matplotlib as mpl print mpl .__ version__ – Nils

+0

我刚刚更新matplotlib到版本2.0.2,但我仍然有同样的问题:/好像我会必须使用解决方法 – Nils

+0

对不起,听不到。我已经在上面添加了一个愚蠢的例子来展示将多处理合并到脚本中的一种方式。 – DaveL17