【问题标题】:RAM full when creating plots in loops在循环中创建绘图时 RAM 已满
【发布时间】:2017-06-01 15:33:26
【问题描述】:

所以我只是在绘制很多图,大约 5000 个,而我的 RAM 已满。我搜索了网站和网络,找到了多种解决方案,例如plt.closeplt.clf()gc.collect(),但都没有帮助。我不明白为什么即使我关闭了所有数字,我的记忆也会充满。帮助将不胜感激。

这里的主题相同,但对我来说没有可行的解决方案: 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 新手

【问题讨论】:

标签: python python-2.7 matplotlib ram


【解决方案1】:

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

Python subprocess

Python threading

Python multiprocessing

我首选的方法是多处理,因为 (IMO) 将事物移入和移出每个进程要容易得多(对象必须是可腌制的。)

Python pickling

预计到达时间:这是一个愚蠢的示例,展示了如何使用多处理来构建脚本。

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))

【讨论】:

  • 啊,我明白了。我使用的是 1.5.3 版。对于遇到同样问题的其他人,您可以通过以下方式检查您的版本: import matplotlib as mpl print mpl.__version__
  • 我刚刚将 matplotlib 更新到 2.0.2 版,但我仍然遇到同样的问题:/ 看来我将不得不使用解决方法
  • 很抱歉,这不起作用。我在上面添加了一个愚蠢的示例来展示一种将多处理合并到脚本中的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2019-12-09
  • 2018-05-03
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多