2017-04-20 5 views
1

내 파이썬 코드의 기능은 매우 간단합니다. 파일 목록을 통해 netCDF 파일을 읽고이 경우 평균값을 반환합니다.다중 처리 (병렬 처리)를 통해 파이썬 코드의 속도를 높이려면 어떻게해야합니까?

그러나 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

파일을 읽는 위치가 표시되지 않습니다. 하나의 스트림에서 다른 스트림을 처리하면서 읽기를 겹쳐서 약간의 향상을 얻을 수 있지만, 그 스케일 업은 지금까지만 진행됩니다. – 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"; 

를 그런 다음 각 데이터 집합하면 자세한 나머지 작업을한다. 실제 "느린 물건"이 어디에 있든, 그것은 기본 접근 방식입니다.

관련 문제