1

저는 파이썬에 매우 익숙합니다. 나는 다음과 같은 기능을 사용하여 비 탱크에서 간단한 물 균형을 시뮬레이션해야합니다다중 처리 또는 다중 기능 내 기능, 어떻게?

def rain_tank_model(rain, water_demand,roof_area, tank_size, household_name): 

    # rain and water_demand time series are numpy arrays with over than 8 million recordings. 
    # each houshold has installed a rain tank with a specific size 

    v = [] # water volume in tanks 
    spill = [] # amount of water spills from rain tank 
    unmet_demand = [] # amount of unmet water demand 
    volume = 0.0 # stored volume at the start of the simulation 
    for i in range(len(rain)): 
     volume += rain[i] * roof_area - water_demand[i] 
     if volume < 0. : #volume cannot be negative 
      unmet_demand.append(volume * -1) 
      volume = 0 
      v.append(volume) 
      spill.append(0.) 
     if volume > tank_size: #water should spill from the tank 
      spill.append(volume - tank_size) 
      volume = tank_size 
      v.append(volume) 
      unmet_demand.append(0.) 
     else: 
      spill.append(0.) 
      v.append(volume) 
      unmet_demand.append(0.) 

    file = open(str(household_name)+".txt", 'w') 
    for i in range(len(v)): 
     line =str(v[i])+"\t"+str(spill[i])+"\t"+str(unmet_demand[i])+"\n" 
     file.write(line) 
    file.close() 

내가 각 50,000 주택에 대해이 기능을 실행하는 데 필요한 특정 비 탱크 크기, 지붕 면적과 물 수요 시간 시리즈가있다. 함수를 루프에 넣고 집을 반복하여이 작업을 수행 할 수 있습니다. 각 시뮬레이션은 완전히 독립적이기 때문에 (단지 동일한 입력 레인 배열에 액세스 할 필요가 있음), 시뮬레이션 속도를 높이기 위해 파이썬에서 멀티 스레딩 또는 멀티 프로세싱을 사용할 수 있을지도 모른다고 생각했습니다. 나는 그들 사이의 차이점에 관해 읽었지 만 어느 것을 사용해야하는지 알 수 없었다.

비가 시린 배열을 입력으로 만 사용하는 단순화 된 버전의 병렬 처리를 시도했습니다 (탱크 크기와 지붕 면적이 각 집과 물 수요가 동일하다고 가정). 항상 상수입니다. 단순화하는 이유는 여러 인수를 입력하는 방법을 이해할 수 없다는 것입니다. 시뮬레이션 할 주택 20 개가 있습니다. 루프 처리 방법이 다중 처리 방법보다 훨씬 빠릅니다. 다른 수의 풀을 2에서 20 . 관리 옵션을 사용하여 프로세스간에 비 데이터를 공유하려고했지만 성공하지 못했습니다. 많이 읽었지만 이해하기가 어려웠습니다. 함수 또는 유사한 참조를 병렬로 만드는 방법에 대한 힌트를 얻으실 수 있습니다. 예 :

답변

0

짧은 대답은 다음과 같습니다 :

함수가 CPU 바인딩 인 경우 - IO 바인딩 인 경우 멀티 스레딩을 사용하면 멀티 프로세싱을 사용합니다.

조금 더 대답 :

파이썬, GIL라는 좋은 기능이이 잠금 장치는 큰 제한을 제공합니다 : 하나의 파일 시간이 한 순간에 하나 개의 스레드에 의해 해석 될 수있다. 따라서 계산이 많은 경우 멀티 스레딩은 병렬 실행처럼 보이지만 실제로는 특정 순간에만 하나의 스레드 만 활성화됩니다.

결과적으로 멀티 스레드는 데이터 다운로드와 같은 IO 바운드 작업에 적합합니다. 다운로드를 기다리지 않고 하나의 스레드에서 다운로드하고 다른 작업을 수행하도록 파일을 설정할 수 있습니다.

병렬 계산을 수행하려면 다중 처리를 사용하는 것이 좋습니다. 각 프로세스에는 자체 RAM이 있습니다 (다중 스레드 RAM에서는 스레드간에 공유 됨). https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes :

UPD

는 프로세스 간의 공유 메모리, 당신이 여기에서 찾을 수 있습니다 더 많은 정보를 가지고하는 방법이 있습니다.

+0

내 기능이 어떤 것인지 쉽게 알 수있는 방법이 있습니까? –

+0

내가 볼 수 있듯이 파일 다운로드/업로드/등등과 같은 IO 작업을 수행하지 않습니다. 그래서 다중 처리와 함께 갈 것입니다. – vovaminiof

+0

이제 귀하의 설명을 이해합니다. 당신이 친절하게 제공 한 더 긴 대답에 따르면, 각 프로세스는 자체 RAM을 가지고 있습니다. 이것은 모든 프로세스가 입력 데이터의 자체 복사본을 생성한다는 것을 의미합니까? 그렇다면 글로벌 매개 변수와 같은 입력 데이터를 공유 할 수 있습니까? –