2017-04-20 1 views
1

La fonction de mon code python est très simple. Il lit le fichier netCDF dans une liste de fichiers et renvoie la valeur moyenne dans ce cas.Comment puis-je accélérer mon code Python par multiprocessing (traitement parallèle)?

Cependant, lire le fichier netCDF prend du temps. Je me demande si je peux accélérer ce processus par Multiprocessing (traitement parallèle) puisque mon poste de travail a des processeurs 32-core.

Le code ressemble à:

from netCDF4 import Dataset 

for i in filerange: 
    print "Reading the",i, "file", "Wait" 
    infile_Radar = Dataset(file_list[i],'r') 

    # Read the hourly Data 
    Radar_rain=np.array(infile_Radar.variables['rain'][:]) 

    for h in range(0,24): 
     hourly_rain = Radar_rain[h,:] 
     hourly_mean[i,h] = np.mean(hourly_rain) 

np.savetxt('Hourly_Spatial_mean.txt', hourly_mean, delimiter='\t') 

Depuis le fichier de lecture est independet à l'autre, alors comment peut tirer le meilleur parti de mon poste de travail? Merci.

+0

L'enfilage, plutôt que le multitraitement, semble plus approprié pour une tâche liée à l'E/S. –

+0

Il existe plusieurs façons de distribuer le processus, mais vous devez vous assurer que la sortie ne se remplace pas. – mootmoot

+0

Je ne vois pas où vous lisez les fichiers. Vous pouvez obtenir une certaine amélioration en chevauchant des lectures sur un flux avec un autre en cours de traitement, mais cette mise à l'échelle ne va que très loin. – tdelaney

Répondre

0

Il semble que vous recherchiez une implémentation de threads assez standard. En supposant que c'est le constructeur DataSet est la partie de blocage, vous voudrez peut-être faire quelque chose comme ceci:

from threading import Thread 

def CreateDataset(offset, files, datasets): 
    datasets[offset] = Dataset(files[i], 'r') 


threads = [None] * len(filerange) 
data_sets = [None] * len(filerange) 

for i in filerange: 
    threads[i] = Thread(None, CreateDataset, None, (i, file_list, data_sets)) 
    threads[i].start(); 

for t in threads: 
    t.join() 

# Resume work with each item in the data_sets list 
print "All Done"; 

Ensuite, pour chaque ensemble de données faire le reste du travail que vous détaillé. Partout où le "slow stuff" réel est, c'est l'approche de base.