Estoy tratando de trabajar con datos de archivos netCDF muy grandes (~ 400 Gb cada uno). Cada archivo tiene algunas variables, todas mucho más grandes que la memoria del sistema (por ejemplo, 180 Gb frente a 32 Gb de RAM). Estoy tratando de usar numpy y netCDF4-python hacer algunas operaciones en estas variables copiando un segmento a la vez y operando en ese segmento. Desafortunadamente, está tomando mucho tiempo leer cada porción, lo que está acabando con el rendimiento.Manejo de archivos netCDF muy grandes en python
Por ejemplo, una de las variables es una matriz de forma (500, 500, 450, 300)
. Quiero operar en el segmento de [:,:,0]
, así que hacer lo siguiente:
import netCDF4 as nc
f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]
Pero el último paso lleva un tiempo muy largo (~ 5 min en mi sistema). Si, por ejemplo, guardé una variable de forma (500, 500, 300)
en el archivo netcdf, entonces una operación de lectura del mismo tamaño tomará solo unos segundos.
¿Hay alguna manera de acelerar esto? Una ruta obvia sería transponer la matriz de modo que los índices que estoy seleccionando salgan primero. Pero en un archivo tan grande no sería posible hacerlo en la memoria, y parece incluso más lento intentarlo dado que una operación simple ya lleva mucho tiempo. Lo que me gustaría es una forma rápida de leer una porción de un archivo netcdf, a la manera de la función get_vara de la interfaz de Fortran. O alguna forma de transposición eficiente de la matriz.
Si desea hacer más con los datos que simplemente transponerlo, eche un vistazo al módulo ['xarray'] (http://xarray.pydata.org/en/stable/): Proporciona un muy buen interfaz a ['dask'] (http://dask.pydata.org/en/latest/) matrices fuera de memoria. – j08lue