2014-06-14 2 views
3

tickers = ['AAPL','XOM','GOOG']과 같은 주식 시세 표시기가 있고 내 "전통적인"파이썬 프로그램에서이 tickers 벡터를 반복하면 AAPL과 같은 시세 표시 문자열을 선택하고 AAPL 주식을 포함하는 csv 파일을 가져옵니다. 리턴을 공용 함수에 대한 입력으로 사용하고 마지막으로 csv 파일을 출력으로 생성하십시오. 나는 4000 tickers 이상을 가지고 있고 각 ticker에 적용 할 함수는 처리하는데 시간이 걸린다. mpi4py 패키지로 컴퓨터 클러스터에 액세스하여 작업 당 약 100 개의 프로세서에 액세스 할 수 있습니다. 나는 잘 이해 (그리고 구현할 수 있었다) 파이썬에서이 mpiexample : mpi4py : dynammic 데이터 처리

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
size = comm.Get_size() 
rank = comm.Get_rank() 
if rank == 0: 
    data = [i for i in range(8)] 
# dividing data into chunks 
    chunks = [[] for _ in range(size)] 
    for i, chunk in enumerate(data): 
     chunks[i % size].append(chunk) 
else: 
    data = None 
    chunks = None 
data = comm.scatter(chunks, root=0) 
print str(rank) + ': ' + str(data) 

[[email protected]] ~/utils> mpirun -np 3 ./mpi.py 
2: [2, 5] 
0: [0, 3, 6] 
1: [1, 4, 7] 

그래서이 예제에서, 우리는 크기 8의 데이터 벡터가 각각의 프로세서 (총 3) 같은 수의 할당

데이터의 요소 비슷한 예제를 사용하고 각 프로세서에 하나의 주식 시세 표시기를 할당하고 각 시세 표시기에 대해 실행해야하는 기능을 적용하려면 어떻게해야합니까? 프로세서가 해제되면 파이썬에서 tickers 벡터로 돌아가서 아직 처리되지 않은 ticker을 처리하는 방법을 어떻게 알 수 있습니까?

답변

4

다른 생각이 있습니다. 4000 개의 청크를 처리하는 100 개의 프로세서가 있습니다. 당신이 이것을 볼 수있는 한 가지 방법은 각 프로세서가 작동 할 데이터 블록을 얻는 것입니다. 균등하게 분할되면 각 프로세서는 40 개의 티커를 처리합니다. 프로세서 1은 0-39, 프로세서 2는 40-79 등이됩니다.

이런 식으로 생각하면 프로세서가 작업을 마칠 때 어떤 일이 생기는지 걱정할 필요가 없습니다. 루프가 있습니다.

block_size = len(tickers)/size # this will be 40 in your example 
for i in range(block_size): 
    ticker = tickers[rank * block_size + i] 
    process(ticker) 

def process(ticker): 
    # load data 
    # process data 
    # output data 

의미가 있습니까? 당신은 자세한 내용을 원하는 경우

는 [편집]
,이 row-major order 색인에 정말 변화 메모리의 단일 차원에 저장된 다차원 데이터에 액세스하기위한 일반적인 방법입니다.

+1

귀하의 통찰력에 감사드립니다. 나는 너의 제안을 오늘 나중에 시험 할 것이다! 고맙습니다. – Plug4

+1

그럼이 모든 것을 바꿀 것입니다 : 'data = [i는 범위 내입니다 (8)] # 데이터를 청크로 나누기 chunk = [[범위 내에서] (크기)에 대해] for i, 열거 청크 (데이터) : 덩어리 [i % 크기] .append (덩어리) else : data = None 덩어리 = None'당신이 옳은 것이 무엇입니까? 그리고 프로세스 (.)는 시세를 처리하는 제 기능입니다. – Plug4

+0

그래, 나는'if ... else' 블록 전체를 제거하고 내가 가지고있는 블록으로 대체 할 것을 제안한다. 그런 다음 실제로이 작업을 수행하는'process' 함수를 구현하십시오. – Geoff