爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 469|回复: 9

[求助] CDO处理数据太慢了怎么解决

[复制链接]

新浪微博达人勋

发表于 2024-10-12 19:31:24 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
最近在用cdo批量处理数据,我个人现在觉得有两种方法,一是用python-cdo库用python 循环,二是写shell脚本循环。 但我发现一个问题,我想把一堆nc数据提取一层高度层和一定区域然后合并,mergetime不能和sellevel,850  -sellonlatbox,110,130,25,40一起用,导致先用sellevel,850  -sellonlatbox,110,130,25,40提取会生成一大堆中间文件,我不清楚是不是因为这个导致cdo处理起来很慢,总共1000多个4G多的nc数据处理成每个600kb的数据,从中午一直到晚上8点还没处理好,这正常吗?

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2024-10-14 14:34:08 | 显示全部楼层
Lancelot 发表于 2024-10-13 20:05
可能只是处理机器速度不够的问题,如果是那样就真的没辙了。如果在大型机,或许可以多用几个核(任务)、 ...

今天又折腾了一下,发现是自己太蠢了。。cdo执行指令是从右到左的,我以为是从左到右的应该是先执行sellevel再sellonlatbox。我搞反了,换了位置速度快了几倍。   大概是因为先挑层数比先截经纬度更快,挑完层数再截经纬度数据少了后一步也变快了
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2024-10-13 13:54:35 | 显示全部楼层
tangyp 发表于 2024-10-13 13:31
#!/bin/bash
# 定义经纬度范围和气压层
lon_min=110

可以了,你这里已经有并行了。再优化也提高不了太多速度
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2024-10-12 20:10:26 | 显示全部楼层
正常
后面一步如果内存需求不高,可以并行处理
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-10-12 21:21:00 | 显示全部楼层
Lancelot 发表于 2024-10-12 20:10
正常
后面一步如果内存需求不高,可以并行处理

请问一下具体应该怎么操作呢,对这块不是很懂
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-10-13 12:41:34 | 显示全部楼层
tangyp 发表于 2024-10-12 21:21
请问一下具体应该怎么操作呢,对这块不是很懂

写多个脚本同时运行。特别是sel这一步
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-10-13 13:31:24 | 显示全部楼层
Lancelot 发表于 2024-10-13 12:41
写多个脚本同时运行。特别是sel这一步

#!/bin/bash
# 定义经纬度范围和气压层
lon_min=110
lon_max=130
lat_min=25
lat_max=40
pressure_level=850  # 850 hPa = 85000 Pa
# 设置输入文件前缀和输出目录
input_prefix="era5_daily_q_"
output_prefix="processed_"
final_output="era5_daily_q850_194001-202406.nc"
# 处理每个以 era5_daily_q_ 开头的文件
for file in ${input_prefix}* ; do
    # 设置输出文件名
    output_file="${output_prefix}${file}"

    # 打印处理信息
    echo "Processing file: $file -> $output_file"

    # 提取850 hPa和经纬度范围
    cdo -S -L sellevel,${pressure_level} -sellonlatbox,${lon_min},${lon_max},${lat_min},${lat_max} $file $output_file &
    if (( $(jobs -r -p | wc -l) >= 8 )); then  # 检查当前运行的后台任务数量
        wait  # 等待后台任务完成
    fi
done
# 合并所有处理后的文件
echo "Merging all processed files into $final_output"
cdo mergetime ${output_prefix}*  ${final_output}
# rm -rf ${output_prefix}*

# 打印完成信息
echo "Processing complete! Output saved to $final_output"        我是这样写的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-10-13 19:09:11 | 显示全部楼层
Lancelot 发表于 2024-10-13 13:54
可以了,你这里已经有并行了。再优化也提高不了太多速度

好的谢谢,虽然我感觉并没有快,太难了。。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-10-13 20:05:30 | 显示全部楼层
tangyp 发表于 2024-10-13 19:09
好的谢谢,虽然我感觉并没有快,太难了。。

可能只是处理机器速度不够的问题,如果是那样就真的没辙了。如果在大型机,或许可以多用几个核(任务)、节点。但要监控一下内存使用
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-10-14 14:42:34 | 显示全部楼层
tangyp 发表于 2024-10-14 14:34
今天又折腾了一下,发现是自己太蠢了。。cdo执行指令是从右到左的,我以为是从左到右的应该是先执行selle ...

确实,这是个可以优化的点
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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