2011-09-18 4 views
4

나는 실행할 필요가있는 간단한 시뮬레이션을 많이 가지고 있으며, 동시에 수행 할 수 있는지 궁금합니다. 상황을 설명해 드리겠습니다 : 저는 100 개의 질병에 대해 1000 개의 유행병을 갖고 있으며, 20 개의 연령군에 대해 해당 질병에 대해 해당 장애가있는 무게를 1,000 개 (0-1 등급으로 질병이 얼마나 나쁜지) 보여줍니다. 내가해야 할 시뮬레이션은 얼마나 많은 사람들이 질병의 다른 조합을 가질 것인지를 결정하는 것입니다. 여기에 입력 데이터가 10 개 질병과 같을 것이다 것입니다 :파이썬에서의 동시 시뮬레이션

from __future__ import division 
import numpy as np 
disease_number = np.array([1,2,3,4]*10) 
age = np.array([5, 10, 15, 20]*10) 
prevalence = np.random.uniform(0, 1, (40, 1000)) 
disability_weight = np.random.uniform(0,1,(40, 1000)) 

5 세에 대한이 같은 무언가를 볼 것 하나 무승부의 시뮬레이션, 그리기 1.

다음
prev_draw1 = prevalence[age==5, 1] 
disability_draw1 = disability_weight[age==5, 1] 
simulation = np.random.binomial(1, prev_draw1, (100000, prev_draw1.shape[0]) 

를 계산하기 여러 질병의 합병증을 고려할 때 각 질병에 기인하는 장애 무게는 다음과 같습니다. 분모를 현재 장애가중치의 합으로 설정하고 주어진 질병의 장애 가중치를 분자로 사용하십시오. 질병 1 :

denom = np.sum(disability_draw1**simulaiton) 
denom[denom==1]=0 
numerator = disability_draw1*simulation[:, 0] 
adjusted_dw = np.sum(numerator/denom) 

각 질병에 대해이 조정 된 dw 계산이 필요합니다. 이 1000 가지 시뮬레이션을 동시에 수행 할 수있는 방법이 있습니까? 모든 도움을 주시면 감사하겠습니다. Python을 처음 접했을 때 더 많은 설명이 도움이됩니다.

답변

4

다중 프로세서/코어가있는 경우 멀티 프로세싱 모듈을 살펴볼 수 있습니다.

동시에 1000 개의 시뮬레이션을 실행하는 것은 약간 비싸지 만. 한 번에 코어 당 하나의 속도로 시뮬레이션을 실행해야합니다.

대기열 모듈을 사용하고 프로세스 풀에서 작업 할 수 있습니다.

여기 (테스트하지)가 같이 수 있는지의 미니 샘플입니다 :이 입력에 대한

from multiprocessing import Process, Queue 

def run_simulation(simulations, results): 
    while simulations.qsize() > 0: 
     simulation_params = simulations.get() 
     # run simulation 
     results.put(simulation_result) 
     simulations.task_done() 

if __name__ == '__main__': 
    simulations_to_run = Queue() 
    simulations_to_run.put({}) # simulation parameters go in this dict, add all simulations, one per line (could be done in a loop, with a list of dicts) 
    results = Queue() 
    for i in range(8): #number processes you want to run 
     p = Process(target=run_simulation, args=(simulations_to_run, results)) 
     p.start() 

    simulations_to_run.join() 
    # now, all results shoud be in the results Queue 

http://docs.python.org/library/multiprocessing.html

+0

정말 감사합니다. 불행히도 20 개의 지역, 30 개의 연령대, 2 개의 남녀에 대해 동일한 시뮬레이션을 수행해야합니다. 이것이 클러스터 시스템에서 전체 프로세스를 병렬화하는 방법입니다. – mike

+0

클러스터에서이 작업을 실행해야하는 경우 Beanstlkd와 같은 대기열 서버를 사용할 수 있습니다 (linux/unix의 경우). simulations_to_run에서 작업을 가져 오는 대신 대기열 서버에서 가져옵니다. 일단 작업이 실행되면 beanstalkd 서버의 다른 튜브에 넣을 수 있습니다. 이 코드는 대기열 서버를 사용하기 쉽게 적응해야합니다. 모든 서버에서이 스크립트를 실행해야합니다. – Martin