2017-04-20 4 views
1

私のPythonコードの機能は非常に簡単です。 netCDFファイルをファイルリストから読み込み、この場合の平均値を返します。マルチプロセッシング(並列処理)でPythonコードをスピードアップするにはどうすればよいですか?

ただし、netCDFファイルを読むには時間がかかります。私のワークステーションには32コアのプロセッサがあるので、マルチプロセッシング(並列処理)でこのプロセスをスピードアップできるかどうか疑問に思っています。読み取りファイルがお互いにindependetですので、どのように私のワークステーションを最大限に活用することができますので

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') 

コードは次のようになりますか?ありがとう。

+0

マルチスレッドではなくスレッディングは、IOバウンドタスクの方が適切です。 –

+0

プロセスを配布する方法はたくさんありますが、出力が互いに上書きされないようにする必要があります。 – mootmoot

+0

ファイルを読む場所がわかりません。 1つのストリームの読み込みを別のストリームの処理と重複させることでいくらかの改善を得ることができますが、そのスケールアップはこれまでのところしかありません。 – tdelaney

答えて

0

かなり標準的なスレッド実装を探しているようです。それはあなたがこのような何かをしたい場合があり閉塞部のデータセットのコンストラクタだと仮定すると:

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"; 

次に、各データセットにすることで、詳細な作業の残りを行います。実際の「遅いもの」がどこにあっても、それは基本的なアプローチです。

関連する問題