1、前言
CMIP6数据在气象科研工作中经常被使用,下载方式主要是从官网上检索对应的模式后,通过wget下载。这种方式有一个弊端,即当所需下载的模式数量很多时,需先下载多个wget文件,然后再依次执行下载命令,这种方式需要占用大量的时间和精力,特别费眼睛,而且效率很低。为了解决这个问题,向大家介绍一种python自动化下载CMIP6数据的方式,下载完成后仅需要花费一些时间核对一下结果。 该方法的思路分为两个步骤:第一,先从wget文件中获取下载链接地址(http或者https),并将其保存至list中;第二,利用python的wget库+多线程的方式,开启自动下载方式。
第一步工作涉及的代码如下,其中wget即为本次使用的关键库,第2、5、6行的包是并行处理需要使用库,第3、4行为本次处理文件需要的包。相关代码功能请参考代码注释。
import wget
import multiprocessing
import os
import glob
from multiprocessing import Pool
import multiprocessing as mp
import
numpy as np
import time
fileList = sorted(glob.glob('../wget_ssp/*.sh'))
i = 0
nc_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)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。