在循环中创建绘图时 RAM 已满
RAM full when creating plots in loops
所以我只是绘制了很多图,大约 5000 个,我的 RAM 运行 已满。我搜索了网站和网络并找到了多种解决方案,例如 plt.close
、plt.clf()
和 gc.collect()
,但均无济于事。我不明白为什么即使我关闭所有数字我的记忆也会满满的。帮助将不胜感激。
这里的主题相同,但 w/o 对我来说是一个可行的解决方案:
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
的新手
你没有提到你使用的是哪个版本的 matplotlib,但这是早期版本的一个已知问题(应该在 2.0.x 中修复)。我用来 "get around" 内存泄漏的一种方法是在其自己的进程中创建每个图。例如,您可以为每个绘图使用子进程、线程或多进程。
我的首选方法是多处理,因为 (IMO) 将事物移入和移出每个进程要容易得多(对象必须是可腌制的。)
预计到达时间:这是一个愚蠢的例子,展示了如何使用多处理构建脚本。
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))
所以我只是绘制了很多图,大约 5000 个,我的 RAM 运行 已满。我搜索了网站和网络并找到了多种解决方案,例如 plt.close
、plt.clf()
和 gc.collect()
,但均无济于事。我不明白为什么即使我关闭所有数字我的记忆也会满满的。帮助将不胜感激。
这里的主题相同,但 w/o 对我来说是一个可行的解决方案: 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
的新手你没有提到你使用的是哪个版本的 matplotlib,但这是早期版本的一个已知问题(应该在 2.0.x 中修复)。我用来 "get around" 内存泄漏的一种方法是在其自己的进程中创建每个图。例如,您可以为每个绘图使用子进程、线程或多进程。
我的首选方法是多处理,因为 (IMO) 将事物移入和移出每个进程要容易得多(对象必须是可腌制的。)
预计到达时间:这是一个愚蠢的例子,展示了如何使用多处理构建脚本。
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))