Sto provando a lavorare con dati da file netCDF molto grandi (~ 400 GB ciascuno). Ogni file ha alcune variabili, tutte molto più grandi della memoria di sistema (ad esempio 180 Gb vs 32 Gb RAM). Sto cercando di usare numpy e netCDF4-python per fare alcune operazioni su queste variabili copiando una slice alla volta e operando su quella slice. Sfortunatamente, ci vuole molto tempo solo per leggere ogni sezione, che sta uccidendo la performance.Gestione di file netCDF molto grandi in python
Ad esempio, una delle variabili è una matrice di forma (500, 500, 450, 300)
. Voglio operare sulla fetta [:,:,0]
, così faccio la seguente:
import netCDF4 as nc
f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]
Ma l'ultimo passaggio richiede un tempo molto lungo (~ 5 min sul mio sistema). Se ad esempio ho salvato una variabile di forma (500, 500, 300)
nel file netcdf, un'operazione di lettura della stessa dimensione richiederà solo pochi secondi.
C'è un modo per accelerare? Un percorso ovvio sarebbe quello di trasporre la matrice in modo che gli indici che sto selezionando emergessero per primi. Ma in un file così grande non sarebbe possibile farlo in memoria, e sembra ancora più lento tentare, visto che un'operazione semplice richiede già molto tempo. Quello che mi piacerebbe è un modo rapido per leggere una porzione di un file netcdf, nel modo in cui la funzione get_vara dell'interfaccia di Fortran. O un modo per trasporre efficacemente la matrice.
Se vuoi fare di più con i dati che semplicemente trasponendoli, dai un'occhiata al modulo ['xarray'] (http://xarray.pydata.org/en/stable/): Fornisce un ottimo interfaccia a ['dask'] (http://dask.pydata.org/en/latest/) array di memoria esaurita. – j08lue