
1、前言
CMIP6数据在气象科研工作中经常被使用,下载方式主要是从官网上检索对应的模式后,通过wget下载。这种方式有一个弊端,即当所需下载的模式数量很多时,需先下载多个wget文件,然后再依次执行下载命令,这种方式需要占用大量的时间和精力,特别费眼睛,而且效率很低。为了解决这个问题,向大家介绍一种python自动化下载CMIP6数据的方式,下载完成后仅需要花费一些时间核对一下结果。 该方法的思路分为两个步骤:第一,先从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 timefileList = sorted(glob.glob('../wget_ssp/*.sh'))i = 0nc_data_urls = []for fname in fileList: print('==================================================') print(fname) with open(fname, 'r') as f: for line in f: line = line.strip() if 'sfcWind_' in line and ('https://' in line or 'http://' in line) and '.nc' in line and 'SHA256' in line: i = i + 1 substrings = line.split(' ') print(substrings[1][1:-1]) nc_data_urls.append(substrings[1][1:-1])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() print( "Sub-process(es) done.")
3、后记
在实际使用和结果核对阶段发现,ippool并行数量越多,最后缺失的nc数据可能也就越多,不管下载多少次,似乎都不能做到一次性100%的完整下载,比如下载2000+个nc文件,最后总是缺少一点,最后通过降低ippool并行数量和sleep延时,提高下载成功率,因此建议ippool低于10个,甚至可能3、5个就够了,并且适当增加请求间的延时。究其原因,猜测可能跟CMIP6数据服务器的性能有些关系,同一个ip一次性并发下载过多nc文件,服务器无法响应所有请求。
声明:欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7576)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。