Python matplotlib 批量绘图内存不够问题(Out of memory)

在使用matplotlib批量绘制图片时,内存占用会随着绘制图片数量的增加而增加,最终内存不够,提示为:Out of memory

解决办法

1.在导入matplotlib库后,且在matplotlib.pyplot库被导入前加“matplotlib.use(‘agg’)”语句。注意matplotlib.use('agg')必须在本句执行import matplotlib.pyplot as plt前运行

import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt

matplotlib.use(‘agg’):作用是matplotlib设定为非交互式,在这种模式下,前端不会展示绘图结果

2.在每次绘图结束时,手动清除图片。如下代码所示:

plt.clf () #清除当前图形及其所有轴,但保持窗口打开,以便可以将其重新用于其他绘图。
plt.close () #完全关闭图形窗口

示例:

'''绘制5000张散点图'''
import numpy as np
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt

for i in range(0,5000):
    #1. 数据生成
    x = np.random.normal(0, 1, 10)
    y = np.random.normal(0, 1, 10)
	#2.画布设置:
    plt.figure(figsize=(10, 10), dpi=80)
    axes=plt.subplot2grid((1,1), (0,0), facecolor='w')
    #3.绘制散点图
    plt.scatter(x,y, c='red', s=500)
    #4.保存图片
    plt.savefig('C:/Users/test/Desktop/'+str(i)+'.jpg')
    plt.clf()
    plt.close()

输出图例: 

内存占用始终保持在600MB多同一水平,没有增加

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供这方面的帮助。 首先,我们需要生成一个包含500个节点的多项式。可以使用numpy库的random模块来生成随机多项式。 ```python import numpy as np coeff = np.random.rand(500) # 生成500个随机系数 poly = np.poly1d(coeff) # 生成多项式 ``` 接下来,我们需要计算多项式的运行时间和所占内存。可以使用Python标准库中的time和memory_profiler模块来实现。 ```python import time from memory_profiler import memory_usage start_time = time.time() # 记录开始时间 mem_usage = memory_usage((poly)) end_time = time.time() # 记录结束时间 run_time = end_time - start_time # 计算运行时间 mem_usage = max(mem_usage) # 取最大内存占用 print("运行时间:{:.6f} 秒".format(run_time)) print("内存占用:{:.2f} MB".format(mem_usage)) ``` 然后,我们需要将节点分区并再次计算得出结果。可以使用numpy库的split函数来实现。 ```python part1, part2 = np.split(poly, [250]) # 将多项式分成两个部分 result1 = part1(1) # 计算第一部分的结果 result2 = part2(1) # 计算第二部分的结果 final_result = result1 + result2 # 计算最终结果 ``` 最后,我们可以使用matplotlib库来绘制多项式图像。 ```python import matplotlib.pyplot as plt x = np.linspace(-10, 10, 1000) # 生成x轴数据 y = poly(x) # 计算y轴数据 plt.plot(x, y) plt.title("500个节点的多项式") plt.xlabel("x") plt.ylabel("y") plt.show() ``` 完整代码如下: ```python import numpy as np import time from memory_profiler import memory_usage import matplotlib.pyplot as plt coeff = np.random.rand(500) # 生成500个随机系数 poly = np.poly1d(coeff) # 生成多项式 start_time = time.time() # 记录开始时间 mem_usage = memory_usage((poly)) end_time = time.time() # 记录结束时间 run_time = end_time - start_time # 计算运行时间 mem_usage = max(mem_usage) # 取最大内存占用 print("运行时间:{:.6f} 秒".format(run_time)) print("内存占用:{:.2f} MB".format(mem_usage)) part1, part2 = np.split(poly, [250]) # 将多项式分成两个部分 result1 = part1(1) # 计算第一部分的结果 result2 = part2(1) # 计算第二部分的结果 final_result = result1 + result2 # 计算最终结果 x = np.linspace(-10, 10, 1000) # 生成x轴数据 y = poly(x) # 计算y轴数据 plt.plot(x, y) plt.title("500个节点的多项式") plt.xlabel("x") plt.ylabel("y") plt.show() ``` 希望能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值