社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python气象数据处理与绘图:如何利用python批量下载CMIP6数据

气象学家 • 11 月前 • 337 次点击  

  第一时间获取气象科研资讯

气象学家公众号交流群

加入



1、前言

        CMIP6数据在气象科研工作中经常被使用,下载方式主要是从官网上检索对应的模式后,通过wget下载。这种方式有一个弊端,即当所需下载的模式数量很多时,需先下载多个wget文件,然后再依次执行下载命令,这种方式需要占用大量的时间和精力,特别费眼睛,而且效率很低。为了解决这个问题,向大家介绍一种python自动化下载CMIP6数据的方式,下载完成后仅需要花费一些时间核对一下结果。

2、批量下载数据

        该方法的思路分为两个步骤:第一,先从wget文件中获取下载链接地址(http或者https),并将其保存至list中;第二,利用python的wget库+多线程的方式,开启自动下载方式。

        第一步工作涉及的代码如下,其中wget即为本次使用的关键库第2、5、6行的包是并行处理需要使用库3、4行为本次处理文件需要的包相关代码功能请参考代码注释。

import wgetimport multiprocessingimport osimport globfrom multiprocessing import Poolimport multiprocessing as mpimport


    
 numpy as npimport time#获得所有的sh文件fileList =  sorted(glob.glob('../wget_ssp/*.sh'))#i用来统计总共有多少nc文件需要下载i = 0#nc_data_urls用来存储所有nc下载路径nc_data_urls = []#以下循环遍历所有sh文件,得到i和nc_data_urlsfor fname in fileList:    print('==================================================')    print(fname)    #这个循环    with open(fname, 'r') as f:  # Open file for read        for line in f:           # Read line-by-line            line = line.strip()  # Strip the leading/trailing whitespaces and newline            #判断和查找nc下载链接            if 'sfcWind_' in line and ('https://' in line or 'http://' in line)  and '.nc' in line and 'SHA256' in line:                #统计nc文件个数                i = i + 1                substrings = line.split(' ')                print(substrings[1][1:-1])                #将链接保存                nc_data_urls.append(substrings[1][1:-1])#最后将nc总数打印出来,以便核对print('*******************************************')print('*******************************************')print('all nc files number:',len(nc_data_urls))print('*******************************************')print('*******************************************')

        第二步工作涉及的代码如下,首先定义一个下载函数,然后使用并行下载方式下载数据,大大提升效率。其中第9行的延时,我认为是非常重要的,主要目的是为了防止终端向服务器发送太多wget请求,超出服务器最大响应性能,从而导致数据下载失败率过高。

def downloadNCFile(url):    print('++++++++++++++++++++')    print('start download file:',url)    fileName = wget.download(url)    print('download over:',fileName)
pool = Pool(processes = 5)for i in np.arange(0,len(nc_data_urls)): time.sleep(10) pool.apply_async(downloadNCFile, (nc_data_urls[i],))
print( "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print( "Sub-process(es) done.")

3、后记

在实际使用和结果核对阶段发现,ippool并行数量越多,最后缺失的nc数据可能也就越多,不管下载多少次,似乎都不能做到一次性100%的完整下载,比如下载2000+个nc文件,最后总是缺少一点,最后通过降低ippool并行数量和sleep延时,提高下载成功率,因此建议ippool低于10个,甚至可能3、5个就够了,并且适当增加请求间的延时。究其原因,猜测可能跟CMIP6数据服务器的性能有些关系,同一个ip一次性并发下载过多nc文件,服务器无法响应所有请求。






声明:欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7576)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。


往期推荐

 获取ERA5/ERA5-Land再分析数据(36TB/32TB)

 获取全球GPM降水数据,半小时/逐日(4TB)

 获取1998-2019 TRMM 3B42逐日降水数据

  获取最新版本CMIP6降尺度数据集30TB

 EC数据商店推出Python在线处理工具箱

★ EC打造实用气象Python工具Metview

★ 机器学习简介及在短临天气预警中的应用

★ Nature-地球系统科学领域的深度学习及理解

★ 灵魂拷问:ChatGPT对气象人的饭碗是福是祸?

★ 气象局是做啥的?气象局的薪水多少?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/165760
 
337 次点击