저는 파이썬에 매우 익숙합니다. 나는 다음과 같은 기능을 사용하여 비 탱크에서 간단한 물 균형을 시뮬레이션해야합니다다중 처리 또는 다중 기능 내 기능, 어떻게?
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 . 관리 옵션을 사용하여 프로세스간에 비 데이터를 공유하려고했지만 성공하지 못했습니다. 많이 읽었지만 이해하기가 어려웠습니다. 함수 또는 유사한 참조를 병렬로 만드는 방법에 대한 힌트를 얻으실 수 있습니다. 예 :
내 기능이 어떤 것인지 쉽게 알 수있는 방법이 있습니까? –
내가 볼 수 있듯이 파일 다운로드/업로드/등등과 같은 IO 작업을 수행하지 않습니다. 그래서 다중 처리와 함께 갈 것입니다. – vovaminiof
이제 귀하의 설명을 이해합니다. 당신이 친절하게 제공 한 더 긴 대답에 따르면, 각 프로세스는 자체 RAM을 가지고 있습니다. 이것은 모든 프로세스가 입력 데이터의 자체 복사본을 생성한다는 것을 의미합니까? 그렇다면 글로벌 매개 변수와 같은 입력 데이터를 공유 할 수 있습니까? –