Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中创建绘图时RAM已满_Python_Python 2.7_Matplotlib_Ram - Fatal编程技术网

Python 在循环中创建绘图时RAM已满

Python 在循环中创建绘图时RAM已满,python,python-2.7,matplotlib,ram,Python,Python 2.7,Matplotlib,Ram,所以我只是画了很多图,大约5000个,我的内存已经满了。我搜索了网站和web,找到了多种解决方案,如plt.close、plt.clf()和gc.collect(),但都没有帮助。我不明白为什么我的记忆犹新,即使我关闭了所有的数字。非常感谢您的帮助 这里的主题相同,但没有为我提供有效的解决方案: 很抱歉,这可能是一个简单的问题,但我对python还不熟悉。您没有提到您正在使用哪个版本的matplotlib,但这是早期版本的一个已知问题(应该在2.0.x中修复)。我用来“绕过”内存泄漏的一种方法

所以我只是画了很多图,大约5000个,我的内存已经满了。我搜索了网站和web,找到了多种解决方案,如
plt.close
plt.clf()
gc.collect()
,但都没有帮助。我不明白为什么我的记忆犹新,即使我关闭了所有的数字。非常感谢您的帮助

这里的主题相同,但没有为我提供有效的解决方案:


很抱歉,这可能是一个简单的问题,但我对python还不熟悉。您没有提到您正在使用哪个版本的matplotlib,但这是早期版本的一个已知问题(应该在2.0.x中修复)。我用来“绕过”内存泄漏的一种方法是在自己的进程中创建每个绘图。例如,可以对每个绘图使用子进程、线程或多进程

我首选的方法是多处理,因为(IMO)在每个进程中移入移出东西要容易得多(对象必须是可pickle的)

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

啊,我明白了。我使用的是1.5.3版。对于其他有相同问题的人,您可以通过以下方法检查您的版本:导入matplotlib作为mpl打印mpl。\uuuu版本\uuu我刚刚将matplotlib更新为2.0.2版,但我仍然有相同的问题:/似乎我将不得不使用解决方法。很遗憾,这不起作用。我在上面添加了一个愚蠢的例子,展示了在脚本中合并多处理的一种方法。这能回答你的问题吗?
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))