Je travaille sur du code qui boucle sur plusieurs fichiers netcdf (gros ~ 28G). Les fichiers netcdf ont plusieurs variables 4D [heure, est-ouest, sud-nord, hauteur] dans un domaine. L'objectif est de faire une boucle sur ces fichiers et de faire une boucle sur chaque emplacement de toutes ces variables dans le domaine et de tirer certaines variables pour les stocker dans un grand tableau. Quand il y a des fichiers manquants ou incomplets, je remplis les valeurs avec 99.99. À l'heure actuelle, je ne fais que tester en bouclant plus de 2 fichiers netcdf par jour, mais pour une raison quelconque, cela prend une éternité (~ 14 heures). Je ne suis pas sûr s'il y a un moyen d'optimiser ce code. Je ne pense pas que python devrait prendre autant de temps pour cette tâche, mais c'est peut-être un problème avec python ou mon code. Ci-dessous mon code nous espérons qu'il est lisible et des suggestions sur la façon de faire cela plus rapidement est grandement appréciée:Comment rendre mon code python plus rapide
#Domain to loop over
k_space = np.arange(0,37)
j_space = np.arange(80,170)
i_space = np.arange(200,307)
predictors_wrf=[]
names_wrf=[]
counter = 0
cdate = start_date
while cdate <= end_date:
if cdate.month not in month_keep:
cdate+=inc
continue
yy = cdate.strftime('%Y')
mm = cdate.strftime('%m')
dd = cdate.strftime('%d')
filename = wrf_path+'\wrfoutRED_d01_'+yy+'-'+mm+'-'+dd+'_'+hour_str+'_00_00'
for i in i_space:
for j in j_space:
for k in k_space:
if os.path.isfile(filename):
f = nc.Dataset(filename,'r')
times = f.variables['Times'][1:]
num_lines = times.shape[0]
if num_lines == 144:
u = f.variables['U'][1:,k,j,i]
v = f.variables['V'][1:,k,j,i]
wspd = np.sqrt(u**2.+v**2.)
w = f.variables['W'][1:,k,j,i]
p = f.variables['P'][1:,k,j,i]
t = f.variables['T'][1:,k,j,i]
if num_lines < 144:
print "partial files for WRF: "+ filename
u = np.ones((144,))*99.99
v = np.ones((144,))*99.99
wspd = np.ones((144,))*99.99
w = np.ones((144,))*99.99
p = np.ones((144,))*99.99
t = np.ones((144,))*99.99
else:
u = np.ones((144,))*99.99
v = np.ones((144,))*99.99
wspd = np.ones((144,))*99.99
w = np.ones((144,))*99.99
p = np.ones((144,))*99.99
t = np.ones((144,))*99.99
counter=counter+1
predictors_wrf.append(u)
predictors_wrf.append(v)
predictors_wrf.append(wspd)
predictors_wrf.append(w)
predictors_wrf.append(p)
predictors_wrf.append(t)
u_names = 'u_'+str(k)+'_'+str(j)+'_'+str(i)
v_names = 'v_'+str(k)+'_'+str(j)+'_'+str(i)
wspd_names = 'wspd_'+str(k)+'_'+str(j)+'_'+str(i)
w_names = 'w_'+str(k)+'_'+str(j)+'_'+str(i)
p_names = 'p_'+str(k)+'_'+str(j)+'_'+str(i)
t_names = 't_'+str(k)+'_'+str(j)+'_'+str(i)
names_wrf.append(u_names)
names_wrf.append(v_names)
names_wrf.append(wspd_names)
names_wrf.append(w_names)
names_wrf.append(p_names)
names_wrf.append(t_names)
cdate+=inc
Vous pouvez utiliser le multitraitement pour traiter les fichiers en même temps. arrangez les espaces k, j, i pour les différents processus et laissez chacun d'eux faire sa propre tâche – haifzhan
Qu'est-ce que 'nc.Dataset'? De plus, avant de pouvoir * améliorer * la vitesse, vous devez savoir pourquoi il est lent. Vous aurez besoin de profiler votre code et * mesure *. –
c'est comment je lis dans les fichiers netcdf avec python J'ai une déclaration plus tôt dans le code non montré ici: import netCDF4 comme nc – HM14