爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2904|回复: 22

批量绘图哪家强?

[复制链接]

新浪微博达人勋

发表于 2023-6-25 13:34:33 | 显示全部楼层 |阅读模式
3金钱
现在有一个项目需求,需要在服务器批量读取.grib2并快速出图,图片质量还得高,发到网上都得说好。本人用过的绘图语言包括:grads,matlab,ncl,python,说说感受:
grads:毕业就放弃了,图片质量拉胯
matlab:数据处理是强项,但图片质量也不咋地,尤其是jpg格式,非常不适合网络传播
ncl:绘图质量很不错,但是太慢了,也吃内存

python:核心库就是matplotlib,其他的什么metpy,scipy的绘图模块也都是引用的这个库。和这个库抗争了一个多月,绘图质量确实好,速度也还可以接受。但是和ncl一个毛病:放到批量出图循环里,内存回收机制很差,非常容易爆内存,哪怕处处加plt.clf(),依然能看到内存一点点被占满

请问大家有没有其他的绘图程序推荐的?

最佳答案

查看完整内容

你说的MeteoInfo用户手册可能是很久之前的,比较新的资料可以看看MeteoInfo网站(http://www.meteothink.org/),MeteoInfoLab和Python的科学计算、可视化类似,也是适合批量数据分析、绘图的。Java或者Python都是自动管理内存和垃圾回收,重度需要资源的语句尽量不要放在循环中可以减轻内存的增加。比如figure, axes的创建都可以放在循环外只创建一次,如果有地图数据也可以放在循环外只加载一次,具体的绘图内容在循环中处理( ...
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2023-6-25 13:34:34 | 显示全部楼层
毕业两年的小白 发表于 2023-7-3 07:49
嗯嗯,谢谢您的建议,我下载了meteoinfo的用户手册看了一下,meteoinfo在绘单张图方面确实优秀,但是不太 ...

你说的MeteoInfo用户手册可能是很久之前的,比较新的资料可以看看MeteoInfo网站(http://www.meteothink.org/),MeteoInfoLab和Python的科学计算、可视化类似,也是适合批量数据分析、绘图的。Java或者Python都是自动管理内存和垃圾回收,重度需要资源的语句尽量不要放在循环中可以减轻内存的增加。比如figure, axes的创建都可以放在循环外只创建一次,如果有地图数据也可以放在循环外只加载一次,具体的绘图内容在循环中处理(绘制当前时次内容前把之前的绘制内容删除),MeteoInfoLab中可以用 cll() 函数删除Axes中最后添加的图形对象,Matplotlib里对应的函数我也不太清楚。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-25 14:08:35 | 显示全部楼层
python 多进程
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-25 17:41:00 来自手机 | 显示全部楼层
安达充 发表于 2023-6-25 14:08
python 多进程

python多进程可以解决速度慢的问题,但没解决内存回收不及时的问题。
我的代码这么实现的:
创建fig画布
for 循环
    循环内创建ax
    在ax上绘制
    保存
    删除ax(ax.remove)
    清空画布(fig.clf)
循环结束,关闭画布(fig.close)

这个循环体两次清空操作都没及时回收内存,增加gc.collect效果也很差

传了两幅图,一幅是CPU的,画图的时候基本能撑满CPU,说明多线程是有效果的。另一副是内存占用,可以看到在线性增长,直到oom

请问有更优化的办法不?
Screenshot_20230625_173558_com.tencent.mm_edit_947162148116133.jpg
Screenshot_20230625_173621.jpg
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-25 17:53:45 | 显示全部楼层
毕业两年的小白 发表于 2023-6-25 17:41
python多进程可以解决速度慢的问题,但没解决内存回收不及时的问题。
我的代码这么实现的:
创建fig画 ...

前几天我也遇到linux内存的问题,几个主要的程序内存使用的uesd并不多但是主要是buffers和cached会一直堆加,需要手动释放.不知道有没有帮助:http://bbs.06climate.com/home.ph ... 087&do=blog&id=7071
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-25 19:57:26 来自手机 | 显示全部楼层
一大碗年糕 发表于 2023-6-25 17:53
前几天我也遇到linux内存的问题,几个主要的程序内存使用的uesd并不多但是主要是buffers和cached会一直堆 ...

嗯,我去试一下
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 09:15:13 | 显示全部楼层
python内存泄漏这个问题我也没有解决过 ,蹲个大神
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 09:16:29 | 显示全部楼层
毕业两年的小白 发表于 2023-6-25 17:41
python多进程可以解决速度慢的问题,但没解决内存回收不及时的问题。
我的代码这么实现的:
创建fig画 ...

不知道楼主画了几张图、每张图数据量是多大,我用python是这么循环的

for 循环
    创建fig画布
    循环内创建ax
    在ax上绘制
    保存
    删除ax(ax.remove)
    清空画布(fig.clf)
    关闭画布(fig.close)
循环结束

我画了一千多张,每张数据量大概是几百万到一两千万个样本,没有出现任何报错
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2023-6-26 09:18:56 | 显示全部楼层
不过你可以试试手动回收一下内存,看下有没有改善
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-6-26 17:53:47 来自手机 | 显示全部楼层
MyOpenGFM 发表于 2023-6-26 09:16
不知道楼主画了几张图、每张图数据量是多大,我用python是这么循环的

for 循环

你的方法和我第一代方法一样的,我这边是全中国0.4度的格点,水平密度大约是180x150格点,每个格点根据情况会叠加2-4个要素(比如等高线和风羽叠加),图片总数大概300多张。
我的的机器内存空闲状态下只有只有2.5G,所以内存占用的问题就很要命,您的机器内存应该很大吧
另外有个小建议,把创建fig放在循环外,循环内只操作ax和清空fig,循环结束后再关闭fig,速度会更快(我的机器时间能节约2/3)
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表