es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Xarray / Dask: Calcula la temperatura más alta para cada coordenada.

Tengo un archivo GRIB de 17 GB que contiene datos de temperatura (t2m) para cada hora del año 2020. Las dimensiones del conjunto de datos son longitude, latitude y time.

Mi objetivo es calcular la temperatura más alta para cada coordenada (lon, lat) en los datos durante todo el año. Puedo cargar el archivo correctamente utilizando Xarray, aunque lleva de 4 a 5 minutos:

import xarray as xr
xarray_dataset = xr.open_dataset('cds/2020_hourly_t2m.grib', engine='cfgrib')

Pero llamar a xarray.Dataset.max() hace que la sesión de Google Colab se bloquee. Probablemente esto se deba a que requiere más memoria de la disponible.

Por lo tanto, probablemente necesite usar Dask para cargar los datos en fragmentos y realizar cálculos en esos fragmentos y luego agregar los resultados. Soy nuevo en Dask y estoy teniendo dificultades para leer archivos de conjunto de datos climáticos utilizando las API de Dask.Array en fragmentos. He probado con dask.array.from_array( xarray_dataset.to_array() ) pero esto también bloquea la sesión.

Mi pregunta es: ¿cómo debo leer este archivo GRIB de 17GB en fragmentos utilizando Dask y calcular la temperatura máxima para todo el año para cada par lon, lat en el conjunto de datos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para leer el archivo GRIB de 17 GB en fragmentos utilizando Dask, puedes usar dask.delayed y la biblioteca dask_grib para cargar y fragmentar los datos. Aquí tienes los pasos que puedes seguir:

    1. Instala la biblioteca dask_grib:
    !pip install dask_grib
    
    1. Carga el archivo GRIB utilizando dask_grib:
    import dask_grib
    
    grib_file = "cds/2020_hourly_t2m.grib"
    chunks = "auto"    # puedes especificar el tamaño del fragmento aquí
    
    # crea una lista de objetos retrasados donde cada objeto representa la carga de un fragmento
    delayed_chunks = dask_grib.load_from_path(grib_file, chunks=chunks)
    
    1. Calcula la temperatura máxima utilizando Dask:
    import dask.array as da
    
    # utiliza `da.concatenate` para crear un array de Dask a partir de la lista de objetos retrasados
    dask_array = da.concatenate(delayed_chunks)
    
    # calcula la temperatura máxima para cada par lon,lat
    max_array = dask_array.max(axis=0)
    
    # guarda los resultados en memoria y cálcularlos
    result = max_array.persist().compute()
    

    El array resultante result contendrá la temperatura máxima para cada par lon,lat durante todo el año.

Comments are closed.