新版ERA5下載多線(xiàn)程加速楞抡,看這一篇就行了

ERA5下載加速

引言

眾所周知,ERA5小時(shí)尺度以及日尺度數(shù)據(jù)下載比較困難析藕,一方面是由于數(shù)據(jù)中心在歐洲召廷,傳輸速度慢。另一方面也是由于數(shù)據(jù)量龐大账胧。

目前批量下載的代碼有很多竞慢,但是存在以下問(wèn)題:

  • 速度慢,幾十到幾百kb
  • 下載容易中斷治泥,生成無(wú)效文件
  • 單一線(xiàn)程筹煮,提交任務(wù)然后等待,速度慢
  • 中斷下載后车摄,重新提交很麻煩寺谤,先找到中斷的位置

目前ECMWF數(shù)據(jù)進(jìn)行了一些更新仑鸥,界面更新。

image-20241018190725470

且新增了daily數(shù)據(jù)变屁,和Google Earth Engine也一致了眼俊,變量更全。

借此機(jī)會(huì)講述一下流程

預(yù)備工作

首先需要安裝ECMWF提供的Python庫(kù)

pip install cdsapi

接下來(lái)注冊(cè)ECMWF賬號(hào)粟关,在這里注冊(cè)Climate Data Store (copernicus.eu)

然后打開(kāi):

https://cds.climate.copernicus.eu/how-to-api

就能看到url和key

image-20241018194210936

配置文件疮胖,C:\Users\user_name\下應(yīng)該是沒(méi)有.cdsapi配置文件的,需要自己手動(dòng)創(chuàng)一個(gè):可以打開(kāi)記事本闷板,然后復(fù)制澎灸、粘貼、保存遮晚,文件名為.cdsapi性昭,內(nèi)容如下圖注意保存類(lèi)型選擇所有文件

image-20241018194322681

代碼

這里直接放代碼,使用queue來(lái)多線(xiàn)程提速县遣,同時(shí)處理4個(gè)任務(wù)

import cdsapi
import os
import calendar
import netCDF4 as nc
import threading
from queue import Queue
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
# 創(chuàng)建一個(gè)函數(shù)來(lái)構(gòu)建下載請(qǐng)求
def download_era5_data(year, month, day, download_dir):
    dataset = "derived-era5-pressure-levels-daily-statistics"
    request = {
        "product_type": "reanalysis",
        "variable": ["geopotential"],
        "year": year,
        "month": [month],
        "day": [day],
        "pressure_level": [
            "300", "500", "700",
            "850"
        ],
        "daily_statistic": "daily_mean",
        "time_zone": "utc+00:00",
        "frequency": "6_hourly"
    }

    # 定義文件名格式為 年月日.nc糜颠,并設(shè)置下載路徑
    filename = f"ERA5_{year}{month}{day}.nc"
    filepath = os.path.join(download_dir, filename)

    print(f"Checking if file {filename} exists and is complete...")
    # 檢查文件是否已存在,且文件完整
    if os.path.exists(filepath):
        try:
            # 嘗試打開(kāi)文件以驗(yàn)證其完整性
            with nc.Dataset(filepath, 'r') as ds:
                print(f"File {filename} is complete and valid.")
        except OSError as e:
            # 如果文件不完整或損壞萧求,刪除并重新下載
            print(f"File {filename} is corrupted. Redownloading...")
            os.remove(filepath)
            download_file_from_era5(request, filepath)
    else:
        # 如果文件不存在其兴,則直接下載
        print(f"File {filename} does not exist. Starting download...")
        download_file_from_era5(request, filepath)

# 創(chuàng)建一個(gè)函數(shù)來(lái)執(zhí)行實(shí)際下載
def download_file_from_era5(request, filepath):
    print(f"Downloading data to {filepath}...")
    client = cdsapi.Client()
    client.retrieve("derived-era5-pressure-levels-daily-statistics", request).download(filepath)
    print(f"Download completed for {filepath}")

# 定義下載目錄
download_dir = r"F:\ERA5\surface\geopotential"

print(f"Checking if download directory {download_dir} exists...")
# 檢查目錄是否存在,不存在則創(chuàng)建
if not os.path.exists(download_dir):
    print(f"Directory {download_dir} does not exist. Creating directory...")
    os.makedirs(download_dir)
else:
    print(f"Directory {download_dir} already exists.")

# 定義下載任務(wù)隊(duì)列
queue = Queue()

# 創(chuàng)建一個(gè)下載工作線(xiàn)程類(lèi)
class DownloadWorker(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            year, month, day = self.queue.get()
            print(f"Worker {threading.current_thread().name} processing download for {year}-{month:02d}-{day:02d}...")
            try:
                # 將月份和日期格式化為兩位數(shù)
                month_str = f"{month:02d}"
                day_str = f"{day:02d}"
                download_era5_data(str(year), month_str, day_str, download_dir)
            except Exception as e:
                print(f"Error downloading data for {year}-{month_str}-{day_str}: {e}")
            finally:
                print(f"Worker {threading.current_thread().name} finished processing download for {year}-{month:02d}-{day:02d}.")
                self.queue.task_done()

# 創(chuàng)建四個(gè)工作線(xiàn)程
print("Creating worker threads...")
for x in range(4):
    worker = DownloadWorker(queue)
    worker.daemon = True
    worker.start()
    print(f"Worker thread {worker.name} started.")

# 循環(huán)遍歷2000到2023年夸政,將任務(wù)加入隊(duì)列
print("Adding download tasks to the queue...")
for year in range(2000, 2024):
    for month in range(1, 13):
        # 獲取當(dāng)前月份的最大天數(shù)
        _, max_day = calendar.monthrange(year, month)
        for day in range(1, max_day + 1):
            print(f"Adding task for {year}-{month:02d}-{day:02d} to the queue...")
            queue.put((year, month, day))

# 等待所有任務(wù)完成
print("Waiting for all tasks to complete...")
queue.join()
print("All download tasks completed.")

代碼需要修改datasetrequest

一般是先手動(dòng)預(yù)選擇需要下載的數(shù)據(jù)元旬,然后復(fù)制API提供的內(nèi)容并替換:

image-20241018194955738

然后替換路徑即可

這里是每天下載一個(gè)文件,也可以按照你的需求更改循環(huán)代碼

代碼有幾個(gè)優(yōu)點(diǎn)守问,可以說(shuō)得上是ERA5下載的終極版了:

  • 中斷下載可以反復(fù)運(yùn)行匀归,補(bǔ)充未下載的內(nèi)容

  • 可以按照循環(huán)內(nèi)所有的文件,檢測(cè)下載中斷的文件酪碘,并重新下載

  • 四線(xiàn)程提速

  • 無(wú)需借助任何輔助下載軟件

下載提速

一般來(lái)說(shuō)下載速度還是比較快的朋譬,大多數(shù)在幾M/s,偶爾也會(huì)幾百k/s

這里采用氣象家園-kermit 提供的方法兴垦。

找到下載的cdsapi庫(kù)的安裝目錄徙赢,打開(kāi)目錄下的api.py,一般可以在conda環(huán)境中找到

搜索這段代碼:

def _download(self, url, size, target): 

在這段代碼中添加下面一行代碼探越,然后保存

url=url.replace(".copernicus-climate.eu",".nuist.love")

這個(gè)url是他做的鏡像網(wǎng)站狡赐,在一些情況下可以加速。

本文由mdnice多平臺(tái)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钦幔,一起剝皮案震驚了整個(gè)濱河市枕屉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲤氢,老刑警劉巖搀擂,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西潘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哨颂,警方通過(guò)查閱死者的電腦和手機(jī)喷市,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)威恼,“玉大人品姓,你說(shuō)我怎么就攤上這事◇锎耄” “怎么了腹备?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)斤蔓。 經(jīng)常有香客問(wèn)我植酥,道長(zhǎng),這世上最難降的妖魔是什么附迷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任惧互,我火速辦了婚禮,結(jié)果婚禮上喇伯,老公的妹妹穿的比我還像新娘。我一直安慰自己拨与,他們只是感情好稻据,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著买喧,像睡著了一般捻悯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淤毛,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天今缚,我揣著相機(jī)與錄音,去河邊找鬼低淡。 笑死姓言,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔗蹋。 我是一名探鬼主播何荚,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猪杭!你這毒婦竟也來(lái)了餐塘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤皂吮,失蹤者是張志新(化名)和其女友劉穎戒傻,沒(méi)想到半個(gè)月后税手,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡需纳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年冈止,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片候齿。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熙暴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慌盯,到底是詐尸還是另有隱情周霉,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布亚皂,位于F島的核電站俱箱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灭必。R本人自食惡果不足惜狞谱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禁漓。 院中可真熱鬧跟衅,春花似錦、人聲如沸播歼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秘狞。三九已至叭莫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烁试,已是汗流浹背雇初。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留减响,地道東北人靖诗。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辩蛋,于是被迫代替她去往敵國(guó)和親呻畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容